单片机汇编语言程序问题:第1个按键控制第1个灯的亮和灭,第2个按键控制第2个灯的闪烁

第1个按键控制第1个灯,此键按一下灯亮,再按一下即灭,再按又亮。按一下第2个键,则第2个灯闪烁地亮,再按一下即灭,再按又闪烁。采用51单片机,用P3口。请指教

第1个回答  2013-02-13
下列程序,已经经过实验,可以满足题目要求。

KEY1 EQU P3.0
KEY2 EQU P3.1
LED1 EQU P3.2
LED2 EQU P3.3
Flag1 EQU 20H.0
Flag2 EQU 20H.1
L_F1 EQU 20H.2
L_F2 EQU 20H.3
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP T0_INT
ORG 0030H
MAIN:
MOV TH0, #04H
SETB TR0
MOV IE, #82H
MOV R2, #50
SJMP $
T0_INT:
MOV TH0, #04H
MOV C, Flag1
MOV LED1, C
DJNZ R2, K0
MOV R2, #50
JNB Flag2, K0
CPL LED2
K0:
;-------------------
K11:
JB KEY1, K12
SETB L_F1
SJMP K21
K12:
JB L_F1, K13
SJMP K21
K13:
CLR L_F1
CPL Flag1
;-------------------
K21:
JB KEY2, K22
SETB L_F2
SJMP K31
K22:
JB L_F2, K23
SJMP K31
K23:
CLR L_F2
CPL Flag2
;-------------------
K31:
RETI
END追问

此程序已烧录到单片机,测试成功。还要问一下,如果需要按键脉冲的前沿起控,也就是KEY1键按下去的同时,LED1即亮或即灭(目前是按键弹起后灯才变化),要改动哪个地方?

追答

我写的程序,是按照一般的、常规的要求。
对按键进行了:按下检测、延时消抖,等待释放,最后,再执行相应的功能程序。

如果需要在按键脉冲的前沿起控,往往,就会造成混乱,即:
按一下键,还不等松开,就会出现多次的执行效果。

如果真的需要,再编写一个,也可以。

……前面不变
;-------------------
K11:
JNB KEY1, K12
CLR L_F1
SJMP K21
K12:
JNB L_F1, K13
SJMP K21
K13:
SETB L_F1
CPL Flag1
;-------------------
K21:
JNB KEY2, K22
CLR L_F2
SJMP K31
K22:
JNB L_F2, K23
SJMP K31
K23:
SETB L_F2
CPL Flag2
;-------------------
K31:
RETI
END
-----------------
所谓的专业回答,是错误的。
根本就不能符合题目的要求。

《本回答专业性由电脑网络分类达人 董辉认证》
这个董辉,绝对没有专业水平。

百度的声誉,就被你这样的骗子给败坏了。

2015年11月补充。

第2个回答  2013-02-13
KEY1 EQU P3.0
KEY2 EQU P3.1
LED1 EQU P3.2
LED2 EQU P3.3
ORG 0000H
LJMP MAIN
ORG 0030H
MAIN:
MOV SP,#5FH
MOV TMOD,#01H
MOV TH0,#HIGH (65536-50000)
MOV TL0,#LOW (65536-50000)
SETB ET0
SETB EA
SETB LED1
SETB LED2
LOOP:
JB KEY1,LOOP1
LCALL DELAY
JB KEY1,LOOP1
JNB KEY1,$
CPL LED1
SJMP LOOP
LOOP1:
JB KEY2,LOOP
LCALL DELAY
JB KEY2,LOOP
JNB KEY2,$
CPL 00H
JB 00H,LOOP2
CLR TR0
SETB LED2
LJMP LOOP
LOOP2:
SETB TR0
LJMP LOOP
DELAY:
MOV R2,#20
DELAY1:
MOV R3,#250
DJNZ R3,$
DJNZ R2,DELAY1
RET
T0ISR:
CLR TR0
MOV TH0,#HIGH (65536-50000)
MOV TL0,#LOW (65536-50000)
SETB TR0
CPL LED2
RETI
END追问

