⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 key_4x4.asm

📁 实验板的AVR程序
💻 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 + -