key+buzzer.asm
来自「使用开发板上8个独立按键和蜂鸣器」· 汇编 代码 · 共 85 行
ASM
85 行
;汇编语言编译:简易电子琴实验——查表方式显示
;=======================================
;Function: 程序开始.
;=======================================
ORG 0000H
AJMP MAIN
ORG 000BH
LJMP Break
ORG 0030H
;=======================================
;Function: 程序初始化.
;=======================================
MAIN: MOV TMOD,#01H ;设置定时器0的工作方式1
SETB ET0 ;设置定时器0中断
SETB TR0 ;启动定时器0
CLR EA ;屏蔽中断
WAIT1: LCALL KEY ;调用KEY子程序,判断有键按下否?第几个键?
CLR EA ;屏蔽中断
SETB P1.4 ;将P1.4置高,关闭蜂鸣器
CJNE R3,#00H,WAIT1 ;如果R3=0,则表示有键按下
MOV 25H,22H ;将22H里存放的按键号送给25H保存
MOV A,22H ;将22H里存放的按键号送给A
RL A ;因为查表里都是字,所以得乘2查得数据
MOV DPTR,#TABLE ;置键码表首址
MOVC A,@A+DPTR ;查表
MOV TH0,A ;将数据高位送TH0
MOV 21H,A ;将高位备份
MOV A,22H ;将22H里存放的按键号送给A
RL A ;因为查表里都是字,所以得乘2查得数据
INC A ;取低位数据
MOVC A,@A+DPTR
MOV TL0,A
MOV 20H,A
WAIT2: LCALL KEY ;调用键盘程序
SETB EA
CJNE R3,#00H,WAIT1 ;R3!=0,表示无键按下,跳转到WAIT1处
MOV A,25H
CJNE A,22H,WAIT1 ;按键号改变,到WAIT1 处
SJMP WAIT2
;=======================================
KEY: MOV R3,#0FFH ;KEY子程序,判断有键按下否?第几个键?
MOV A,#0FFH
MOV P2,A ;实验系统键盘接口在P2口,读入键盘按键值
MOV A,P2
CJNE A,#0FFH,HaveKey
AJMP NoKey
HaveKey:SETB C ;利用标志位CY来判断是哪个键按下
MOV R2,#08H
MOV R0,#00H
WAIT3: RRC A ;移位判断
JNC STORE
INC R0
DJNZ R2,WAIT3
AJMP NoKey
STORE: MOV 22H,R0 ;将按键号存22H,R3=0有键按下
MOV R3,#00H
NoKey:
RET
;=======================================
Break: PUSH ACC ;中断产生方波,从P1.4口输出
PUSH PSW
MOV TL0,20H
MOV TH0,21H
CPL P1.4
POP PSW
POP ACC
RETI
;=======================================
ORG 0200H ;定义蜂鸣发声的数据表格
TABLE: DW 64655,64751,64837,64876,64948,65012,65069,65095 ;1,2,3,4,5,6,7,1
END
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?