📄 键盘显示模块.lst
字号:
(0218) case 0xDF :
(0219) {
(0220) KeyStatu = Key_Press;
0143 2422 CLR R2
0144 92200106 STS KeyStatu,R2
(0221) return Key_3;
0146 E003 LDI R16,3
0147 C00E RJMP 0x0156
(0222) break;
(0223) }
(0224)
(0225) case 0xBF :
(0226) {
(0227) KeyStatu = Key_Press;
0148 2422 CLR R2
0149 92200106 STS KeyStatu,R2
(0228) return Key_2;
014B E002 LDI R16,2
014C C009 RJMP 0x0156
(0229) break;
(0230) }
(0231)
(0232) case 0x7F :
(0233) {
(0234) KeyStatu = Key_Press;
014D 2422 CLR R2
014E 92200106 STS KeyStatu,R2
(0235) return Key_1;
0150 E001 LDI R16,1
0151 C004 RJMP 0x0156
(0236) break;
(0237) }
(0238) }
(0239) KeyStatu = Key_Press; //读到的端口状态无法解析
0152 2422 CLR R2
0153 92200106 STS KeyStatu,R2
(0240) } //End Of "if (KeyPin == 0)"
(0241) break;
(0242) } //End Of " case Key_Release :"
(0243) } //End Of "switch (KeyStatu)"
(0244) return Key_Null;
0155 2700 CLR R16
0156 9508 RET
(0245) }
(0246)
(0247) /***********************************************************
(0248) * 函数说明:端口通讯程序 *
(0249) * 输入: 无 *
(0250) * 输出: 无 *
(0251) * 调用函数: *
(0252) ***********************************************************/
(0253) void Port_refresh (void)
(0254) {
(0255) unsigned char i;
(0256)
(0257) SS_Low; //模拟#SS的下跳沿
_Port_refresh:
i --> R16
0157 982A CBI 0x05,2
(0258)
(0259) for (i=0; i<ExtPortNum; i++)
0158 2700 CLR R16
0159 C014 RJMP 0x016E
(0260) {
(0261) SPDR = PortBuffer[i]; //刷新虚拟端口的一个字节
015A E184 LDI R24,0x14
015B E091 LDI R25,1
015C 2FE0 MOV R30,R16
015D 27FF CLR R31
015E 0FE8 ADD R30,R24
015F 1FF9 ADC R31,R25
0160 8020 LDD R2,Z+0
0161 BC2E OUT 0x2E,R2
(0262) while(!(SPSR&(1<<SPIF))); //等待通讯完成
0162 B42D IN R2,0x2D
0163 FE27 SBRS R2,7
0164 CFFD RJMP 0x0162
(0263) PortBuffer[i] = SPDR; //读回的数据返写回端口缓冲区
0165 E184 LDI R24,0x14
0166 E091 LDI R25,1
0167 2FE0 MOV R30,R16
0168 27FF CLR R31
0169 0FE8 ADD R30,R24
016A 1FF9 ADC R31,R25
016B B42E IN R2,0x2E
016C 8220 STD Z+0,R2
016D 9503 INC R16
016E 3003 CPI R16,3
016F F350 BCS 0x015A
(0264) }
(0265)
(0266) SS_High; //模拟#SS的上跳沿
0170 9A2A SBI 0x05,2
0171 9508 RET
FILE: D:\设计项目\深入浅出AVR\光盘文件\实例程序源代码\实例15_键盘显示模块\实例15_键盘显示模块-拨号装置\System.c
(0001) /*********************************************************/
(0002) /* */
(0003) /* 实例15 键盘显示模块 */
(0004) /* */
(0005) /* */
(0006) /* 程序设计 江海波 */
(0007) /* */
(0008) /* 编写时间 : 2007-06 版本 : V1.0 */
(0009) /* */
(0010) /* 提示 : 代码受版权保护,示例程序用于工程应谨慎 */
(0011) /* */
(0012) /* E-mail : soundman@sohu.com */
(0013) /*-------------------------------------------------------*/
(0014) /* 硬件环境: */
(0015) /* */
(0016) /* 实验电路板,ATmega48单片机,CPU时钟1MHz */
(0017) /* ------------------------------------------------------*/
(0018) /* 软件环境: */
(0019) /* */
(0020) /* ICCAVR 6.31A */
(0021) /* ------------------------------------------------------*/
(0022) /* 最后修改时间: */
(0023) /* */
(0024) /*-------------------------------------------------------*/
(0025) /* 历史版本纪录: */
(0026) /* */
(0027) /*********************************************************/
(0028)
(0029) /********************
(0030) * 头 文 件 配 置 区 *
(0031) ********************/
(0032) #include "PF_Config.h"
(0033) #include "KeyDis_Drv.h"
(0034)
(0035) /********************
(0036) * 系 统 宏 定 义 *
(0037) ********************/
(0038)
(0039) /*------------------*
(0040) * 常 数 宏 定 义 *
(0041) *------------------*/
(0042)
(0043) /*------------------*
(0044) * 动 作 宏 定 义 *
(0045) *------------------*/
(0046)
(0047) /********************
(0048) * 模块结构体定义区 *
(0049) ********************/
(0050)
(0051) /********************
(0052) * 模块函数声明区 *
(0053) ********************/
(0054)
(0055) /********************
(0056) * 模块变量声明区 *
(0057) ********************/
(0058)
(0059) /***********************************************************
(0060) * 函数说明:主函数 *
(0061) * 输入: 无 *
(0062) * 输出: 无 *
(0063) * 调用函数:System_INIT() *
(0064) ***********************************************************/
(0065) void main(void)
(0066) {
(0067) unsigned char i;
(0068)
(0069) System_INIT(); //代码初始化
_main:
i --> R20
0172 DED8 RCALL _System_INIT
(0070)
(0071) LEDDisBuffer[0] = Key_Null;
0173 2422 CLR R2
0174 9220010C STS LEDDisBuffer,R2
(0072) LEDDisBuffer[1] = Key_Null;
0176 9220010D STS LEDDisBuffer+1,R2
(0073) LEDDisBuffer[2] = Key_Null;
0178 9220010E STS LEDDisBuffer+2,R2
(0074) LEDDisBuffer[3] = Key_Null;
017A 9220010F STS LEDDisBuffer+3,R2
(0075) LEDDisBuffer[4] = Key_Null;
017C 92200110 STS 0x110,R2
(0076) LEDDisBuffer[5] = Key_Null;
017E 92200111 STS 0x111,R2
(0077) LEDDisBuffer[6] = Key_Null;
0180 92200112 STS 0x112,R2
(0078) LEDDisBuffer[7] = Key_Null;
0182 92200113 STS 0x113,R2
0184 C02B RJMP 0x01B0
(0079)
(0080) while(TRUE) //超级循环
(0081) {
(0082) if (KeyBuffer != Key_Null)
0185 9020010B LDS R2,KeyBuffer
0187 2022 TST R2
0188 F0D9 BEQ 0x01A4
(0083) {
(0084) for (i=7; i>0; i--)
0189 E047 LDI R20,7
018A C00F RJMP 0x019A
(0085) {
(0086) LEDDisBuffer[i] = LEDDisBuffer[i-1];
018B E08B LDI R24,0xB
018C E091 LDI R25,1
018D 2FE4 MOV R30,R20
018E 27FF CLR R31
018F 0FE8 ADD R30,R24
0190 1FF9 ADC R31,R25
0191 8020 LDD R2,Z+0
0192 E08C LDI R24,0xC
0193 E091 LDI R25,1
0194 2FE4 MOV R30,R20
0195 27FF CLR R31
0196 0FE8 ADD R30,R24
0197 1FF9 ADC R31,R25
0198 8220 STD Z+0,R2
0199 954A DEC R20
019A 2422 CLR R2
019B 1624 CP R2,R20
019C F370 BCS 0x018B
(0087) }
(0088)
(0089) LEDDisBuffer[0] = KeyBuffer;
019D 9020010B LDS R2,KeyBuffer
019F 9220010C STS LEDDisBuffer,R2
(0090)
(0091) KeyBuffer = Key_Null;
01A1 2422 CLR R2
01A2 9220010B STS KeyBuffer,R2
(0092) }
(0093)
(0094) if (DoTime == TRUE)
01A4 91800102 LDS R24,DoTime
01A6 3081 CPI R24,1
01A7 F441 BNE 0x01B0
(0095) {
(0096) DoTime = FALSE;
01A8 2422 CLR R2
01A9 92200102 STS DoTime,R2
(0097) LEDDisplay();
01AB DEE1 RCALL _LEDDisplay
(0098) Port_refresh();
01AC DFAA RCALL _Port_refresh
(0099) KeyBuffer = Key_service();
FILE: <library>
01AD DF08 RCALL _Key_service
01AE 9300010B STS KeyBuffer,R16
01B0 CFD4 RJMP 0x0185
01B1 9508 RET
mod16u:
01B2 9468 BSET 6
01B3 C001 RJMP xdiv16u
div16u:
01B4 94E8 BCLR 6
xdiv16u:
01B5 92EA ST R14,-Y
01B6 92FA ST R15,-Y
01B7 938A ST R24,-Y
01B8 24EE CLR R14
01B9 24FF CLR R15
01BA E180 LDI R24,0x10
01BB 0F00 LSL R16
01BC 1F11 ROL R17
01BD 1CEE ROL R14
01BE 1CFF ROL R15
01BF 16E2 CP R14,R18
01C0 06F3 CPC R15,R19
01C1 F018 BCS 0x01C5
01C2 1AE2 SUB R14,R18
01C3 0AF3 SBC R15,R19
01C4 9503 INC R16
01C5 958A DEC R24
01C6 F7A1 BNE 0x01BB
01C7 F416 BRTC 0x01CA
01C8 2D0E MOV R16,R14
01C9 2D1F MOV R17,R15
01CA 9189 LD R24,Y+
01CB 90F9 LD R15,Y+
01CC 90E9 LD R14,Y+
01CD 9508 RET
push_gset5:
01CE 92FA ST R15,-Y
01CF 92EA ST R14,-Y
push_gset4:
01D0 92DA ST R13,-Y
01D1 92CA ST R12,-Y
push_gset3:
01D2 92BA ST R11,-Y
01D3 92AA ST R10,-Y
push_gset2:
01D4 937A ST R23,-Y
01D5 936A ST R22,-Y
push_gset1:
01D6 935A ST R21,-Y
01D7 934A ST R20,-Y
01D8 9508 RET
pop_gset1:
01D9 E0E1 LDI R30,1
pop:
01DA 9149 LD R20,Y+
01DB 9159 LD R21,Y+
01DC FDE0 SBRC R30,0
01DD 9508 RET
01DE 9169 LD R22,Y+
01DF 9179 LD R23,Y+
01E0 FDE1 SBRC R30,1
01E1 9508 RET
01E2 90A9 LD R10,Y+
01E3 90B9 LD R11,Y+
01E4 FDE2 SBRC R30,2
01E5 9508 RET
01E6 90C9 LD R12,Y+
01E7 90D9 LD R13,Y+
01E8 FDE3 SBRC R30,3
01E9 9508 RET
01EA 90E9 LD R14,Y+
01EB 90F9 LD R15,Y+
01EC 9508 RET
push_lset:
01ED 93FA ST R31,-Y
01EE 93EA ST R30,-Y
01EF 93BA ST R27,-Y
01F0 93AA ST R26,-Y
01F1 939A ST R25,-Y
01F2 938A ST R24,-Y
01F3 933A ST R19,-Y
01F4 932A ST R18,-Y
01F5 931A ST R17,-Y
01F6 930A ST R16,-Y
01F7 929A ST R9,-Y
01F8 928A ST R8,-Y
01F9 927A ST R7,-Y
01FA 926A ST R6,-Y
01FB 925A ST R5,-Y
01FC 924A ST R4,-Y
01FD 923A ST R3,-Y
01FE 922A ST R2,-Y
01FF 921A ST R1,-Y
0200 920A ST R0,-Y
0201 B60F IN R0,0x3F
0202 920A ST R0,-Y
0203 9508 RET
pop_lset:
0204 9009 LD R0,Y+
0205 BE0F OUT 0x3F,R0
0206 9009 LD R0,Y+
0207 9019 LD R1,Y+
0208 9029 LD R2,Y+
0209 9039 LD R3,Y+
020A 9049 LD R4,Y+
020B 9059 LD R5,Y+
020C 9069 LD R6,Y+
020D 9079 LD R7,Y+
020E 9089 LD R8,Y+
020F 9099 LD R9,Y+
0210 9109 LD R16,Y+
0211 9119 LD R17,Y+
0212 9129 LD R18,Y+
0213 9139 LD R19,Y+
0214 9189 LD R24,Y+
0215 9199 LD R25,Y+
0216 91A9 LD R26,Y+
0217 91B9 LD R27,Y+
0218 91E9 LD R30,Y+
0219 91F9 LD R31,Y+
021A 9508 RET
lsl8:
021B 2311 TST R17
021C F019 BEQ 0x0220
021D 0F00 LSL R16
021E 951A DEC R17
021F CFFB RJMP lsl8
0220 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -