📄 键盘显示模块.lst
字号:
_SPI_INIT:
0087 E78D LDI R24,0x7D
0088 BD8C OUT 0x2C,R24
(0150) SPSR = 0x00; //不使用SPI倍速
0089 2422 CLR R2
008A BC2D OUT 0x2D,R2
008B 9508 RET
_LEDDisplay:
LocalTime --> R20
008C D081 RCALL push_gset1
FILE: D:\设计项目\深入浅出AVR\光盘文件\实例程序源代码\实例15_键盘显示模块\实例15_键盘显示模块-显示驱动测试\System.c
(0001) /*********************************************************/
(0002) /* */
(0003) /* 实例15 键盘显示模块 */
(0004) /* */
(0005) /* 显示驱动测试程序 */
(0006) /* */
(0007) /* 程序设计 江海波 */
(0008) /* */
(0009) /* 编写时间 : 2007-06 版本 : V1.0 */
(0010) /* */
(0011) /* 提示 : 代码受版权保护,示例程序用于工程应谨慎 */
(0012) /* */
(0013) /* E-mail : soundman@sohu.com */
(0014) /*-------------------------------------------------------*/
(0015) /* 硬件环境: */
(0016) /* */
(0017) /* 实验电路板,ATmega48单片机,CPU时钟1MHz */
(0018) /* ------------------------------------------------------*/
(0019) /* 软件环境: */
(0020) /* */
(0021) /* ICCAVR 6.31A */
(0022) /* ------------------------------------------------------*/
(0023) /* 最后修改时间: */
(0024) /* */
(0025) /*-------------------------------------------------------*/
(0026) /* 历史版本纪录: */
(0027) /* */
(0028) /*********************************************************/
(0029)
(0030) /********************
(0031) * 头 文 件 配 置 区 *
(0032) ********************/
(0033) # include "PF_Config.h"
(0034)
(0035) /********************
(0036) * 系 统 宏 定 义 *
(0037) ********************/
(0038)
(0039) /*------------------*
(0040) * 常 数 宏 定 义 *
(0041) *------------------*/
(0042)
(0043) #define ExtPortNum 3
(0044)
(0045) #define Key_Press 0x00
(0046) #define Key_Bounce 0x01
(0047) #define Key_Release 0x02
(0048)
(0049) #define PINE PortBuffer[0]
(0050) #define PORTF PortBuffer[1]
(0051) #define PORTG PortBuffer[2]
(0052)
(0053) #define KeyPin PINE
(0054) #define ScanPort PORTG
(0055) #define SegPort PORTF
(0056)
(0057) unsigned char PortBuffer[3];
(0058) unsigned char LEDDisBuffer[8];
(0059)
(0060) /*------------------*
(0061) * 动 作 宏 定 义 *
(0062) *------------------*/
(0063)
(0064) /********************
(0065) * 模块结构体定义区 *
(0066) ********************/
(0067)
(0068) /********************
(0069) * 模块函数声明区 *
(0070) ********************/
(0071)
(0072) /********************
(0073) * 模块变量声明区 *
(0074) ********************/
(0075)
(0076) const unsigned char DisTab[]=
(0077) {
(0078) 0xFC,0x60,0xDA,0xF2,0x66, //0,1,2,3,4
(0079) 0xB6,0xBE,0xE0,0xFE,0xF6, //5,6,7,8,9
(0080) 0xEE,0x3E,0x9C,0x7A,0x9E, //A,b,C,d,E
(0081) 0x8E,0xCE,0x1C,0x6E,0x7C, //F,P,L,H,U
(0082) 0x0A,0x10,0x02 //r,_,-
(0083) };
(0084)
(0085) /***********************************************************
(0086) * 函数说明:端口通讯程序 *
(0087) * 输入: 无 *
(0088) * 输出: 无 *
(0089) * 调用函数: *
(0090) ***********************************************************/
(0091) void LEDDisplay (void)
(0092) {
(0093) static unsigned char ScanStatu = 0; //扫描状态标志,扫描程序内部使用
(0094) unsigned char LocalTime; //函数内部使用的时标
(0095)
(0096) LocalTime = g_wSystemTimer%20;
008D E124 LDI R18,0x14
008E E030 LDI R19,0
008F 91000103 LDS R16,g_wSystemTimer
0091 91100104 LDS R17,g_wSystemTimer+1
0093 D056 RCALL mod16u
0094 2F40 MOV R20,R16
(0097)
(0098) if (LocalTime > 16)
0095 E180 LDI R24,0x10
0096 1780 CP R24,R16
0097 F408 BCC 0x0099
(0099) return;
0098 C017 RJMP 0x00B0
(0100) else
(0101) {
(0102) LocalTime >>= 1;
0099 9546 LSR R20
(0103) ScanPort = (~(1<<LocalTime));
009A E001 LDI R16,1
009B 2F14 MOV R17,R20
009C D0B6 RCALL lsl8
009D 2E20 MOV R2,R16
009E 9420 COM R2
009F 92200112 STS PortBuffer+2,R2
(0104) SegPort = (DisTab[LEDDisBuffer[LocalTime]]);
00A1 E088 LDI R24,0x8
00A2 E091 LDI R25,1
00A3 2FE4 MOV R30,R20
00A4 27FF CLR R31
00A5 0FE8 ADD R30,R24
00A6 1FF9 ADC R31,R25
00A7 81E0 LDD R30,Z+0
00A8 27FF CLR R31
00A9 E384 LDI R24,0x34
00AA E090 LDI R25,0
00AB 0FE8 ADD R30,R24
00AC 1FF9 ADC R31,R25
00AD 91E4 LPM R30,0(Z)
00AE 93E00111 STS PortBuffer+1,R30
(0105) }
00B0 D060 RCALL pop_gset1
00B1 9508 RET
(0106) }
(0107)
(0108) /***********************************************************
(0109) * 函数说明:端口通讯程序 *
(0110) * 输入: 无 *
(0111) * 输出: 无 *
(0112) * 调用函数: *
(0113) ***********************************************************/
(0114) void Port_refresh (void)
(0115) {
(0116) unsigned char i;
(0117)
(0118) SS_Low; //模拟#SS的下跳沿
_Port_refresh:
i --> R16
00B2 982A CBI 0x05,2
(0119)
(0120) for (i=0; i<ExtPortNum; i++)
00B3 2700 CLR R16
00B4 C00C RJMP 0x00C1
(0121) {
(0122) SPDR = PortBuffer[i]; //刷新虚拟端口的一个字节
00B5 E180 LDI R24,0x10
00B6 E091 LDI R25,1
00B7 2FE0 MOV R30,R16
00B8 27FF CLR R31
00B9 0FE8 ADD R30,R24
00BA 1FF9 ADC R31,R25
00BB 8020 LDD R2,Z+0
00BC BC2E OUT 0x2E,R2
(0123) while(!(SPSR&(1<<SPIF))); //等待通讯完成
00BD B42D IN R2,0x2D
00BE FE27 SBRS R2,7
00BF CFFD RJMP 0x00BD
00C0 9503 INC R16
00C1 3003 CPI R16,3
00C2 F390 BCS 0x00B5
(0124) }
(0125)
(0126) SS_High; //模拟#SS的上跳沿
00C3 9A2A SBI 0x05,2
00C4 9508 RET
(0127) }
(0128)
(0129) /***********************************************************
(0130) * 函数说明:主函数 *
(0131) * 输入: 无 *
(0132) * 输出: 无 *
(0133) * 调用函数:System_INIT() *
(0134) ***********************************************************/
(0135) void main(void)
(0136) {
(0137) System_INIT(); //代码初始化
_main:
00C5 DF84 RCALL _System_INIT
(0138)
(0139) LEDDisBuffer[0] = 0x00;
00C6 2422 CLR R2
00C7 92200108 STS LEDDisBuffer,R2
(0140) LEDDisBuffer[1] = 0x01;
00C9 E081 LDI R24,1
00CA 93800109 STS LEDDisBuffer+1,R24
(0141) LEDDisBuffer[2] = 0x02;
00CC E082 LDI R24,2
00CD 9380010A STS LEDDisBuffer+2,R24
(0142) LEDDisBuffer[3] = 0x03;
00CF E083 LDI R24,3
00D0 9380010B STS LEDDisBuffer+3,R24
(0143) LEDDisBuffer[4] = 0x04;
00D2 E084 LDI R24,4
00D3 9380010C STS 0x10C,R24
(0144) LEDDisBuffer[5] = 0x05;
00D5 E085 LDI R24,5
00D6 9380010D STS 0x10D,R24
(0145) LEDDisBuffer[6] = 0x06;
00D8 E086 LDI R24,6
00D9 9380010E STS 0x10E,R24
(0146) LEDDisBuffer[7] = 0x07;
00DB E087 LDI R24,7
00DC 9380010F STS 0x10F,R24
00DE C009 RJMP 0x00E8
(0147)
(0148) while(TRUE) //超级循环
(0149) {
(0150) if (DoTime==TRUE)
00DF 91800102 LDS R24,DoTime
00E1 3081 CPI R24,1
00E2 F429 BNE 0x00E8
(0151) {
(0152) DoTime=FALSE;
00E3 2422 CLR R2
00E4 92200102 STS DoTime,R2
(0153) LEDDisplay();
00E6 DFA5 RCALL _LEDDisplay
(0154) Port_refresh();
FILE: <library>
00E7 DFCA RCALL _Port_refresh
00E8 CFF6 RJMP 0x00DF
00E9 9508 RET
mod16u:
00EA 9468 BSET 6
00EB C001 RJMP xdiv16u
div16u:
00EC 94E8 BCLR 6
xdiv16u:
00ED 92EA ST R14,-Y
00EE 92FA ST R15,-Y
00EF 938A ST R24,-Y
00F0 24EE CLR R14
00F1 24FF CLR R15
00F2 E180 LDI R24,0x10
00F3 0F00 LSL R16
00F4 1F11 ROL R17
00F5 1CEE ROL R14
00F6 1CFF ROL R15
00F7 16E2 CP R14,R18
00F8 06F3 CPC R15,R19
00F9 F018 BCS 0x00FD
00FA 1AE2 SUB R14,R18
00FB 0AF3 SBC R15,R19
00FC 9503 INC R16
00FD 958A DEC R24
00FE F7A1 BNE 0x00F3
00FF F416 BRTC 0x0102
0100 2D0E MOV R16,R14
0101 2D1F MOV R17,R15
0102 9189 LD R24,Y+
0103 90F9 LD R15,Y+
0104 90E9 LD R14,Y+
0105 9508 RET
push_gset5:
0106 92FA ST R15,-Y
0107 92EA ST R14,-Y
push_gset4:
0108 92DA ST R13,-Y
0109 92CA ST R12,-Y
push_gset3:
010A 92BA ST R11,-Y
010B 92AA ST R10,-Y
push_gset2:
010C 937A ST R23,-Y
010D 936A ST R22,-Y
push_gset1:
010E 935A ST R21,-Y
010F 934A ST R20,-Y
0110 9508 RET
pop_gset1:
0111 E0E1 LDI R30,1
pop:
0112 9149 LD R20,Y+
0113 9159 LD R21,Y+
0114 FDE0 SBRC R30,0
0115 9508 RET
0116 9169 LD R22,Y+
0117 9179 LD R23,Y+
0118 FDE1 SBRC R30,1
0119 9508 RET
011A 90A9 LD R10,Y+
011B 90B9 LD R11,Y+
011C FDE2 SBRC R30,2
011D 9508 RET
011E 90C9 LD R12,Y+
011F 90D9 LD R13,Y+
0120 FDE3 SBRC R30,3
0121 9508 RET
0122 90E9 LD R14,Y+
0123 90F9 LD R15,Y+
0124 9508 RET
push_lset:
0125 93FA ST R31,-Y
0126 93EA ST R30,-Y
0127 93BA ST R27,-Y
0128 93AA ST R26,-Y
0129 939A ST R25,-Y
012A 938A ST R24,-Y
012B 933A ST R19,-Y
012C 932A ST R18,-Y
012D 931A ST R17,-Y
012E 930A ST R16,-Y
012F 929A ST R9,-Y
0130 928A ST R8,-Y
0131 927A ST R7,-Y
0132 926A ST R6,-Y
0133 925A ST R5,-Y
0134 924A ST R4,-Y
0135 923A ST R3,-Y
0136 922A ST R2,-Y
0137 921A ST R1,-Y
0138 920A ST R0,-Y
0139 B60F IN R0,0x3F
013A 920A ST R0,-Y
013B 9508 RET
pop_lset:
013C 9009 LD R0,Y+
013D BE0F OUT 0x3F,R0
013E 9009 LD R0,Y+
013F 9019 LD R1,Y+
0140 9029 LD R2,Y+
0141 9039 LD R3,Y+
0142 9049 LD R4,Y+
0143 9059 LD R5,Y+
0144 9069 LD R6,Y+
0145 9079 LD R7,Y+
0146 9089 LD R8,Y+
0147 9099 LD R9,Y+
0148 9109 LD R16,Y+
0149 9119 LD R17,Y+
014A 9129 LD R18,Y+
014B 9139 LD R19,Y+
014C 9189 LD R24,Y+
014D 9199 LD R25,Y+
014E 91A9 LD R26,Y+
014F 91B9 LD R27,Y+
0150 91E9 LD R30,Y+
0151 91F9 LD R31,Y+
0152 9508 RET
lsl8:
0153 2311 TST R17
0154 F019 BEQ 0x0158
0155 0F00 LSL R16
0156 951A DEC R17
0157 CFFB RJMP lsl8
0158 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -