📄 key_4x4.asm
字号:
;********************************************************************************
;* *
;* File : key_4x4.asm *
;* Function : 矩阵键盘显示 *
;* Date : 2006-05-06 *
;* Version : 1.0 *
;* *
;* Author : 开关电源 hongtusy@163.com *
;* Company : 电子信息技术咨询网 http://www.itsn.cn *
;* *
;****************************描述与记事******************************************
;实验板的AVR程序,矩阵4*4键盘键值显示,驱动蜂鸣器发出按键声。
;接线定义:SW1~8打开,SW2-1,2,3,4,打开,SW2-6为LED的电源,SW3-8为系统复位脚。
; PA2(SW5-7)为蜂鸣器输出端,PB(SW4-1~8)为键盘接入
;记事:本程序旨在对矩阵键盘扫描的理解与演示,程序适合初学者使用。
;使用器件:ATMEGA8535,可更换。 默认片内1MHz晶振
;功能:初始LED显示'-',按下那个按键显示按键的键值。使用的是4×4矩阵键盘。
;********************************************************************************
.include "m8535def.inc" ;定义头文件。
.org 0x0000 ;指定开始地址。
rjmp reset ;转移到“RESET”句。
.org 0x30
reset: ldi r16,0x02 ;设置堆栈指针0x025f
out sph,r16
ldi r16,0x5f
out spl,r16
;------------端口初始化-----------------------
ldi r16,0xff ;加载立即数,作数据方向参数。
out ddrd,r16 ;PD口为输出
out ddrc,r16 ;PC口为输出,数码管的段码端
out ddra,r16 ;PA3口为输出,接蜂鸣器
ldi r16,0xf0
out ddrb,r16 ;PB口为矩阵键盘连接端,高半字节为输出(可输出为0),低半字节为输入。
ldi r16,16
mov r20,r16 ;LED显示的初始值为"-"
rcall display;显示
rcall spk ;刚上电,蜂鸣器响一声。
clc ;c标志清零,把c作为有无按键的标志,C=1=有按键,C=0=无按键。
;--------------------按键检测---------------------------
start: rcall key_test ;按键检测
brcc start ;c为0跳转转移到wait句
mov r20,r16 ;更新显存
rcall display ;显示
clc ;清标志
rcall spk ;蜂鸣器响一声
rjmp start
;------------------蜂鸣器响一声-----------------------------
spk: ldi r16,0x00
out porta,r16
rcall londel
ldi r16,0xff
out porta,r16
rcall londel
ret
;-----------------------------按键检测程序---------------------------
key_test: ldi r16,0b01111111 ;pb7=0
out portb,r16
nop
in r16,pinb
sbrs r16,0 ;位为1跳行,0指第0位。
rjmp kA ;否则为0,A按下了。
sbrs r16,1
rjmp kb ;b按下了
sbrs r16,2
rjmp kc ;c按下了
sbrs r16,3
rjmp kd ;d按下了
;----------------
ldi r16,0b10111111 ;pb6=0
out portb,r16
nop
in r16,pinb
sbrs r16,0 ;位为1跳行
rjmp k3 ;否则为0,3按下了。
sbrs r16,1
rjmp k6 ;6按下了
sbrs r16,2
rjmp k9 ;9按下了
sbrs r16,3
rjmp kF ;15(F)按下了
;----------------
ldi r16,0b11011111 ;pb5=0
out portb,r16
nop
in r16,pinb
sbrs r16,0 ;位为1跳行
rjmp k2 ;否则为0,2按下了。
sbrs r16,1
rjmp k5 ;5按下了
sbrs r16,2
rjmp k8 ;8按下了
sbrs r16,3
rjmp k0 ;0按下了
;----------------
ldi r16,0b11101111 ;pb4=0
out portb,r16
nop
in r16,pinb
sbrs r16,0 ;位为1跳行
rjmp k1 ;否则为0,1按下了。
sbrs r16,1
rjmp k4 ;4按下了
sbrs r16,2
rjmp k7 ;7按下了
sbrs r16,3
rjmp kE ;14(E)按下了
;----------------
nop
;----------------
rjmp key_p
k0: ldi r16,0 ;0的键值
rjmp key_out
k1: ldi r16,1 ;1的键值
rjmp key_out
k2: ldi r16,2 ;2的键值
rjmp key_out
k3: ldi r16,3 ;3的键值
rjmp key_out
k4: ldi r16,4 ;4的键值
rjmp key_out
k5: ldi r16,5 ;5的键值
rjmp key_out
k6: ldi r16,6 ;6的键值
rjmp key_out
k7: ldi r16,7 ;7的键值
rjmp key_out
k8: ldi r16,8 ;8的键值
rjmp key_out
k9: ldi r16,9 ;9的键值
rjmp key_out
kA: ldi r16,10 ;A的键值
rjmp key_out
kb: ldi r16,11 ;b的键值
rjmp key_out
kC: ldi r16,12 ;C的键值
rjmp key_out
kd: ldi r16,13 ;d的键值
rjmp key_out
kE: ldi r16,14 ;14(E)的键值
rjmp key_out
kF: ldi r16,15 ;15(F)的键值
rjmp key_out
key_out: sec ;C置位,有按键。
key_p: ret
;--------PB4---PB5---PB6---PB7---------------
;--PB0----1-----2-----3----F1-----@@@@1,2,3,A
;--PB1----4-----5-----6----F2-----@@@@4,5,6,b
;--PB2----7-----8-----9----F3-----@@@@7,8,9,C
;--PB3----*-----0-----#----F4-----@@@@E,0,F,d
;---------------------------------------------
;---------独立的LED显示子程序,只要将要显示的数字送r20即可显示----------------------
;可显示的字符包括:0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F、-、_、P、X、
display: ldi r16,0b10000000
out portd,r16 ;位号,第1位。
mov r16,r20 ;数据1
ldi zh, high(Table_1<<1); 初始化Z指针
ldi zl, low(Table_1<<1)
clc ;清进位标志
add r30,r16 ;r16放的是要显示的数据,处理低字节数据
clr r16 ;r16清0
adc r31,r16 ;处理高字节数据
lpm r16,z ;从程序存储器中装入Z指针(r31:r30)指向的常量
out portc,r16
ret
;------------------------
Table_1:
.db 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0xBF,0xF7,0x8C,0xFF
;共阳 0 1 2 3 4 5 6 7 8 9 A b C d E F - _ P X
Table_2:
.db 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40,0x08,0x73,0x00
;共阴 0 1 2 3 4 5 6 7 8 9 A b C d E F - _ P 空
;***************************************************************************************************
;#################短延迟程序##################
del: ldi r16,0xff ;使用内部1MHz震荡器
Loop1: dec r16
brne Loop1
nop
ret
;###################钳套的延迟程序################
londel: ldi r17,0x4f
Loop2: rcall del
rcall del
dec r17
brne Loop2
ret
;##################end###############
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -