⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 键盘显示模块.lst

📁 《深入浅出AVR单片机——从ATmega48/88/168开始》的实例程序源代码
💻 LST
📖 第 1 页 / 共 2 页
字号:
_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 + -