此程序烧录到单片机后,测试的结果:LED1的亮和灭的翻转正常,也就是按一下键亮,再按又灭,而LED2却不正常,按下KEY2键时,对应的LED2不亮。这是什么原因?请指教

追答

再试试
KEY1 EQU P3.0
KEY2 EQU P3.1
LED1 EQU P3.2
LED2 EQU P3.3
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP T0ISR
ORG 0030H
MAIN:
MOV SP,#5FH
MOV TMOD,#01H
MOV TH0,#HIGH (65536-50000)
MOV TL0,#LOW (65536-50000)
SETB ET0
SETB EA
SETB LED1
SETB LED2
CLR 00H
LOOP:
JB KEY1,LOOP1
LCALL DELAY
JB KEY1,LOOP1
JNB KEY1,$
CPL LED1
SJMP LOOP
LOOP1:
JB KEY2,LOOP
LCALL DELAY
JB KEY2,LOOP
JNB KEY2,$
CPL 00H
JB 00H,LOOP2
CLR TR0
SETB LED2
LJMP LOOP
LOOP2:
SETB TR0
LJMP LOOP
DELAY:
MOV R2,#20
DELAY1:
MOV R3,#250
DJNZ R3,$
DJNZ R2,DELAY1
RET
T0ISR:
CLR TR0
MOV TH0,#HIGH (65536-50000)
MOV TL0,#LOW (65536-50000)
SETB TR0
CPL LED2
RETI
END

本回答被提问者和网友采纳
第3个回答  2013-02-13

定义UCHAR无符号的字符
的UCHAR时间,数量;
SBIT键= P3 ^ 0;
SBIT LED = P3 ^ 1;
>位标志;
的无效t0isr()中断1
{
倍+ +;
(次> = 6)
{
倍= 0
标志= 1;
}
}
()
{
TMOD = 0X01;
ET0 = 1; <BR / EA = 1;
倍= 0;
数= 0;
(1)
{
(KEY == 0)
{
延迟(10);
(键== 0)
{
TH0 =(65536-50000)/ 256;
TL0 =(65536-50000) 256%;
TR0 = 1;
(键);
(KEY == 0)
{
延迟(10);
((的关键== 0)&&(标志== 0))LED =?LED;
}
}
}
TR0 = 0;标志= 0; />}
}
第4个回答  2013-02-13
如用C语言,我可以帮你!汇编我也不会!追问

C语言也可以,请多多指教

追答

#include
#include"delay.h"
sbit key1=P3^0;//定义按键1为P3.0
sbit key2=P3^1;//定义按键2为P3.1
sbit led1=P3^2;//定义led1为P3.2
sbit led3=P3^3;//定义led2为P3.3
bit m=1;//定义m为key2按键按下标志
void main()
{
while(1)

{
if(key1==0)

delayms(15);

if(key1==0)

{
led1=~led1;

}

if(key2==0)

delayms(15);

if(key2==0)

{
m=~m;

}

if(m==0)//当key第一次按下的时候执行led2间断100毫秒闪烁

{
led2=0;

delayms(100);//led2亮大约100毫秒执行熄灭

led2=1;

delayms(100);

}

else
led2=1;//当key2第二次按下的时候led2为灭

}

}
如果没有delay.h头文件,就直接在上面工程中去掉delay.h头文件,直接写一个delayms(unsigned int ms);函数就可以了
void delayms(unsigned int ms)
{
unsigned int x,y;

for(x=ms;x>0;x--)

for(y=110;y>0;y--);

}
这个就是delayms(unsigende int ms)延时函数;没有delay.h头文件,就把上面的这个函数写在main()函数前面,如果没写在前面,写在了后面,就要在主函数mian()前面调用一下void delayms(unsigned int ms);
记得别忘了;这个符号啊?

相似回答