📄 74ls164_2片.asm
字号:
;4*4行列键盘及8位LED数码管程序,LED采用2片164译码,占用3个I/O口,键盘采用线扫描法。
;程序有以下功能:
;FUN为功能控制状态字
;FUN为0时(功能代号0:0~9键):输入数字状态,输入一个数字,左移并显示
;FUN为1时(功能代号1:A键):左移一位
;FUN为2时(功能代号2:B键):右移一位
;FUN为3时(功能代号3:C键):闪烁
;FUN为4时(功能代号4:D键):左移/右移静止,闪烁停止,去除消隐 第二功能键(SHIFT)
;FUN为5时(功能代号5:E键):数据清零
;FUN为6时(功能代号6:F键):消隐状态
;FUN为11时(第二功能:SHIFT+A),连续左移,数据不断左移
;FUN为12时(第二功能:SHIFT+B),连续右移,数据不断右移
;FUN为13时(第二功能:SHIFT+C),向右跑马灯
;FUN为15时(第二功能:SHIFT+E),清屏,且清除数据
;FUN为16时(第二功能:SHIFT+F),撤销,因存储空间原因,只能撤销两次
LED EQU 30H ;30H~37H为显存
KEY EQU 38H ;KEY为键号
FUN EQU 39H ;FUN为功能状态字
DIS_N EQU 3AH ;DIS_N用于显存更新触发
RUN_N EQU 3BH ;RUN_N 跑马灯的当前位置
TEMP EQU 3CH ;临时变量,用于左右移数据暂存
PREKEY EQU 3DH ; PREKEY为上次按键操作的键号,用于判断上挡键是否有效
SHIFT EQU 20H.0 ;上挡键标志
LEDDOWN EQU 20H.1 ; 消隐标志位
UNDO EQU 3EH ; 当前能够撤销的次数
WATCH EQU 3FH
ORG 0000H
LJMP START
START: ; 程序初始化
MOV SP,#60H
CLR SHIFT
CLR LEDDOWN
CLR P2.0
CLR P2.1
MOV DIS_N,#0FDH
MOV RUN_N,#0FFH
MOV UNDO,#0
MOV R0,#LED ;使8个LED处于全灭状态(无数据)
MOV R1,#8
MOV A,#0FFH
START1:
MOV @R0,A
INC R0
DJNZ R1,START1
MAIN:
MOV P1,#0F0H ;键盘初始化
ACALL CHECK ;检测是否有键按下
JNZ WAIT_KEY ;若有键,则进行去抖处理
ACALL DISP ;调用显示子程序
SJMP MAIN
WAIT_KEY:
ACALL DISP ;去抖处理
ACALL DELAY
CLR A
ACALL CHECK
JNZ FINDKEY ;若有键按下,则转入计算键号
SJMP MAIN ;
CHECK:
MOV A,P1 ;按键检测
CPL A
ANL A,#0F0H
SWAP A
RET
FINDKEY: ;计算键号
MOV R0,#00H
CLR C
CR1:
RRC A
INC R0
JNC CR1
DEC R0 ;得出第几行
MOV A,R0
MOV B,#04
MUL AB
MOV R1,A ;得出行号
MOV P1,#0FEH ;利用线扫描法求列号
ACALL CHECK
JNZ K1
MOV P1,#0FDH
ACALL CHECK
JNZ K2
MOV P1,#0FBH
ACALL CHECK
JNZ K3
MOV P1,#0F7H
ACALL CHECK
JNZ K4
AJMP MAIN
K1:
MOV A,#00H ;计算列号
AJMP KEND
K2:
MOV A,#01H
AJMP KEND
K3:
MOV A,#02H
AJMP KEND
K4:
MOV A,#03H
KEND:
ADD A,R1
MOV KEY,A ;得出键号,放入KEY
ACALL INIT_KEY
K15: ;根据键号转入对应的处理程序
CJNE A,#15,K14
AJMP FUN15
K14:
CJNE A,#14,K13
AJMP FUN14
K13:
CJNE A,#13,K12
AJMP FUN13
K12:
CJNE A,#12,K11
AJMP FUN12
K11:
CJNE A,#11,K10
AJMP FUN11
K10:
CJNE A,#10,K09
AJMP FUN10
K09:
MOV FUN,#0
ACALL KEY_NUM
AJMP WAIT_KEY_UP
FUN15: ;各键的处理程序,这里包括0~9键的数字处理,及A~F键的功能模块程序
MOV FUN,#6 ;的初始化(及修改功能状态字,在下次调用DISP显示子程序时,对
AJMP WAIT_KEY_UP ;应的功能模块将被执行
FUN14:
MOV FUN,#5
AJMP WAIT_KEY_UP
FUN13:
MOV FUN,#4
AJMP WAIT_KEY_UP
FUN12:
MOV FUN,#3
AJMP WAIT_KEY_UP
FUN11:
MOV FUN,#2
AJMP WAIT_KEY_UP
FUN10:
MOV FUN,#1
AJMP WAIT_KEY_UP
INIT_KEY:
MOV PREKEY,FUN
MOV RUN_N,#0FFH
MOV DIS_N,#0FDH
RET
WAIT_KEY_UP: ;等待键起
ACALL DISP
ACALL CHECK ;不断调用DISP,直到键起
JZ COMBACK
SJMP WAIT_KEY_UP
COMBACK:AJMP MAIN
DISP: ;显示子程序
INC DIS_N
MOV A,DIS_N
JZ DO ;转入功能处理模块
MOV A,DIS_N
CJNE A,#25,DISP1 ;DISP_N为50时触发LED显存更新(对应不同功能状态字)
MOV DIS_N,#0FFH
DISP1:
MOV R1,#00H
MOV R2,#08H
MOV R5,#7FH
LOOP:MOV R0,#LED ;动态显示LED
MOV A,R0
ADD A,R1
MOV R0,A
MOV A,@R0
MOV R4,A
MOV C,LEDDOWN ;LEDDOWN为1时,消隐
JC DISABLE
DIS2:MOV A,R4
ACALL SENDDATA
MOV A,R5
RR A
MOV R5,A
INC R1
ACALL DELAY
DJNZ R2,LOOP
CLR P2.2
SETB P2.2
RET
DELAY:MOV R6,#1FH ;延时
DELAY1:
MOV R7,#1FH
DJNZ R7,$
DJNZ R6,DELAY1
RET
DISABLE: ;消隐输出
MOV A,R1
CJNE A,RUN_N,DIS3
AJMP DIS2
DIS3:
MOV R4,#0FFH
AJMP DIS2
DO: ;功能处理模块
MOV A,FUN
JZ DISP1
MOV C,SHIFT
JC FUNPLUS
D1:MOV A,FUN ;根据功能状态字转入对应的功能模块
D2:DEC A
JZ TURNL ;左移
DEC A
JZ TURNR ;右移
DEC A
JZ FLASHL ;闪烁
DEC A
JZ STOP ;静止/SHIFT/恢复
DEC A
JZ CLRLEDL ;清零
DEC A
JZ DOWNLEDL ;消隐
D3:MOV A,FUN ;以下为第二功能键功能
CJNE A,#11,D4
AJMP TURNL2 ;连续左移
D4:CJNE A,#12,D5
AJMP TURNR2 ;连续右移
D5:CJNE A,#13,D6
AJMP RUNL ;跑马灯
D6:CJNE A,#15,D7
AJMP CLS ;清屏
D7:CJNE A,#16,D8
AJMP UNDOL ;撤销
D8:AJMP DISP1
FUNPLUS: ;第二功能键
CJNE A,#04,PLUS1
CLR SHIFT
MOV FUN,#0
CLR LEDDOWN
AJMP DISP1
PLUS1:
MOV A,FUN
ADD A,#10
MOV FUN,A
AJMP D3
UNDOL:AJMP UNDOD
FLASHL:AJMP FLASH
RUNL:AJMP RUN
DOWNLEDL:AJMP DOWNLED
CLRLEDL:AJMP CLRLED
TURNL:
MOV FUN,#00H ;左移子程序
TURNL2:
MOV R0,#31H
MOV R1,#07H
MOV TEMP,30H
U2:MOV A,@R0
DEC R0
MOV @R0,A
INC R0
INC R0
DJNZ R1,U2
MOV R0,#37H
MOV @R0,TEMP
CLR SHIFT
AJMP DISP1
TURNR:
MOV FUN,#00H ;右移子程序
TURNR2:
MOV R0,#36H
MOV R1,#07H
MOV TEMP,37H
U3:MOV A,@R0
INC R0
MOV @R0,A
DEC R0
DEC R0
DJNZ R1,U3
MOV R0,#30H
MOV @R0,TEMP
CLR SHIFT
AJMP DISP1
STOP:
MOV A,PREKEY
JZ SH
CLR SHIFT
MOV FUN,#0 ;清除左右移及消隐闪烁状态,第二功能键
CLR LEDDOWN
AJMP DISP1
SH:SETB SHIFT
MOV FUN,#0
AJMP DISP1
CLRLED:
MOV FUN,#00H ;数据清零
ACALL SAVEDATA
MOV R0,#LED
MOV R1,#8
MOV A,#0
CLRLED1:
MOV @R0,A
INC R0
DJNZ R1,CLRLED1
AJMP DISP1
DOWNLED: ;关闭LED
MOV FUN,#6
SETB LEDDOWN
AJMP DISP1
FLASH:
CPL LEDDOWN ;取反,使出现闪烁效果
AJMP DISP1
CLS:
MOV FUN,#00H ;清屏
ACALL SAVEDATA
MOV R0,#LED
MOV R1,#8
MOV A,#0FFH
CLS1:
MOV @R0,A
INC R0
DJNZ R1,CLS1
CLR SHIFT
AJMP DISP1
DISPL:AJMP DISP1
RUN:
SETB LEDDOWN ;跑马灯子程序
CLR SHIFT
INC RUN_N
MOV A,RUN_N
CJNE A,#8,DISPL
MOV RUN_N,#0
AJMP DISPL
UNDOD: ;撤销,因存储空间原因,只能撤销两次
CLR SHIFT
MOV FUN,#0
MOV A,UNDO
JZ GOBACK
DEC UNDO
MOV R0,#58H
MOV R1,#30H
MOV R3,#08
ACALL LOOPS
MOV R0,#50H
MOV R1,#58H
MOV R3,#08
ACALL LOOPS
GOBACK:AJMP DISPL
KEY_NUM:
MOV FUN,#0 ;0~9数字按键处理
CLR SHIFT
CLR LEDDOWN
ACALL SAVEDATA
MOV R0,#31H
MOV R1,#07H
U1:MOV A,@R0
DEC R0
MOV @R0,A
INC R0
INC R0
DJNZ R1,U1
MOV R0,#37H
MOV @R0,KEY
RET
SAVE2:MOV UNDO,#02
SJMP SAVE1
SAVEDATA:INC UNDO
CLR C
MOV A,UNDO
SUBB A,#03
JZ SAVE2
SAVE1:MOV R0,#58H
MOV R1,#50H
MOV R3,#08
ACALL LOOPS
MOV R0,#30H
MOV R1,#58H
MOV R3,#08
ACALL LOOPS
RET
LOOPS:MOV A,@R0
MOV @R1,A
INC R0
INC R1
DJNZ R3,LOOPS
RET
SENDDATA:
MOV DPTR,#LEDCODE
MOVC A,@A+DPTR
MOV B,R5
SENDDATA1:
MOV R3,#08
SEND1:RRC A
MOV P2.2,C
PUSH A
MOV A,B
RRC A
MOV P2.1,C
MOV B,A
POP A
CPL P2.0
CPL P2.0
DJNZ R3,SEND1
RET
LEDCODE:
DB 3FH
DB 06H,5BH,4FH
DB 66H,6DH
DB 7DH,07H,7FH,6FH,77H,7CH
DB 39H,5EH,79H,71H
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -