ORG 0000H
lJMP START
ORG 0030H
START: MOV 30H,#00H ;第一位LED数存放30H
MOV 31H,#00H ;第二位LED数存放31H
MOV 32H,#00H ;第三位LED数存放32H
MOV 33H,#00H ;第四位LED数存放33H
START1: LCALL DISP
JNB P3.0,FUN0 ;按键1按下,转键1处理子程序
JNB P3.1,FUN1 ;按键2按下,转键2处理子程序
JNB P3.2,FUN2 ;按键3按下,转键3处理子程序
JNB P3.3,FUN3 ;按键4按下,转键4处理子程序
JNB P3.4,FUN3 ;按键5按下,转键5处理子程序
JNB F0,START1 ;无按键按下,标志位为0,重判
FUN0: LCALL DL10MS ;键1按下,开始处理。调用延时20MS子程序
JB P3.0,START1 ;返回再判,防抖
LCALL DISP ;显示
JNB P3.0,$-3 ;等待释放,键未释放,跳至上一条,继续显示并等待键释放
SETB F0 ;曾经有按键按下,标志位置1
LCALL FUN00 ;调用按键1功能子程序
AJMP START1 ;跳转判定按键状态
FUN1: LCALL DL10MS ;延时10MS,防抖
JB P3.1,START1 ;再判
LCALL DISP ;显示。三字节指令
JNB P3.1,$-3 ;等待释放,键未释放,跳至上一条,继续显示并等待键释放。这样可使按下键时,LED不熄灭。
SETB F0 ;曾经有键按下,标志位置1
LCALL FUN11 ;调用按键2功能子程序
AJMP START1 ;跳转判定按键状态
FUN2: LCALL DL10MS ;延时10MS
JB P3.2,START1 ;再判
LCALL DISP ;显示。三字节指令
JNB P3.2,$-3 ;等待释放,键未释放,跳至上一条,继续显示并等待键释放。这样可使按下键时,LED不熄灭。
SETB F0 ;曾经有键按下,标志位置1
LCALL FUN22 ;调用按键3功能子程序
AJMP START1 ;跳转判定按键状态
FUN3: LCALL DL10MS ;延时10MS
JB P3.3,START1 ;再判
LCALL DISP ;显示 。三字节指令
JNB P3.3,$-3 ;等待释放,键未释放,跳至上一条,继续显示并等待键释放。这样可使按下键时,LED不熄灭。
SETB F0 ;曾经有键按下,标志位置1
LJMP START ;转回重新开始
FUN4: LCALL DL10MS ;延时10MS
JB P3.4,START1 ;再判
LCALL DISP ;显示 。三字节指令
JNB P3.4,$-3 ;等待释放,键未释放,跳至上一条,继续显示并等待键释放。这样可使按下键时,LED不熄灭。
SETB F0 ;曾经有键按下,标志位置1
LJMP START ;转回重新开始
FUN00: INC 30H ;30H内数加1
MOV A,30H ;30H内数送A
CJNE A,#0AH,OUT ;30H内数未到0AH,返回判定按键状态。
MOV 30H,#00H ;30H数加到0AH,清30H
CLR F0 ;标志位置0
RET ;返回调用
FUN11: INC 31H
MOV A,31H
CJNE A,#0AH,OUT
MOV 31H,#00H
CLR F0
RET
FUN22: INC 32H
MOV A,32H
CJNE A,#0AH,OUT
MOV 32H,#00H
CLR F0
RET
FUN33: INC 33H
MOV A,33H
CJNE A,#0AH,OUT
MOV 33H,#00H
CLR F0
OUT: RET
DISP:
MOV A,30H ;第一位数送A
MOV DPTR,#TAB ;码表首地址
MOVC A,@A+DPTR ;取字形码送A
MOV P1,A ;字形码送P1口
SETB P2.4 ;开第一位LED
ACALL DL1MS ;延时
CLR P2.4 ;关第一位,防止鬼影
MOV A,31H ;第二位数送A
MOV DPTR,#TAB ;码表首地址
MOVC A,@A+DPTR ;取字形码送A
MOV P1,A ;字形码送P1口
SETB P2.5 ;开第二位LED
ACALL DL1MS ;延时
CLR P2.5 ;关第二位,防止鬼影
MOV A,32H ;第三位数送A
MOV DPTR,#TAB ;码表首地址
MOVC A,@A+DPTR ;取字形码送A
MOV P1,A ;字形码送P1口
SETB P2.6 ;开第三位LED
ACALL DL1MS ;延时
CLR P2.6 ;关第三位,防止鬼影
MOV A,33H ;第四位数送A
MOV DPTR,#TAB ;码表首地址
MOVC A,@A+DPTR ;取字形码送A
MOV P1,A ;字形码送P1口
SETB P2.7 ;开第四位LED
ACALL DL1MS ;延时
CLR P2.7 ;关第四位,防止鬼影
RET ;返回调用
DL1MS: MOV R2,#2uj
MOV R1,#256 ;二字节指令
DJNZ R1,$ ;二字节指令
DJNZ R2,$-4 ;R2不为0,转上2条指令
RET
DL10MS: MOV R3,#10
LCALL DL1MS ;三字节指令
DJNZ R3,$-3 ;R3不为0,转上一条指令
RET
;共阳8段LED
TAB: DB 0C0H,0F9H,0A4H,0B0H,099H ;"0"~"4"
DB 092H,082H,0F8H,080H,090H ;"5"~"9"
END
求帮忙看下这个为什么不行!菜鸟不懂啊
-
一周热门 更多>