📄 key_led1.asm
字号:
clk bit p2.5
dout bit p2.6
en bit p2.7
KEYBUF EQU 35H
KEY EQU 39H
DISPBUF EQU 20H
FLAG0 EQU 0
;***************************************************
ORG 000H
AJMP START
;***************************************************
ORG 0100H
START:
MOV R0,#7FH
CLR A
CLRRAM: MOV @R0,A
DJNZ R0,CLRRAM
MOV SP,#7DH
;***************************************************
MOV P0,#0FFH
MOV P1,#0FFH
MOV P2,#0FFH
MOV P3,#0FFH
;***************************************************
;初始化参数
;***************************************************
;主程序
;***************************************************
WAIT:
lcall keyinput ;是否有键盘输入
MOV A,FLAG0
CJNE A,#1H,WAIT
LCALL SETDISPBUF
LCALL TSLED
LJMP WAIT
;******************************************************
KEYINPUT:
MOV KEYBUF,#2
;
MOV P0,#0FFH
CLR P0.4
MOV A,P0
ANL A,#0FH
XRL A,#0FH ;有键按下吗?
JZ NOKEY1
LCALL DELY10US
MOV A,P0
ANL A,#0FH
XRL A,#0FH ;真的有键按下吗?
JZ NOKEY1
MOV A,P0
ANL A,#0FH
CJNE A,#0EH,NK1 ;键码的值是多少?P0.4xP0.0
MOV KEYBUF,#3
LJMP DK1
NK1: CJNE A,#0DH,NK2 ;键码是P0.4xP0.1 ?
MOV KEYBUF,#2
LJMP DK1
NK2: CJNE A,#0BH,NK3 ;键码是P0.4xP0.2 ?
MOV KEYBUF,#1
LJMP DK1
NK3: CJNE A,#07H,NK4 ;键码是P0.4xP0.3 ?
MOV KEYBUF,#0
LJMP DK1
NK4: NOP
DK1:
MOV A,KEYBUF
MOV DPTR,#TAB
MOVC A,@A+DPTR ;查表,取键值
MOV KEY,A
MOV FLAG0,#1 ;FLAG0=1
DK1A: MOV A,P0
ANL A,#0FH
XRL A,#0FH ;按键有没有松开?
JNZ DK1A
NOKEY1:
MOV P0,#0FFH
CLR P0.5
MOV A,P0
ANL A,#0FH
XRL A,#0FH
JZ NOKEY2
LCALL DELY10US
MOV A,P0
ANL A,#0FH
XRL A,#0FH
JZ NOKEY2
MOV A,P0
ANL A,#0FH
CJNE A,#0EH,NK5
MOV KEYBUF,#7
LJMP DK2
NK5: CJNE A,#0DH,NK6
MOV KEYBUF,#6
LJMP DK2
NK6: CJNE A,#0BH,NK7
MOV KEYBUF,#5
LJMP DK2
NK7: CJNE A,#07H,NK8
MOV KEYBUF,#4
LJMP DK2
NK8: NOP
DK2:
MOV A,KEYBUF
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV KEY,A
MOV FLAG0,#1 ;FLAG0=1
DK2A: MOV A,P0
ANL A,#0FH
XRL A,#0FH
JNZ DK2A
NOKEY2:
MOV P0,#0FFH
CLR P0.6
MOV A,P0
ANL A,#0FH
XRL A,#0FH
JZ NOKEY3
LCALL DELY10US
MOV A,P0
ANL A,#0FH
XRL A,#0FH
JZ NOKEY3
MOV A,P0
ANL A,#0FH
CJNE A,#0EH,NK9
MOV KEYBUF,#0bh
LJMP DK3
NK9: CJNE A,#0DH,NK10
MOV KEYBUF,#0ah
LJMP DK3
NK10: CJNE A,#0BH,NK11
MOV KEYBUF,#9
LJMP DK3
NK11: CJNE A,#07H,NK12
MOV KEYBUF,#8
LJMP DK3
NK12: NOP
DK3:
MOV A,KEYBUF
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV KEY,A
MOV FLAG0,#1 ;FLAG0=1
DK3A: MOV A,P0
ANL A,#0FH
XRL A,#0FH
JNZ DK3A
NOKEY3:
MOV P0,#0FFH
CLR P0.7
MOV A,P0
ANL A,#0FH
XRL A,#0FH
JZ NOKEY4
LCALL DELY10US
MOV A,P0
ANL A,#0FH
XRL A,#0FH
JZ NOKEY4
MOV A,P0
ANL A,#0FH
CJNE A,#0EH,NK13
MOV KEYBUF,#0fh
LJMP DK4
NK13: CJNE A,#0DH,NK14
MOV KEYBUF,#0eH
LJMP DK4
NK14: CJNE A,#0BH,NK15
MOV KEYBUF,#0dH
LJMP DK4
NK15: CJNE A,#07H,NK16
MOV KEYBUF,#0ch
LJMP DK4
NK16: NOP
DK4:
MOV A,KEYBUF
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV KEY,A
MOV FLAG0,#1 ;FLAG0=1
DK4A: MOV A,P0
ANL A,#0FH
XRL A,#0FH
JNZ DK4A
NOKEY4:
RET
;**********************************************
;填充显示缓冲区
;input: key,dispbuf
;output: dispbuf
;use: A,R0,R1,R2
;**********************************************
SETDISPBUF:
MOV R0,#DISPBUF
MOV A,#0H ;小数点位/不显示
MOV @R0,A
MOV A,#8
ADD A,R0
MOV R0,A ;R0=DISPBUF+8指向蜂鸣器设定位
MOV R1,A
DEC R1
DEC R1
MOV A,#0 ;蜂鸣器不鸣叫
MOV @R0,A
dec r0
mov a,#01H ;识别码=01
mov @r0,a
DEC R0
;
MOV R2,#0
YIWEI: ;缓冲区逐次后移一位
DEC R0
MOV A,@R0
MOV @R1,A
INC R2
DEC R1
CJNE R2,#5,YIWEI
MOV A,KEY
MOV @R0,A ;设置第一位数码管的值(key)
RET
;*********************************************************
;//串行发送DTLED-6显示
;//dispbuf0-dispbuf1-dispbuf2-dispbuf3-dispbuf4-dispbuf5-dispbuf6-dispbuf7-dispbuf8
;// 小数点 - 数码管1- 数码管2- 数码管3- 数码管4- 数码管5- 数码管6-ID识别码-BZ识别码
;//00000xxx-0000xxxx-0000xxxx-0000xxxx-0000xxxx-0000xxxx-0000xxxx-0000xxxx-0000xxxx
;//小数点=1~6,其它为不显示
;//数码管1-6=0~15,
;//ID识别码=0~15(本开发板ID=01)
;//BZ识别码=BZ.3为蜂鸣输出控制位,0=关闭,1=打开
;// BZ0~2为蜂鸣频率输出设定为,000=不分频, 最高频率输出=4800Hz;
;// 001=一次分频,频率输出=4800/ 2 =2400Hz;
;// 010=二次分频,频率输出=4800/ 4 =1200Hz;
;// 011=三次分频,频率输出=4800/ 8 =600Hz;
;// 100=四次分频,频率输出=4800/ 16=300Hz;
;// 101=五次分频,频率输出=4800/ 32=150Hz;
;// 110=六次分频,频率输出=4800/ 64=75Hz;
;// 111=七次分频,频率输出=4800/128=38Hz;
;//======================================================================
tsled:
CLR CLK
CLR EN
NOP
LCALL DELY10us
LCALL DELY10us
LCALL DELY10us
LCALL DELY10us
MOV A,#0
MOV R2,A ;//9个字节
MOV R3,A ;一个字节中的4个位
MOV R0,#DISPBUF
DISP0:
MOV A,@R0
SWAP A
DISP2:
SETB CLK
RLC A
JNC ZHI0
SETB DOUT
SJMP NEI
ZHI0: CLR DOUT
NEI:
NOP
CLR CLK
LCALL DELY3uS
LCALL DELY3uS
LCALL DELY3uS
INC R3
CJNE R3,#4,DISP2
;
MOV R3,#0
INC R2
INC R0
CJNE R2,#9,DISP0
SETB EN
RET
;/*********************************************************************/
DELY10US:
MOV R6,#10
DJNZ R6,$
RET
DELY3US:
MOV R6,#3
DJNZ R6,$
RET
;**********************************************************
TAB: DB 01H,02H,03H,0aH ;/*键盘码00,01,02,03,*/
DB 04H,05H,06H,0bH ;/*键盘码04,05,06,07,*/
DB 07H,08H,09H,0cH ;/*键盘码08,09,0a,0b,*/
DB 0eH,00H,0fH,0dH ;/*键盘码0c,0d,0e,0f*/
;/*********************************************************************/
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -