各位大侠,
我刚刚从事单片机这一行,需要写按键控制开关功能的汇率程序,但是用的是义隆单片机,在网上找了一个例程,是51单片机的,不能很好的理解,请熟悉51单片机的大侠能否写每一个语句的解释。我想按这个程序搬到义隆的单片机上。先谢过!
网上找的例程如下:
经典按键防抖动51汇编程序
;四独立按键控制四LED;
;四个独立按键对应四个独立的LED;
;当某一个按键按下时对应的LED亮,当第二次按下时灭。
;四个LED只有一个亮,初学者可以参考以下程式:
;当一直按下某一按键时对应的LED会闪动。
;————————————————————————
K1 BIT P1.4
K2 BIT P1.5
K3 BIT P1.6
K4 BIT P1.7
FLAG0 BIT 20H.0 ;LED0标记
FLAG1 BIT 20H.1 ;LED1标记
FLAG2 BIT 20H.2 ;LED2标记
FLAG3 BIT 20H.3 ;LED3标记
K_OLD EQU 30H
K_NEW EQU 31H
;______________________________________________________________
ORG 0000H
JMP MAIN
ORG 0030H
;_______________________________________________________________
MAIN:
MOV SP,#60H
MOV P1,#0FFH
MOV P0,#0FFH
MOV K_OLD,#00H
MOV 20H,#0FFH
MAIN1:
CALL K_SCAN ;键扫描
MOV A,K_NEW
CJNE A,K_OLD, MAIN2
JMP MAIN1
MAIN2:
CALL DELAY ;延时除去抖动
CALL K_SCAN ;再判断键是否按下
MOV A,K_NEW
CJNE A,K_OLD,MAIN3
JMP MAIN1
MAIN3:
JB ACC.0,LOOP1 ;K1按下
JB ACC.1,LOOP2 ;K2按下
JB ACC.2,LOOP3 ;K3按下
JB ACC.3,LOOP4 ;K4按下
JMP MAIN1
LOOP1:
JNB FLAG0,LOOP1A
MOV P0,#0FEH
MOV 20H,#0EH ;FLAG0=0
JMP MAIN1
LOOP1A:
MOV P0,#0FFH
MOV 20H,#0FH
JMP MAIN1
LOOP2:
JNB FLAG1,LOOP1A
MOV P0,#0FDH
MOV 20H,#0DH ;FLAG1=0
JMP MAIN1
LOOP2A:
MOV P0,#0FFH
MOV 20H,#0FH
JMP MAIN1
LOOP3:
JNB FLAG2,LOOP3A
MOV P0,#0FBH
MOV 20H,#0BH ;FLAG2=0
JMP MAIN1
LOOP3A:
MOV P0,#0FFH
MOV 20H,#0FH
JMP MAIN1
LOOP4:
JNB FLAG3,LOOP4A
MOV P0,#0F7H
MOV 20H,#07H ;FLAG3=0
JMP MAIN1
LOOP4A:
MOV P0,#0FFH
MOV 20H,#0FH
JMP MAIN1
;_______________________________________________________________
;键扫描子程序
;———————————————————————————
K_SCAN:
MOV P1,#0FFH
MOV K_NEW,#00H
MOV A,#00H
MOV C,K4
CPL C
RLC A
MOV C,K3
CPL C
RLC A
MOV C,K2
CPL C
RLC A
MOV C,K1
CPL C
RLC A
MOV K_NEW,A
RET
;__________________________________
;延时子程序
;——————————————————————————
DELAY:
MOV R6,#200
DEL:
MOV R7,#0FFH
DJNZ R7,$
DJNZ R6,DEL
RET
;_______________________________________________________
;可以将 K_SCAN 子程序更改为:
/*
K_SCAN:
MOV P1,#0FFH
MOV K_NEW,#00H
MOV A,P1
CPL A
ANL A,#0F0H
SWAP A
MOV K_NEW,A
RET
*/
#include <at89x51.h>
unsigned char bdata Flag;
sbit Flag0 = Flag ^ 0; /* bit 0 of Flag0 */
sbit Flag1 = Flag ^ 0; /* bit 1 of Flag1 */
sbit Flag2 = Flag ^ 0; /* bit 2 of Flag2 */
sbit Flag3 = Flag ^ 0; /* bit 3 of Flag3 */
sbit K1 =P1^4;
sbit K2 =P1^5;
sbit K3 =P1^6;
sbit K4 =P1^7;
void delay(unsigned int dly)
{
while (dly>0) dly--;
}
void main(void)
{
EA=0;
P0=0xFF;
P1=0xFF;
P2=0xFF;
P3=0xFF;
Flag=0;
while (1)
{
if (K1==0)
{
delay(2000);
if (K1==0)
{
if (Flag0==0)
{
Flag0=1;
P0=0xFF;
P0=0xFE;
}
else
{
Flag0=0;
P0=0xFF;
}
}
}
else if (K2==0)
{
delay(2000);
if (K2==0)
{
if (Flag1==0)
{
Flag1=1;
P0=0xFF;
P0=0xFD;
}
else
{
Flag1=0;
P0=0xFF;
}
}
}
else if (K3==0)
{
delay(2000);
if (K3==0)
{
if (Flag2==0)
{
Flag2=1;
P0=0xFF;
P0=0xFC;
}
else
{
Flag2=0;
P0=0xFF;
}
}
}
else if (K4==0)
{
delay(2000);
if (K4==0)
{
if (Flag3==0)
{
Flag3=1;
P0=0xFF;
P0=0xFB;
}
else
{
Flag3=0;
P0=0xFF;
}
}
}
}
一周热门 更多>