51单片机吗?这个不是很难!
硬件连接:P1.0接按键,P1.1接LED
org 0
ajmp start
org 30h
start:mov p1,#0ffh
main: mov a,p1
jnb p1.0,next
ajmp main
next: lcall dely
mov a,p1
jnb p1.0,huan
ajmp main
huan: cpl p1.1
ajmp main
dely: mov r7,#100
dl1: mov r6,#100
dl2: mov r5,#5
djnz r5,$
djnz r6,dl2
djnz r7,dl1
ret
end
B. 单片机 汇编语言编写 独立键盘 控制小灯
单片机的P1.0-P1.3接四个发光二极管L1-L4的阴极,P1.4-P1.7接四个开关K1-K4
程序:
ORG 00H
START: MOV A,P1
ANL A,#0F0H
RR A
RR A
RR A
RR A
ORl A,#0F0H
MOV P1,A
SJMP START
可以检测单个按键,也可以同时检测多个按键
过程:开始——读P1口数据到A——A中的数据右移4次——A中的内容和F0H相或——A中的数据送到P1口——回到开始
C. 请问单片机怎么用独立按键按一下实现一个功能,按另一个按键实现另一个功能 这个代码要怎么写啊
如果这两个功能都是一个死循环,可以考虑用中断,这样就不必在两个独立的功能中插入按键检测了
while(1)
{
while(flag==1){死循环1}
while(flag==2){死循环2}
}
如果这两个功能不是死循环,就 简单了
while(1)
{
if(key1==0) {延时消抖 功能1}
if(key2==0) {延时消抖 功能2}
}
D. 51单片机汇编语言编程独立按键
四个按键,定义如下:
KEY1 BIT P3.0
KEY2 BIT P3.1
KEY3 BIT P3.2
KEY4 BIT P3.3
按键处理程序:
;-----------------------------------
READ_KEY:
JB KEY1, K2
CALL DELAY
JB KEY1, K2
JNB KEY1, $
PUSH ACC
INC 75H
MOV A, 75H
CJNE A, #10, ZINT01
MOV 75H, #0
ZINT01:
POP ACC
JMP K_EXIT
;---------------
K2: JB KEY2, K3
CALL DELAY
JB KEY2, K3
JNB KEY2, $
PUSH ACC
INC 76H
MOV A, 76H
CJNE A, #10, ZINT01
MOV 76H, #0
ZINT01:
POP ACC
JMP K_EXIT
;---------------
K3: JB KEY3, K4
CALL DELAY
JB KEY3, K4
JNB KEY3, $
PUSH ACC
DEC 75H
MOV A, 75H
CJNE A, #255, ZINT03
MOV 75H, #9
ZINT03:
POP ACC
JMP K_EXIT
;---------------
K4: JB KEY4, K_EXIT
CALL DELAY
JB KEY4, K_EXIT
JNB KEY4, $
PUSH ACC
DEC 76H
MOV A, 76H
CJNE A, #255, ZINT04
MOV 76H, #9
ZINT04:
POP ACC
K_EXIT:
RET
;---------------
DELAY:
DJNZ R7, $
DJNZ R7, $
RET
;-----------------------------------
E. 求51单片机独立按键的代码。功能:类似设置电子表时间。见补充
void delay(unsigned char);
void main()
{
....;
}
/************IndependentButtons*************/
char Button(void)
{
unsigned char state1,a = 1,mt = 1;
P1 = 0xff;
state1 = P1;
state1 = ~ state1;
if(state1 != 0x00)
{
delay10ms(5);
do{
if(mt > 1)
dealy10ms(100);
delay10ms(50);
a ++;
mt ++;
}while(P1 != 0xff);
}
return a;
}
为相应的独立按键c代码(为8个独立按键,如果要4个独立按键可以在上面程序该的),其他的只要用main调用,在main里制表,就行了。
F. 我为51单片机设计了一个用独立按键控制LED的程序,求大神看看程序有没有什么能够优化的地方。
#include<reg51.h>
#include<intrins.h>
sbitk1=P3^1;
sbitk2=P3^0;
sbitk3=P3^2;
sbitk4=P3^3;
bitflag=0;
typedefunsignedcharu8;
typedefunsignedintu16;
#defineledP2
voiddelay(u16i)
{
while(i--);
}//延时函数
u8keyscan(void)
{
u8keyval=0;
if(k1==0)
{
while(k1==0);
keyval=1;
}
if(k2==0)
{
while(k2==0);
keyval=2;
}
if(k3==0)
{
while(k3==0);
keyval=3;
flag=~flag;
}
if(k4==0)
{
while(k4==0);
keyval=4;
}
return(keyval);
}
main()
{
u8key1,key2,num=0;
u8led[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
while(1)
{
key1=keyscan();
if(key1!=0)key2=key1;
switch(key2)
{
case1:P0=led[num];delay(10000);P0=0xff;delay(10000);num++;num%=8;break;
case2:P0=led[num];delay(10000);P0=0xff;delay(10000);num--;if(num==0)num=7;break;
case3:if(flag)P0=led[num];elseP0=0xff;break;
case4:P0=led[num];while((key1=keyscan())!=4);P0=0xff;key1=key2=0;num=0;break;
default:break;
}
}
}
G. 51单片机独立式按键程序
#include<reg52.h>
unsignedcharID;
sbitk1=P3^7;//定义按键端口
voiddelay()
{
TMOD=0x10;//定时器的工作方式
TH1=0xd8;
TL1=0xf0;
TR1=1;
while(!TF1);//这里错了,是定时器1
TF1=0;
}
voidmain()
{
while(1)
{
if(k1==0)
{
delay();//去抖动
if(k1==0)//检测按键确实按下,进行按键处理
{
ID++;
if(ID==0)
{
ID=0;
}
while(!k1);//这里错了,多余的加了==0
}
}
switch(ID)
{
case0:P1=0x3f;break;
case1:P1=0x06;break;
case2:P1=0x5b;break;
case3:P1=0x4f;break;
case4:P1=0x66;break;
case5:P1=0x6d;break;
case6:P1=0x7d;break;
case7:P1=0x07;break;
case8:P1=0x7f;break;
case9:P1=0x6f;break;
default:break;
}
}
}