📄 mcs_51键盘显示子程序2.asm
字号:
;****************************************************************************
ORG 0000H
LJMP start ;复位后程序计数器PC=0000H
ORG 0003H
LJMP MY_INT0 ;外部中断0入口
ORG 000BH
LJMP MY_T0 ;定时器中断0入口
ORG 0013H
JMP MY_INT1 ;外部中断1入口
ORG 001BH
LJMP MY_T1 ;定时器中断1入口
ORG 0023H
LJMP MY_TX ;串行口中断入口
ORG 002BH
LJMP MY_T2 ;定时器中断2入口(8032/8052)
ORG 0030H
;------------------------------------------------------------------
START:
;程序开始
;设置堆栈指针
MOV IE,#10001001B ;EA X ET2 ES ET1 EX1 ET0 EX0
mov tmod,#00010000b
Mov th1,#3ch
mov tl1,#0afh
setb tr1
KEY:
LCALL KS1 ;是否有键按下
JZ KEY;END ;无键按下,返回
LCALL YS10MS ;10MS 延时
LCALL KS1 ;是否有键按下
JZ KEY;END ;无键按下,返回
MOV R2,#0EFH ;赋首列扫描字
MOV R3,#00H ;赋首列指针
LK1: MOV P1,R2 ;扫描字=>P1
MOV A,P1 ;读P1口
JB ACC.0,LONE ;0行无键按下,转1行
MOV A,#0 ;0行有键按下,赋行号=>A
LJMP LKP ;转求键号
LONE: JB ACC.1,LTW0 ;1行无键按下,转2行
MOV A,#4 ;1行有键按下,赋行号=>A
LJMP LKP ;转求键号
LTW0: JB ACC.2,LTHR ;2行无键按下,转3行
MOV A,#8 ;2行有键按下,赋行号=>A
LJMP LKP ;转求键号
LTHR: JB ACC.3,NEXT ;3行无键按下,转列加一
MOV A,#12 ;3行有键按下,赋行号=>A
LJMP LKP ;转求键号
NEXT: INC R3 ;列加一,指向下一列
MOV A,R2 ;扫描字=>A
RL A ;扫描字左移
MOV R2,A ;暂存扫描字
LJMP LK1 ;转下一列扫描
LKP: ADD A,R3 ;求键值(当前行+当前列)
PUSH Acc ;键值-->压入堆栈
LK2: LCALL KS1 ;是否有键按下
JNZ LK2 ;A不等于0,再判断
POP Acc ;键已经释放,A=键值
lcall YS10MS ;10MS 延时
lcall YS10MS ;10MS 延时
;MOV A,#1
;LCALL YS01S
KEYEND: ;返回
RET
;*********************************************************
KS1: ;是否有键按下,有A=1,否则A=0
MOV P1,#0FH ;列线全部有效
MOV A,P1 ;
CPL A ;
ANL A,#0FH ;
RET
;*********************************************************
YS10MS: ;延时10毫秒,晶振频率为12.00MHZ
MOV R6,#50
LOOP: MOV R7,#98
DJNZ R7,$
NOP
JNZ R6,LOOP
RET
;*********************************************************
YS01S:
MOV R4,A
LOOP12:
MOV R5,#20
LOOP11:
MOV R6,#100
LOOP10:
MOV R7,#248
DJNZ R7,$
DJNZ R6,LOOP10
DJNZ R5,LOOP11
DJNZ R4,LOOP12
RET
;*********************************************************
LED_OUT: ;显示输出子程序
;MOV SCON,#0
MOV R2,#6 ;显示模块长度
MOV R0,#30H ;显示缓冲区首地址
MOV DPTR,#TAB
CLR TI
LED_O1:
MOV A,@R0
INC R0
MOVC A,@A+DPTR
CLR EA
MOV SBUF,A
JNB TI,$
CLR TI
SETB EA
DJNZ R2,LED_O1
CLR P3.4
SETB P3.4 ;锁存脉冲
RET
TAB: ;段码
DB 00000011B ;0 A B C D E F G .
DB 10011111B ;1
DB 00100101B ;2
DB 00001101B ;3
DB 10011001B ;4
DB 01001001B ;5
DB 01000001B ;6
DB 00011111B ;7
DB 00000001B ;8
DB 00001001B ;9
DB 11111111B ;空
DB 11111101B ;-
;*********************************************************
MY_R: ;显示缓冲区左移
MOV 35H,34H
MOV 34H,33H
MOV 33H,32H
MOV 32H,31H
MOV 31H,30H
RET
;*********************************************************
GO_TO: ;散转程序
MOV DPTR,#TBJ ;散转表首地址
MOV 40H,A ;键值
ADD A,40H ;乘3
ADD A,40H
JMP @A+DPTR
TBJ:
MY_K0: LJMP MY_KEY0 ;0键值 转移
MY_K1: LJMP MY_KEY1 ;1键值 转移
MY_K2: LJMP MY_KEY2 ;2键值 转移
MY_K3: LJMP MY_KEY3 ;3键值 转移
MY_K4: LJMP MY_KEY4 ;4键值 转移
MY_K5: LJMP MY_KEY5 ;5键值 转移
MY_K6: LJMP MY_KEY6 ;6键值 转移
MY_K7: LJMP MY_KEY7 ;7键值 转移
MY_K8: LJMP MY_KEY8 ;8键值 转移
MY_K9: LJMP MY_KEY9 ;9键值 转移
MY_K10: LJMP MY_KEY10 ;10键值 转移
MY_K11: LJMP MY_KEY11 ;11键值 转移
MY_K12: LJMP MY_KEY12 ;12键值 转移
MY_K13: LJMP MY_KEY13 ;13键值 转移
MY_K14: LJMP MY_KEY14 ;14键值 转移
MY_K15: LJMP MY_KEY15 ;15键值 转移
;-----------------------------------------------------------------
MY_KEY0: ;0键值 转移
LCALL MY_R
MOV 30H,#0
LJMP INT0_END ;中断结束,返回主程序
MY_KEY1: ;1键值 转移
LCALL MY_R
MOV 30H,#1
LJMP INT0_END ;中断结束,返回主程序
MY_KEY2: ;2键值 转移
LCALL MY_R
MOV 30H,#2
LJMP INT0_END ;中断结束,返回主程序
MY_KEY3: ;3键值 转移
LCALL MY_R
MOV 30H,#3
LJMP INT0_END ;中断结束,返回主程序
MY_KEY4: ;4键值 转移
LCALL MY_R
MOV 30H,#4
LJMP INT0_END ;中断结束,返回主程序
MY_KEY5: ;5键值 转移
LCALL MY_R
MOV 30H,#5
LJMP INT0_END ;中断结束,返回主程序
MY_KEY6: ;6键值 转移
LCALL MY_R
MOV 30H,#6
LJMP INT0_END ;中断结束,返回主程序
MY_KEY7: ;7键值 转移
LCALL MY_R
MOV 30H,#7
LJMP INT0_END ;中断结束,返回主程序
MY_KEY8: ;8键值 转移
LCALL MY_R
MOV 30H,#8
LJMP INT0_END ;中断结束,返回主程序
MY_KEY9: ;9键值 转移
LCALL MY_R
MOV 30H,#9
LJMP INT0_END ;中断结束,返回主程序
MY_KEY10: ;10键值 转移 加法
LJMP INT0_END ;中断结束,返回主程序
MY_KEY11: ;11键值 转移 减法
LJMP INT0_END ;中断结束,返回主程序
MY_KEY12:
jnb tr1,sy ;12键值 转移 乘法
clr tr1
;setb tr1
LJMP INT0_END
sy: setb tr1
ljmp INT0_END
;中断结束,返回主程序
MY_KEY13: ;14键值 转移 除法
LJMP INT0_END ;中断结束,返回主程序
MY_KEY14: ;14键值 转移 等号
LJMP INT0_END ;中断结束,返回主程序
MY_KEY15: ;15键值 转移
MOV 30H,#0
MOV 31H,#10
MOV 32H,#10
MOV 33H,#10
MOV 34H,#10
MOV 35H,#10
LJMP INT0_END ;中断结束,返回主程序
END ;程序结尾
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -