📄 slavr733.asm
字号:
;SL-AVR开发实验器键盘扫描程序(16个数字键,还有命令键,一个换档键)
SCAN1: push xh ;键扫显示子程序。
PUSH XL ;将xl压入堆栈
PUSH TEMP3
PUSH TEMP2
PUSH TEMP1
PUSH TEMP
LDI XL,$60
SET ;T标志为1表示未按键
LDI SCNN,$00 ;按键起始扫描码SCNN为00
LDI SCNDP,0B11011111 ;令6位七段LED扫描显示码初始为11011111
LDI CNT,$06 ;七段LED共6位故CNT=6为位数计数
LDI KSNI,0B11110111 ;4*4键盘扫描码KSNI初始为11110111
COL1: LDI TEMP,$FF ;PORTB设定为输出
OUT DDRb,TEMP
OUT DDRC,TEMP ;PORTC设定为输出
OUT PORTC,TEMP
OUT DDRd,TEMP ;PORTD设定为输出
OUT PORTd,SCNDP ;6位七段LED扫描显示码输出到PORTD
LD R1,X+ ;要显示于七段LED的间接寄存器X中的内容送入R1并令X加1
OUT PORTb,R1 ;显示内容输出到PORTB以驱动LED显示
RCALL DELAY ;调用延时以显示此位数一段时间
MOV TEMP,CNT ;LED位数为6而按键码行数为4故需作CNT值检测
SUBI TEMP,$03 ;CNT=TEMP与3相减比较
BRCS NOSK ;位数扫描CNT超过3则C为1跳到NOSK不作按键处理
LDI TEMP1,$04 ;一共要检查4个按键
LDI TEMP,0B00001111 ;设定PC0-PC3为输出PC4-PC7为输入
OUT DDRc,TEMP
OUT PORTc,KSNI ;KSNI输出到PORTC并令PC7-PC4为上拉电阻输入态
RCALL DELYT ;调用延时以稳定读取键盘I/O输入端
IN TEMP,PINc ;读取C口检测PC7-PC4看是否有按键低电位输入
ANDI TEMP,0B11110000 ;取TEMP的高4位
SWAP TEMP ;键码顺序为PC4-PC7故将TEMP的高低4位互换成D0-D3
KROW: SEC ;令C标志为1以便将键盘码D0-D3移到C标志位检测
ROR TEMP ;TEMP的内容右移1位将第一个键码D0=PC4移到C标志位检测
BRCS NOKEY ;若有键按下则测到PC4=D0=0,若C=1无按键则转到NOKEY
CLT ;若PC4=D0=CF=0表示有按键令T=0表示有按键
MOV KEYN,SCNN ;把按键扫描码SCNN送键码KEYN中保存
SBIS PINd,$07
ADIW KEYN,$10 ;判定SHIFT键是否按下,按下则键值加10
NOKEY: INC SCNN ;按键扫描码SCNN加1
DEC TEMP1 ;扫描读取键数TEMP1减1
BRNE KROW ;每行有4个按键如TEMP1不为0则跳到KROW再检测PC5-PC7
SEC ;此行4个键码检测完后令C为1以方便键盘扫描码KSNI内容的移位
ROR KSNI ;键盘扫描码KSNI=CF=1>11110111移位以进行下一行按键扫描
NOSK: SEC ;令进位标志CF=1
ROR SCNDP ;将扫描显示码SCNDP左移作下一位扫描
DEC CNT ;共需作6位数扫描显示故CNT减1
BRNE COL1 ;CNT减1不为0则跳回COL1再作扫描显示及读取键盘输入
LDI TEMP,$FF ;若已完成全部扫描显示和读取按键则令TEMP=0ff
OUT DDRC,TEMP ;TEMP输出到DDRC设定PORTC为输出驱动LED
OUT PORTC,TEMP
POP TEMP
POP TEMP1
POP TEMP2
POP TEMP3
POP XL
pop xh
RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -