📄 keyscan.lst
字号:
(0458) chTempKeyCode = 19;
(0459) return chTempKeyCode;
170 E103 LDI R16,0x13
171 C03F RJMP 0x01B1
(0460) }
(0461) else if (!(PINC & (BIT(2))))
172 999A SBIC 0x13,2
173 C002 RJMP 0x0176
(0462) {
(0463) chTempKeyCode = 18;
(0464) return chTempKeyCode;
174 E102 LDI R16,0x12
175 C03B RJMP 0x01B1
(0465) }
(0466) else if (!(PINC & (BIT(1))))
176 9999 SBIC 0x13,1
177 C002 RJMP 0x017A
(0467) {
(0468) chTempKeyCode = 17;
(0469) return chTempKeyCode;
178 E101 LDI R16,0x11
179 C037 RJMP 0x01B1
(0470) }
(0471)
(0472)
(0473)
(0474) //////////////////////////////////////////////////////////////
(0475) //对15-13按钮进行扫描
(0476)
(0477) DDRC &= ~(BIT(1) | BIT(3) |
17A B384 IN R24,0x14
17B 7D81 ANDI R24,0xD1
17C BB84 OUT 0x14,R24
(0478) BIT(2) | BIT(5)); //把端口pc1-pc3、pc5设置为输入
(0479)
(0480) DDRC |= BIT(4); //把pc4端口设为输出
17D 9AA4 SBI 0x14,4
(0481)
(0482) PORTC |= BIT(1) | BIT(2) | BIT(3) |
17E B385 IN R24,0x15
17F 638E ORI R24,0x3E
180 BB85 OUT 0x15,R24
(0483) BIT(4) | BIT(5);
(0484)
(0485) PORTC &= ~BIT(4); //把pc4端口拉低
181 98AC CBI 0x15,4
(0486) NOP();
182 0000 NOP
(0487) NOP();
183 0000 NOP
(0488)
(0489)
(0490) if (!(PINC & (BIT(3)))) //读取pc3端口,如果返回值是0则表明按键被按下,
184 999B SBIC 0x13,3
185 C002 RJMP 0x0188
(0491) //则返回按键的值
(0492) //以下依次对pc2-pc1逐个读取值,如果返回值为0
(0493) //则返回相应按键值
(0494) {
(0495) chTempKeyCode = 15;
(0496) return chTempKeyCode;
186 E00F LDI R16,0xF
187 C029 RJMP 0x01B1
(0497) }
(0498) else if (!(PINC & (BIT(2))))
188 999A SBIC 0x13,2
189 C002 RJMP 0x018C
(0499) {
(0500) chTempKeyCode = 14;
(0501) return chTempKeyCode;
18A E00E LDI R16,0xE
18B C025 RJMP 0x01B1
(0502) }
(0503) else if (!(PINC & (BIT(1))))
18C 9999 SBIC 0x13,1
18D C002 RJMP 0x0190
(0504) {
(0505) chTempKeyCode = 13;
(0506) return chTempKeyCode;
18E E00D LDI R16,0xD
18F C021 RJMP 0x01B1
(0507) }
(0508)
(0509)
(0510)
(0511) //////////////////////////////////////////////////////////////
(0512) //对10-9按钮进行扫描
(0513)
(0514) DDRC &= ~(BIT(2) | BIT(1) |
190 B384 IN R24,0x14
191 7C89 ANDI R24,0xC9
192 BB84 OUT 0x14,R24
(0515) BIT(4) | BIT(5)); //把端口pc1-pc2、pc4-pc5设置为输入
(0516)
(0517) DDRC |= BIT(3); //把pc3端口设为输出
193 9AA3 SBI 0x14,3
(0518)
(0519) PORTC |= BIT(1) | BIT(2) |
194 B385 IN R24,0x15
195 638E ORI R24,0x3E
196 BB85 OUT 0x15,R24
(0520) BIT(3) | BIT(4) | BIT(5);
(0521)
(0522) PORTC &= ~BIT(3); //把pc3端口拉低
197 98AB CBI 0x15,3
(0523) NOP();
198 0000 NOP
(0524) NOP();
199 0000 NOP
(0525)
(0526)
(0527) if (!(PINC & (BIT(2)))) //读取pc2端口,如果返回值是0则表明按键被按下,
19A 999A SBIC 0x13,2
19B C002 RJMP 0x019E
(0528) //则返回按键的值
(0529) {
(0530) chTempKeyCode = 10;
(0531) return chTempKeyCode;
19C E00A LDI R16,0xA
19D C013 RJMP 0x01B1
(0532) }
(0533) else if (!(PINC & (BIT(1)))) //读取pc1端口,如果返回值是0则表明按键被按下,
19E 9999 SBIC 0x13,1
19F C002 RJMP 0x01A2
(0534) //则返回按键的值
(0535) {
(0536) chTempKeyCode = 9;
(0537) return chTempKeyCode;
1A0 E009 LDI R16,0x9
1A1 C00F RJMP 0x01B1
(0538) }
(0539)
(0540)
(0541) //////////////////////////////////////////////////////
(0542) //对5按钮进行扫描
(0543) DDRC &= ~(BIT(4) | BIT(1) |
1A2 B384 IN R24,0x14
1A3 7C85 ANDI R24,0xC5
1A4 BB84 OUT 0x14,R24
(0544) BIT(3) | BIT(5)); //把端口pc1、pc3-pc4设置为输入
(0545)
(0546) DDRC |= BIT(2); //把pc2端口设为输出
1A5 9AA2 SBI 0x14,2
(0547)
(0548) PORTC |= BIT(1) | BIT(2) | BIT(3) |
1A6 B385 IN R24,0x15
1A7 638E ORI R24,0x3E
1A8 BB85 OUT 0x15,R24
(0549) BIT(4) | BIT(5);
(0550)
(0551) PORTC &= ~BIT(2); //把pc2端口拉低
1A9 98AA CBI 0x15,2
(0552) NOP();
1AA 0000 NOP
(0553) NOP();
1AB 0000 NOP
(0554)
(0555) if (!(PINC & (BIT(1)))) //读取pc1端口,如果返回值是0则表明按键被按下,
1AC 9999 SBIC 0x13,1
1AD C002 RJMP 0x01B0
(0556) //则返回按键的值
(0557) {
(0558) chTempKeyCode = 5;
(0559) return chTempKeyCode;
1AE E005 LDI R16,5
1AF C001 RJMP 0x01B1
(0560) }
(0561)
(0562)
(0563) return chTempKeyCode; //返回按键值
1B0 EF0F LDI R16,0xFF
1B1 9508 RET
_Get_Code:
Table --> Y,+0
chj0 --> R20
chi --> R10
1B2 92AA ST R10,-Y
1B3 934A ST R20,-Y
1B4 2EA0 MOV R10,R16
1B5 972A SBIW R28,0xA
(0564) }
(0565)
(0566) UINT8 Get_Code (UINT8 chi)
(0567) {
(0568) UINT8 chj;
(0569) UINT8 Table[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
1B6 E588 LDI R24,0x58
1B7 E090 LDI R25,0
1B8 01FE MOVW R30,R28
1B9 E00A LDI R16,0xA
1BA E010 LDI R17,0
1BB 93FA ST R31,-Y
1BC 93EA ST R30,-Y
1BD 939A ST R25,-Y
1BE 938A ST R24,-Y
1BF D0B4 RCALL asgncblk
(0570) switch(chi)
1C0 2D4A MOV R20,R10
1C1 3041 CPI R20,1
1C2 F408 BCC 0x01C4
1C3 C043 RJMP 0x0207
1C4 E189 LDI R24,0x19
1C5 158A CP R24,R10
1C6 F408 BCC 0x01C8
1C7 C03F RJMP 0x0207
1C8 E286 LDI R24,0x26
1C9 E090 LDI R25,0
1CA 2FE4 MOV R30,R20
1CB 50E1 SUBI R30,1
1CC 27FF CLR R31
1CD 0FEE LSL R30
1CE 1FFF ROL R31
1CF 0FE8 ADD R30,R24
1D0 1FF9 ADC R31,R25
1D1 9025 LPM R2,Z+
1D2 9034 LPM R3,1(Z)
1D3 01F1 MOVW R30,R2
1D4 9409 IJMP
(0571) {
(0572) case 1: chj = Table[1];break;
1D5 8149 LDD R20,Y+1
1D6 C031 RJMP 0x0208
(0573) case 2: chj = Table[2];break;
1D7 814A LDD R20,Y+2
1D8 C02F RJMP 0x0208
(0574) case 3: chj = Table[3];break;
1D9 814B LDD R20,Y+3
1DA C02D RJMP 0x0208
(0575) case 4: chj = Table[4];break;
1DB 814C LDD R20,Y+4
1DC C02B RJMP 0x0208
(0576) case 5: chj = Table[5];break;
1DD 814D LDD R20,Y+5
1DE C029 RJMP 0x0208
(0577) case 6: chj = Table[6];break;
1DF 814E LDD R20,Y+6
1E0 C027 RJMP 0x0208
(0578) case 7: chj = Table[7];break;
1E1 814F LDD R20,Y+7
1E2 C025 RJMP 0x0208
(0579) case 8: chj = Table[8];break;
1E3 8548 LDD R20,Y+8
1E4 C023 RJMP 0x0208
(0580) case 9: chj = Table[9];break;
1E5 8549 LDD R20,Y+9
1E6 C021 RJMP 0x0208
(0581) case 10: chj = Table[0];break;
1E7 8148 LDD R20,Y+0
1E8 C01F RJMP 0x0208
(0582) case 11: chj = Table[1];break;
1E9 8149 LDD R20,Y+1
1EA C01D RJMP 0x0208
(0583) case 12: chj = Table[2];break;
1EB 814A LDD R20,Y+2
1EC C01B RJMP 0x0208
(0584) case 13: chj = Table[3];break;
1ED 814B LDD R20,Y+3
1EE C019 RJMP 0x0208
(0585) case 14: chj = Table[4];break;
1EF 814C LDD R20,Y+4
1F0 C017 RJMP 0x0208
(0586) case 15: chj = Table[5];break;
1F1 814D LDD R20,Y+5
1F2 C015 RJMP 0x0208
(0587) case 16: chj = Table[6];break;
1F3 814E LDD R20,Y+6
1F4 C013 RJMP 0x0208
(0588) case 17: chj = Table[7];break;
1F5 814F LDD R20,Y+7
1F6 C011 RJMP 0x0208
(0589) case 18: chj = Table[8];break;
1F7 8548 LDD R20,Y+8
1F8 C00F RJMP 0x0208
(0590) case 19: chj = Table[9];break;
1F9 8549 LDD R20,Y+9
1FA C00D RJMP 0x0208
(0591) case 20: chj = Table[0];break;
1FB 8148 LDD R20,Y+0
1FC C00B RJMP 0x0208
(0592) case 21: chj = Table[1];break;
1FD 8149 LDD R20,Y+1
1FE C009 RJMP 0x0208
(0593) case 22: chj = Table[2];break;
1FF 814A LDD R20,Y+2
200 C007 RJMP 0x0208
(0594) case 23: chj = Table[3];break;
201 814B LDD R20,Y+3
202 C005 RJMP 0x0208
(0595) case 24: chj = Table[4];break;
203 814C LDD R20,Y+4
204 C003 RJMP 0x0208
(0596) case 25: chj = Table[5];break;
205 814D LDD R20,Y+5
206 C001 RJMP 0x0208
(0597) default: chj = 0xFF;
207 EF4F LDI R20,0xFF
(0598) }
(0599) return chj;
208 2F04 MOV R16,R20
209 962A ADIW R28,0xA
20A 9149 LD R20,Y+
20B 90A9 LD R10,Y+
20C 9508 RET
FILE: F:\AVR\按键扫描\HD_Support.c
(0001) /***********************************************************
(0002) * 函数库说明:底层硬件初始化函数库 *
(0003) * 版本: *
(0004) * 作者: *
(0005) * 创建日期: *
(0006) * -------------------------------------------------------- *
(0007) * [硬件说明] *
(0008) * 处理器: *
(0009) * 系统时钟: *
(0010) * -------------------------------------------------------- *
(0011) * [支 持 库] *
(0012) * 支持库名称:HD_Support.h *
(0013) * 需要版本: ----- *
(0014) * 支持库说明:底层硬件初始化声明库 *
(0015) * *
(0016) * 支持库名称:PF_Config.h *
(0017) * 需要版本: ----- *
(0018) * 支持库说明:硬件平台配置声明库 *
(0019) * -------------------------------------------------------- *
(0020) * [版本更新] *
(0021) * 修改: *
(0022) * 修改日期: *
(0023) * 版本: *
(0024) * -------------------------------------------------------- *
(0025) * [版本历史] *
(0026) * -------------------------------------------------------- *
(0027) * [使用说明] *
(0028) ***********************************************************/
(0029)
(0030) /********************
(0031) * 头 文 件 配 置 区 *
(0032) ********************/
(0033) # include "PF_Config.h"
(0034) # include "HD_Support.h"
(0035)
(0036) /********************
(0037) * 系 统 宏 定 义 *
(0038) ********************/
(0039) # pragma interrupt_handler Timer0_OVF_ISR:iv_TIMER0_OVF
(0040)
(0041) /*------------------*
(0042) * 常 数 宏 定 义 *
(0043) *------------------*/
(0044)
(0045) /*------------------*
(0046) * 动 作 宏 定 义 *
(0047) *------------------*/
(0048) #ifndef INSERT_TIMER0_OVF_ISR_CODE
(0049) # define INSERT_TIMER0_OVF_ISR_CODE
(0050) # warning "TIMER0_OVF_ISR haven`t been used but initialed!"
(0051) #endif
(0052)
(0053) /********************
(0054) * 模块结构体定义区 *
(0055) ********************/
(0056)
(0057) /********************
(0058) * 函 数 声 明 区 *
(0059) ********************/
(0060) void Device_INIT(void);
(0061)
(0062) /********************
(0063) * 模块函数声明区 *
(0064) ********************/
(0065) static void Port_INIT(void);
(0066) static void Timer0_INIT(void);
(0067)
(0068) /********************
(0069) * 模块变量声明区 *
(0070) ********************/
(0071)
(0072) /********************
(0073) * 全局变量声明区 *
(0074) ********************/
(0075)
(0076)
(0077) /***********************************************************
(0078) * 函数说明:系统硬件初始化函数 *
(0079) * 输入: 无 *
(0080) * 输出: 无 *
(0081) * 调用函数:Port_INIT() Timer0_INIT() *
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -