📄 keyscan.lst
字号:
__start:
__text_start:
34 E5CF LDI R28,0x5F
35 E0D4 LDI R29,4
36 BFCD OUT 0x3D,R28
37 BFDE OUT 0x3E,R29
38 52C0 SUBI R28,0x20
39 40D0 SBCI R29,0
3A EA0A LDI R16,0xAA
3B 8308 STD Y+0,R16
3C 2400 CLR R0
3D E6E5 LDI R30,0x65
3E E0F0 LDI R31,0
3F E010 LDI R17,0
40 36E5 CPI R30,0x65
41 07F1 CPC R31,R17
42 F011 BEQ 0x0045
43 9201 ST R0,Z+
44 CFFB RJMP 0x0040
45 8300 STD Z+0,R16
46 E6E2 LDI R30,0x62
47 E0F0 LDI R31,0
48 E6A0 LDI R26,0x60
49 E0B0 LDI R27,0
4A E010 LDI R17,0
4B E000 LDI R16,0
4C BF0B OUT 0x3B,R16
4D 36E7 CPI R30,0x67
4E 07F1 CPC R31,R17
4F F021 BEQ 0x0054
50 95C8 LPM
51 9631 ADIW R30,1
52 920D ST R0,X+
53 CFF9 RJMP 0x004D
54 D210 RCALL _main
_exit:
55 CFFF RJMP _exit
FILE: F:\AVR\按键扫描\EX_Support.c
(0001) /***********************************************************
(0002) * 函数库说明:底层硬件初始化驱动函数库 *
(0003) * 版本: *
(0004) * 作者: *
(0005) * 创建日期: *
(0006) * -------------------------------------------------------- *
(0007) * [硬件说明] *
(0008) * 处理器: *
(0009) * 系统时钟: *
(0010) * -------------------------------------------------------- *
(0011) * [支 持 库] *
(0012) * 支持库名称:HD_Support.h *
(0013) * 需要版本: ----- *
(0014) * 支持库说明:底层硬件初始化声明库 *
(0015) * *
(0016) * 支持库名称:EX_Support.h *
(0017) * 需要版本: ----- *
(0018) * 支持库说明:底层硬件初始化驱动声明库 *
(0019) * *
(0020) * 支持库名称:PF_Config.h *
(0021) * 需要版本: ----- *
(0022) * 支持库说明:硬件平台配置声明库 *
(0023) * -------------------------------------------------------- *
(0024) * [版本更新] *
(0025) * 修改: *
(0026) * 修改日期: *
(0027) * 版本: *
(0028) * -------------------------------------------------------- *
(0029) * [版本历史] *
(0030) * -------------------------------------------------------- *
(0031) * [使用说明] *
(0032) ***********************************************************/
(0033)
(0034) /********************
(0035) * 头 文 件 配 置 区 *
(0036) ********************/
(0037) //# define _USE_VIRTUAL_SPI_SND_CODE
(0038) # include "PF_Config.h"
(0039) # include "Ex_Support.h"
(0040)
(0041) /********************
(0042) * 系 统 宏 定 义 *
(0043) ********************/
(0044)
(0045) /*------------------*
(0046) * 常 数 宏 定 义 *
(0047) *------------------*/
(0048)
(0049) /*------------------*
(0050) * 动 作 宏 定 义 *
(0051) *------------------*/
(0052) /*
(0053) # define VSPI_WAIT_SIGNAL_LOW(__SIGNAL) \
(0054) do\
(0055) {\
(0056) while((__SIGNAL));\
(0057) Delay_MS(50);\
(0058) }\
(0059) while((__SIGNAL));
(0060) # define VSPI_WAIT_SIGNAL_HIGH(__SIGNAL) \
(0061) do\
(0062) {\
(0063) while(!(__SIGNAL));\
(0064) Delay_MS(50);\
(0065) }\
(0066) while(!(__SIGNAL));
(0067) */
(0068) # define VSPI_WAIT_SIGNAL_LOW(__SIGNAL) while((__SIGNAL));
(0069) # define VSPI_WAIT_SIGNAL_HIGH(__SIGNAL) while(!(__SIGNAL));
(0070) /********************
(0071) * 模块结构体定义区 *
(0072) ********************/
(0073)
(0074) /********************
(0075) * 函 数 声 明 区 *
(0076) ********************/
(0077) void Insert_Timer0_OVF_ISR_Code(void);
(0078) void Driver_INIT(void);
(0079) void Delay_MS(uint16 wTime);
(0080) UINT8 Key_Scan(void);
(0081) #ifdef _USE_VIRTUAL_SPI_RCV_CODE
(0082) UINT8 chVirtualSPIReceiver(void);
(0083) #endif
(0084) #ifdef _USE_VIRTUAL_SPI_SND_CODE
(0085) void chVirtualSPISender(UINT8 chData);
(0086) #endif
(0087) /********************
(0088) * 模块函数声明区 *
(0089) ********************/
(0090)
(0091)
(0092) /********************
(0093) * 模块变量声明区 *
(0094) ********************/
(0095) static uint16 s_wSystemDelayTimerCounter = 0;
(0096) /********************
(0097) * 全局变量声明区 *
(0098) ********************/
(0099) uint16 g_wSystemTimer = 0;
(0100)
(0101) /***********************************************************
(0102) * 函数说明:软件驱动初始化函数 *
(0103) * 输入: 无 *
(0104) * 输出: 无 *
(0105) * 调用函数:无 *
(0106) ***********************************************************/
(0107) void Driver_INIT(void)
(0108) {
_Driver_INIT:
56 9508 RET
(0109) //*在这里插入你的各类软件驱动初始化代码*//
(0110) }
(0111)
(0112) /***********************************************************
(0113) * 函数说明:系统毫秒延时函数 *
(0114) * 输入: 需要延时的时间长度 *
(0115) * 输出: 无 *
(0116) * 调用函数:无 *
(0117) ***********************************************************/
(0118) void Delay_MS(uint16 wTime)
(0119) {
(0120) s_wSystemDelayTimerCounter = wTime;
_Delay_MS:
wTime --> R16
57 9310 0061 STS 0x0061,R17
59 9300 0060 STS 0x0060,R16
(0121)
(0122) while(s_wSystemDelayTimerCounter);
5B 9020 0060 LDS R2,0x0060
5D 9030 0061 LDS R3,0x0061
5F 2022 TST R2
60 F7D1 BNE 0x005B
61 2033 TST R3
62 F7C1 BNE 0x005B
63 9508 RET
(0123) }
(0124)
(0125) /***********************************************************
(0126) * 函数说明:定时器0中断处理程序代码插入函数 *
(0127) * 输入: 无 *
(0128) * 输出: 无 *
(0129) * 调用函数:无 *
(0130) ***********************************************************/
(0131) void Insert_Timer0_OVF_ISR_Code(void)
(0132) {
(0133) static UINT8 n = 0;
(0134) g_wSystemTimer++;
_Insert_Timer0_OVF_ISR_Code:
64 9180 0062 LDS R24,g_wSystemTimer
66 9190 0063 LDS R25,g_wSystemTimer+1
68 9601 ADIW R24,1
69 9390 0063 STS g_wSystemTimer+1,R25
6B 9380 0062 STS g_wSystemTimer,R24
(0135)
(0136) if (s_wSystemDelayTimerCounter)
6D 9020 0060 LDS R2,0x0060
6F 9030 0061 LDS R3,0x0061
71 2022 TST R2
72 F411 BNE 0x0075
73 2033 TST R3
74 F031 BEQ 0x007B
(0137) {
(0138) s_wSystemDelayTimerCounter--;
75 01C1 MOVW R24,R2
76 9701 SBIW R24,1
77 9390 0061 STS 0x0061,R25
79 9380 0060 STS 0x0060,R24
(0139) }
(0140)
(0141) if (!(g_wSystemTimer & (BIT(7) - 1)))
7B 9180 0062 LDS R24,g_wSystemTimer
7D 9190 0063 LDS R25,g_wSystemTimer+1
7F 778F ANDI R24,0x7F
80 7090 ANDI R25,0
81 3080 CPI R24,0
82 0789 CPC R24,R25
83 F469 BNE 0x0091
(0142) {
(0143) n++;
84 9180 0064 LDS R24,EX_Support.c:n
86 5F8F SUBI R24,0xFF
87 9380 0064 STS EX_Support.c:n,R24
(0144) n &= BIT(3)-1;
89 7087 ANDI R24,7
8A 9380 0064 STS EX_Support.c:n,R24
(0145) chVirtualSPISender(~BIT(n));
8C 2F18 MOV R17,R24
8D E001 LDI R16,1
8E D1DF RCALL lsl8
8F 9500 COM R16
90 D001 RCALL _chVirtualSPISender
(0146) }
91 9508 RET
_chVirtualSPISender:
chBITCounter1 --> R20
chData --> R10
92 92AA ST R10,-Y
93 934A ST R20,-Y
94 2EA0 MOV R10,R16
(0147) }
(0148)
(0149)
(0150)
(0151) #ifdef _USE_VIRTUAL_SPI_RCV_CODE
(0152) /***********************************************************
(0153) * 函数说明:虚拟SPI接收机 *
(0154) * 输入: 无 *
(0155) * 输出: 接收到的数据 *
(0156) * 调用函数:无 *
(0157) ***********************************************************/
(0158) UINT8 chVirtualSPIReceiver(void)
(0159) {
(0160) UINT8 chRCVData = 0;
(0161) UINT8 chCounter = 0;
(0162)
(0163) VSPI_WAIT_SIGNAL_LOW(VSPI_SS)
(0164) //PORTC &= ~BIT(PC0);
(0165) while(!VSPI_SS)
(0166) {
(0167) VSPI_WAIT_SIGNAL_LOW(VSPI_CLK)
(0168) PORTC ^= BIT(PC0);
(0169) chRCVData <<= 1;
(0170) chRCVData |= VSPI_DATA;
(0171) chCounter++;
(0172) VSPI_WAIT_SIGNAL_HIGH(VSPI_CLK)
(0173) if (chCounter == 8)
(0174) {
(0175) break;
(0176) }
(0177) }
(0178) PORTC &= ~BIT(PC0);
(0179) return chRCVData;
(0180)
(0181) }
(0182) #endif
(0183)
(0184) #ifdef _USE_VIRTUAL_SPI_SND_CODE
(0185) /***********************************************************
(0186) * 函数说明:虚拟SPI发送函数 *
(0187) * 输入: 要发送的字节 *
(0188) * 输出: 无 *
(0189) * 调用函数:无 *
(0190) ***********************************************************/
(0191) void chVirtualSPISender(UINT8 chData)
(0192) {
(0193) UINT8 chBITCounter = 0;
(0194)
(0195) CLR_VSPI_SS
95 98C3 CBI 0x18,3
(0196)
(0197) for (chBITCounter = 0;chBITCounter < 8;chBITCounter++)
96 2744 CLR R20
97 C012 RJMP 0x00AA
(0198) {
(0199) SET_VSPI_CLK
98 9AC2 SBI 0x18,2
(0200) if (chData & BIT(chBITCounter))
99 E001 LDI R16,1
9A 2F14 MOV R17,R20
9B D1D2 RCALL lsl8
9C 2C2A MOV R2,R10
9D 2220 AND R2,R16
9E F011 BEQ 0x00A1
(0201) {
(0202) SET_VSPI_DATA
9F 9AC1 SBI 0x18,1
(0203) }
A0 C001 RJMP 0x00A2
(0204) else
(0205) {
(0206) CLR_VSPI_DATA
A1 98C1 CBI 0x18,1
(0207) }
(0208) Delay_MS(5);
A2 E005 LDI R16,5
A3 E010 LDI R17,0
A4 DFB2 RCALL _Delay_MS
(0209) CLR_VSPI_CLK
A5 98C2 CBI 0x18,2
(0210)
(0211) Delay_MS(5);
A6 E005 LDI R16,5
A7 E010 LDI R17,0
A8 DFAE RCALL _Delay_MS
A9 9543 INC R20
AA 3048 CPI R20,0x8
AB F360 BCS 0x0098
(0212) }
(0213)
(0214) SET_VSPI_SS
AC 9AC3 SBI 0x18,3
AD 9149 LD R20,Y+
AE 90A9 LD R10,Y+
AF 9508 RET
(0215) }
(0216) #endif
(0217)
(0218) /***********************************************************
(0219) * 函数说明:按键扫描函数 *
(0220) * 输入: 无 *
(0221) * 输出: 按键的扫描码(如果无按键返回KEY_NULL) *
(0222) # 调用函数:无 *
(0223) ***********************************************************/
(0224) UINT8 Key_Scan(void)
(0225) {
(0226) UINT8 chTempKeyCode = KEY_NULL;
_Key_Scan:
chTempKeyCode0 --> R16
B0 EF0F LDI R16,0xFF
(0227) //填写扫描代码
(0228)
(0229) //首先扫描A列
(0230) CLR_A;
B1 B385 IN R24,0x15
B2 6388 ORI R24,0x38
B3 BB85 OUT 0x15,R24
B4 98AB CBI 0x15,3
B5 0000 NOP
(0231)
(0232) if (!READ_PINX)
B6 9B99 SBIS 0x13,1
B7 C002 RJMP 0x00BA
B8 E021 LDI R18,1
B9 C001 RJMP 0x00BB
BA 2722 CLR R18
BB 2322 TST R18
BC F411 BNE 0x00BF
(0233) {
(0234) chTempKeyCode = 0x00;
BD 2700 CLR R16
(0235) }
BE C008 RJMP 0x00C7
(0236) else if (!READ_PINY)
BF 9B9A SBIS 0x13,2
C0 C002 RJMP 0x00C3
C1 E021 LDI R18,1
C2 C001 RJMP 0x00C4
C3 2722 CLR R18
C4 2322 TST R18
C5 F409 BNE 0x00C7
(0237) {
(0238) chTempKeyCode = 0x03;
C6 E003 LDI R16,3
(0239) }
(0240)
(0241) CLR_B;
C7 B385 IN R24,0x15
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -