📄 keyboard.lst
字号:
__start:
__text_start:
002A E5CF LDI R28,0x5F
002B E0D4 LDI R29,4
002C BFCD OUT 0x3D,R28
002D BFDE OUT 0x3E,R29
002E 51C0 SUBI R28,0x10
002F 40D0 SBCI R29,0
0030 EA0A LDI R16,0xAA
0031 8308 STD Y+0,R16
0032 2400 CLR R0
0033 E6E0 LDI R30,0x60
0034 E0F0 LDI R31,0
0035 E010 LDI R17,0
0036 36E0 CPI R30,0x60
0037 07F1 CPC R31,R17
0038 F011 BEQ 0x003B
0039 9201 ST R0,Z+
003A CFFB RJMP 0x0036
003B 8300 STD Z+0,R16
003C E5E4 LDI R30,0x54
003D E0F0 LDI R31,0
003E E6A0 LDI R26,0x60
003F E0B0 LDI R27,0
0040 E010 LDI R17,0
0041 35E4 CPI R30,0x54
0042 07F1 CPC R31,R17
0043 F021 BEQ 0x0048
0044 95C8 LPM
0045 9631 ADIW R30,1
0046 920D ST R0,X+
0047 CFF9 RJMP 0x0041
0048 940E005E CALL _main
_exit:
004A CFFF RJMP _exit
_port_init:
004B 2422 CLR R2
004C BA2B OUT 0x1B,R2
004D BA2A OUT 0x1A,R2
004E EF8F LDI R24,0xFF
004F BB88 OUT 0x18,R24
0050 BB87 OUT 0x17,R24
0051 BA25 OUT 0x15,R2
0052 BA24 OUT 0x14,R2
0053 BA22 OUT 0x12,R2
0054 BA21 OUT 0x11,R2
0055 9508 RET
_init_devices:
0056 94F8 BCLR 7
0057 DFF3 RCALL _port_init
0058 2422 CLR R2
0059 BE25 OUT 0x35,R2
005A BE2B OUT 0x3B,R2
005B BE29 OUT 0x39,R2
005C 9478 BSET 7
005D 9508 RET
_main:
005E DFF7 RCALL _init_devices
005F C003 RJMP 0x0063
0060 940E0095 CALL _get_key
0062 BB08 OUT 0x18,R16
0063 CFFC RJMP 0x0060
0064 9508 RET
_key_scan:
key --> R20
temp --> R22
0065 940E01A8 CALL push_gset2
FILE: D:\桌面\教程\keyboard\keyboard.c
(0001) /**************************************
(0002) ** Filename: keyboard.c
(0003) ** Describe: 矩阵键盘程序
(0004) ** Author : 古欣 www.avrvi.com
(0005) ** Time : 2007-2-15
(0006) **************************************/
(0007)
(0008) #include "config.h"
(0009)
(0010) /**************************************
(0011) ** 说明:线翻转法进行键盘扫描
(0012) ** 输出:获得高低位的扫描值
(0013) ** 有键时需要耗时 14ms
(0014) **************************************/
(0015) unsigned char key_scan(void)
(0016) {
(0017) unsigned char temp=0,key=0;
0067 2766 CLR R22
0068 2744 CLR R20
(0018) KEY_DDR = 0xF0; //高四位输出0,键按下,则对应的值为0
0069 EF80 LDI R24,0xF0
006A BB8A OUT 0x1A,R24
(0019) KEY_PORT = 0x0F; //低四位输入,内部电阻上拉,没有键按下时为高
006B E08F LDI R24,0xF
006C BB8B OUT 0x1B,R24
(0020) temp = KEY_PIN&0x0F;//与掉高四位
006D B369 IN R22,0x19
006E 706F ANDI R22,0xF
(0021) if(temp==0x0F)
006F 306F CPI R22,0xF
0070 F411 BNE 0x0073
(0022) {
(0023) return 0; // 无按键返回
0071 2700 CLR R16
0072 C01F RJMP 0x0092
(0024) }
(0025) else
(0026) {
(0027) delay_ms(10);
0073 E00A LDI R16,0xA
0074 E010 LDI R17,0
0075 940E0160 CALL _delay_ms
(0028) temp = KEY_PIN&0x0F; //延时去抖后再检测
0077 B369 IN R22,0x19
0078 706F ANDI R22,0xF
(0029) if(temp==0x0F)
0079 306F CPI R22,0xF
007A F411 BNE 0x007D
(0030) return 0;
007B 2700 CLR R16
007C C015 RJMP 0x0092
(0031) else
(0032) key=temp;
007D 2F46 MOV R20,R22
(0033) }
(0034) //翻转
(0035) KEY_DDR = 0x0F; //低四位输出0,键按下,则对应的值为0
007E E08F LDI R24,0xF
007F BB8A OUT 0x1A,R24
(0036) KEY_PORT = 0xF0; //高四位输入,内部电阻上拉,没有键按下时为高
0080 EF80 LDI R24,0xF0
0081 BB8B OUT 0x1B,R24
(0037) delay_ms(3); //延时等待稳定
0082 E003 LDI R16,3
0083 E010 LDI R17,0
0084 940E0160 CALL _delay_ms
(0038)
(0039) temp = KEY_PIN&0xF0;//与掉低四位
0086 B369 IN R22,0x19
0087 7F60 ANDI R22,0xF0
(0040) if(temp==0xF0)
0088 3F60 CPI R22,0xF0
0089 F411 BNE 0x008C
(0041) {
(0042) return 0; // 无按键返回
008A 2700 CLR R16
008B C006 RJMP 0x0092
(0043) }
(0044) else //这里不再延时再扫描,因为已经确定了不是抖动才会进入本步操作。
(0045) {
(0046) key |= temp; //高低位的键值进入KEY
008C 2B46 OR R20,R22
(0047) }
(0048) KEY_DDR = 0x00;/*输出复位*/
008D 2422 CLR R2
008E BA2A OUT 0x1A,R2
(0049) KEY_PORT = 0xFF;
008F EF8F LDI R24,0xFF
0090 BB8B OUT 0x1B,R24
(0050)
(0051) return key;
0091 2F04 MOV R16,R20
0092 940E019F CALL pop_gset2
0094 9508 RET
_get_key:
i --> R20
0095 940E01AA CALL push_gset1
(0052) }
(0053)
(0054)
(0055) /**************************************
(0056) ** 说明:获得键盘的值
(0057) ** 内部调用函数key_scan
(0058) ** 输出:实际键值
(0059) **************************************/
(0060) unsigned char get_key(void)
(0061) {
(0062) unsigned char i=0;
0097 2744 CLR R20
(0063) i=key_scan();
0098 DFCC RCALL _key_scan
0099 2F40 MOV R20,R16
(0064) switch (i) {/*将按键码转换成键值*/
009A 2755 CLR R21
009B 3B47 CPI R20,0xB7
009C E0E0 LDI R30,0
009D 075E CPC R21,R30
009E F409 BNE 0x00A0
009F C070 RJMP 0x0110
00A0 3B4B CPI R20,0xBB
00A1 E0E0 LDI R30,0
00A2 075E CPC R21,R30
00A3 F409 BNE 0x00A5
00A4 C069 RJMP 0x010E
00A5 3B4D CPI R20,0xBD
00A6 E0E0 LDI R30,0
00A7 075E CPC R21,R30
00A8 F409 BNE 0x00AA
00A9 C062 RJMP 0x010C
00AA 3B4E CPI R20,0xBE
00AB E0E0 LDI R30,0
00AC 075E CPC R21,R30
00AD F409 BNE 0x00AF
00AE C05B RJMP 0x010A
00AF EB8E LDI R24,0xBE
00B0 E090 LDI R25,0
00B1 1784 CP R24,R20
00B2 0795 CPC R25,R21
00B3 F0F4 BLT 0x00D2
00B4 3040 CPI R20,0
00B5 0745 CPC R20,R21
00B6 F409 BNE 0x00B8
00B7 C040 RJMP 0x00F8
00B8 3040 CPI R20,0
00B9 E0E0 LDI R30,0
00BA 075E CPC R21,R30
00BB F40C BGE 0x00BD
00BC C05D RJMP 0x011A
00BD 3747 CPI R20,0x77
00BE E0E0 LDI R30,0
00BF 075E CPC R21,R30
00C0 F409 BNE 0x00C2
00C1 C056 RJMP 0x0118
00C2 374B CPI R20,0x7B
00C3 E0E0 LDI R30,0
00C4 075E CPC R21,R30
00C5 F409 BNE 0x00C7
00C6 C04F RJMP 0x0116
00C7 374D CPI R20,0x7D
00C8 E0E0 LDI R30,0
00C9 075E CPC R21,R30
00CA F409 BNE 0x00CC
00CB C048 RJMP 0x0114
00CC 374E CPI R20,0x7E
00CD E0E0 LDI R30,0
00CE 075E CPC R21,R30
00CF F409 BNE 0x00D1
00D0 C041 RJMP 0x0112
00D1 C048 RJMP 0x011A
00D2 3D47 CPI R20,0xD7
00D3 E0E0 LDI R30,0
00D4 075E CPC R21,R30
00D5 F191 BEQ 0x0108
00D6 3D4B CPI R20,0xDB
00D7 E0E0 LDI R30,0
00D8 075E CPC R21,R30
00D9 F161 BEQ 0x0106
00DA 3D4D CPI R20,0xDD
00DB E0E0 LDI R30,0
00DC 075E CPC R21,R30
00DD F131 BEQ 0x0104
00DE 3D4E CPI R20,0xDE
00DF E0E0 LDI R30,0
00E0 075E CPC R21,R30
00E1 F101 BEQ 0x0102
00E2 3D47 CPI R20,0xD7
00E3 E0E0 LDI R30,0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -