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

📄 键盘显示模块.lst

📁 《深入浅出AVR单片机——从ATmega48/88/168开始》的实例程序源代码
💻 LST
📖 第 1 页 / 共 3 页
字号:
(0011) *  [支 持 库]                                              *
(0012) *   支持库名称:KeyDis_Drv.h                               *
(0013) *   需要版本:  -----                                      *
(0014) *   支持库说明:键盘显示模块驱动声明库                     *
(0015) *                                                          *
(0016) *   支持库名称:                                           *
(0017) *   需要版本:  -----                                      *
(0018) *   支持库说明:                                           *
(0019) * -------------------------------------------------------- *
(0020) *  [版本更新]                                              *
(0021) *   修改:                                                 *
(0022) *   修改日期:                                             *
(0023) *   版本:                                                 *
(0024) * -------------------------------------------------------- *
(0025) *  [版本历史]                                              *
(0026) * -------------------------------------------------------- *
(0027) *  [使用说明]                                              *
(0028) ***********************************************************/
(0029) 
(0030) /********************
(0031) * 头 文 件 配 置 区 *
(0032) ********************/
(0033) #include <iom48v.h>   //在这里填写你所用处理器的专用头文件 //
(0034) #include "EX_Support.h"
(0035) #include "KeyDis_Drv.h"
(0036) 
(0037) /********************
(0038) *   系 统 宏 定 义  *
(0039) ********************/
(0040) 
(0041) /*------------------*
(0042) *   常 数 宏 定 义  *
(0043) *------------------*/
(0044) 
(0045) #define ExtPortNum 3
(0046) 
(0047) #define Key_Press 0x00
(0048) #define Key_Bounce 0x01
(0049) #define Key_Release 0x02
(0050) 
(0051) #define PINE PortBuffer[0]
(0052) #define PORTF PortBuffer[1]
(0053) #define PORTG PortBuffer[2]
(0054) 
(0055) #define KeyPin PINE
(0056) #define ScanPort PORTG
(0057) #define SegPort PORTF
(0058) 
(0059) /*------------------*
(0060) *   动 作 宏 定 义  *
(0061) *------------------*/
(0062) 
(0063) #define SS_Low PORTB &= ~(1<<2)
(0064) #define SS_High PORTB |= (1<<2)
(0065) 
(0066) /********************
(0067) *  模块结构体定义区 *
(0068) ********************/
(0069) 
(0070) /********************
(0071) *   函 数 声 明 区  *
(0072) ********************/
(0073) 
(0074) /********************
(0075) *   模块函数声明区  *
(0076) ********************/
(0077) 
(0078) /********************
(0079) *   模块变量声明区  *
(0080) ********************/
(0081) 
(0082) /********************
(0083) *   全局变量声明区  *
(0084) ********************/
(0085) 
(0086) unsigned char PortBuffer[3];
(0087) unsigned char LEDDisBuffer[8];
(0088) unsigned char KeyBuffer;
(0089) 
(0090) const unsigned char DisTab[]=
(0091) {
(0092) 	0xFC,0x60,0xDA,0xF2,0x66,	//0,1,2,3,4
(0093) 	0xB6,0xBE,0xE0,0xFE,0xF6,	//5,6,7,8,9
(0094) 	0xEE,0x3E,0x9C,0x7A,0x9E,	//A,b,C,d,E
(0095) 	0x8E,0xCE,0x1C,0x6E,0x7C,	//F,P,L,H,U
(0096) 	0x0A,0x10,0x02				//r,_,-
(0097) };
(0098) 
(0099) /***********************************************************
(0100) *   函数声明:SPI初始化程序                                *
(0101) *   输入:    无                                           *
(0102) *   输出:    无                                           *
(0103) *   调用函数:无                                           *
(0104) ***********************************************************/
(0105) 
(0106) void SPI_INIT (void)
(0107) {
(0108)     SPCR = 0x7D;    //禁止SPI中断,使能SPI模块,LSB先传送,选择主机模式,空闲时时钟为高,时钟结束沿采样,时钟频率64分频
_SPI_INIT:
    0088 E78D      LDI	R24,0x7D
    0089 BD8C      OUT	0x2C,R24
(0109)     SPSR = 0x00;    //不使用SPI倍速
    008A 2422      CLR	R2
    008B BC2D      OUT	0x2D,R2
    008C 9508      RET
_LEDDisplay:
  LocalTime            --> R20
    008D D148      RCALL	push_gset1
(0110) }
(0111) 
(0112) /***********************************************************
(0113) *   函数说明:端口通讯程序                                 *
(0114) *   输入:    无                                           *
(0115) *   输出:    无                                           *
(0116) *   调用函数:                                             *
(0117) ***********************************************************/
(0118) void LEDDisplay (void)
(0119) {
(0120)     static unsigned char ScanStatu = 0;     //扫描状态标志,扫描程序内部使用
(0121)     unsigned char LocalTime;                //函数内部使用的时标
(0122) 
(0123)     LocalTime = g_wSystemTimer%20;
    008E E124      LDI	R18,0x14
    008F E030      LDI	R19,0
    0090 91000103  LDS	R16,g_wSystemTimer
    0092 91100104  LDS	R17,g_wSystemTimer+1
    0094 D11D      RCALL	mod16u
    0095 2F40      MOV	R20,R16
(0124) 
(0125)     if (LocalTime > 16)
    0096 E180      LDI	R24,0x10
    0097 1780      CP	R24,R16
    0098 F420      BCC	0x009D
(0126)     {
(0127)         ScanPort = 0xFF;
    0099 EF8F      LDI	R24,0xFF
    009A 93800116  STS	PortBuffer+2,R24
(0128)         return;
    009C C017      RJMP	0x00B4
(0129)     }
(0130)             
(0131)     else
(0132)     {
(0133)         LocalTime >>= 1;
    009D 9546      LSR	R20
(0134)         ScanPort = (~(1<<LocalTime));
    009E E001      LDI	R16,1
    009F 2F14      MOV	R17,R20
    00A0 D17A      RCALL	lsl8
    00A1 2E20      MOV	R2,R16
    00A2 9420      COM	R2
    00A3 92200116  STS	PortBuffer+2,R2
(0135)         SegPort = (DisTab[LEDDisBuffer[LocalTime]]);
    00A5 E08C      LDI	R24,0xC
    00A6 E091      LDI	R25,1
    00A7 2FE4      MOV	R30,R20
    00A8 27FF      CLR	R31
    00A9 0FE8      ADD	R30,R24
    00AA 1FF9      ADC	R31,R25
    00AB 81E0      LDD	R30,Z+0
    00AC 27FF      CLR	R31
    00AD E384      LDI	R24,0x34
    00AE E090      LDI	R25,0
    00AF 0FE8      ADD	R30,R24
    00B0 1FF9      ADC	R31,R25
    00B1 91E4      LPM	R30,0(Z)
    00B2 93E00115  STS	PortBuffer+1,R30
(0136)     }
    00B4 D124      RCALL	pop_gset1
    00B5 9508      RET
(0137) }
(0138) 
(0139) /***********************************************************
(0140) *   函数说明:按键处理程序                                 *
(0141) *   输入:    无                                           *
(0142) *   输出:    无                                           *
(0143) *   调用函数:                                             *
(0144) ***********************************************************/
(0145) unsigned char Key_service (void)
(0146) {
(0147)     static unsigned char KeyStatu = Key_Press;
(0148)     static unsigned char KeyTimer = 0;
(0149)     static unsigned char KeyTmpValue;
(0150) 
(0151)     switch (KeyStatu)
_Key_service:
    00B6 91000106  LDS	R16,KeyStatu
    00B8 2711      CLR	R17
    00B9 3000      CPI	R16,0
    00BA 0701      CPC	R16,R17
    00BB F049      BEQ	0x00C5
    00BC 3001      CPI	R16,1
    00BD E0E0      LDI	R30,0
    00BE 071E      CPC	R17,R30
    00BF F0B1      BEQ	0x00D6
    00C0 3002      CPI	R16,2
    00C1 E0E0      LDI	R30,0
    00C2 071E      CPC	R17,R30
    00C3 F151      BEQ	0x00EE
    00C4 C090      RJMP	0x0155
(0152)     {
(0153)         case Key_Press :                //检测按键按下
(0154)         {
(0155)             if (KeyPin != 0xFF)         //检测是否有键按下
    00C5 91800114  LDS	R24,PortBuffer
    00C7 3F8F      CPI	R24,0xFF
    00C8 F409      BNE	0x00CA
    00C9 C08B      RJMP	0x0155
(0156)             {
(0157)                 KeyTmpValue = KeyPin;   //暂存键值
    00CA 2E28      MOV	R2,R24
    00CB 9220010A  STS	KeyTmpValue,R2
(0158)                 KeyStatu++;             //如检测到有键按下则翻转处理状态
    00CD 91800106  LDS	R24,KeyStatu
    00CF 5F8F      SUBI	R24,0xFF
    00D0 93800106  STS	KeyStatu,R24
(0159)                 KeyTimer = 10;          //初始化抗抖动定时器,抗抖动时间10mS
    00D2 E08A      LDI	R24,0xA
    00D3 93800107  STS	KeyTimer,R24
(0160)             }
(0161)             break;
    00D5 C07F      RJMP	0x0155
(0162)         }
(0163) 
(0164)         case Key_Bounce :            //抗抖动
(0165)         {
(0166)             KeyTimer--;
    00D6 91800107  LDS	R24,KeyTimer
    00D8 5081      SUBI	R24,1
    00D9 93800107  STS	KeyTimer,R24
(0167)             if (KeyTimer == 0)
    00DB 2388      TST	R24
    00DC F009      BEQ	0x00DE
    00DD C077      RJMP	0x0155
(0168)             {
(0169)                 if (KeyPin != KeyTmpValue)      //检测按键是否依然按下
    00DE 9020010A  LDS	R2,KeyTmpValue
    00E0 90300114  LDS	R3,PortBuffer
    00E2 1432      CP	R3,R2
    00E3 F021      BEQ	0x00E8
(0170)                     KeyStatu = Key_Press;       //按键信号不在了,当作干扰信号丢弃
    00E4 2422      CLR	R2
    00E5 92200106  STS	KeyStatu,R2
    00E7 C06D      RJMP	0x0155
(0171)                 else
(0172)                     KeyStatu++;
    00E8 91800106  LDS	R24,KeyStatu
    00EA 5F8F      SUBI	R24,0xFF
    00EB 93800106  STS	KeyStatu,R24
(0173)             }
(0174)             break;
    00ED C067      RJMP	0x0155
(0175)         }
(0176) 
(0177)         case Key_Release :          //等待按键松开
(0178)         {
(0179)             if (KeyPin == 0xFF)
    00EE 91800114  LDS	R24,PortBuffer
    00F0 3F8F      CPI	R24,0xFF
    00F1 F009      BEQ	0x00F3
    00F2 C062      RJMP	0x0155
(0180)             {                       //若按键已经释放,则提取键值
(0181)                 switch (KeyTmpValue)
    00F3 9100010A  LDS	R16,KeyTmpValue
    00F5 2711      CLR	R17
    00F6 3D0F      CPI	R16,0xDF
    00F7 E0E0      LDI	R30,0
    00F8 071E      CPC	R17,R30
    00F9 F409      BNE	0x00FB
    00FA C048      RJMP	0x0143
    00FB ED8F      LDI	R24,0xDF
    00FC E090      LDI	R25,0
    00FD 1780      CP	R24,R16
    00FE 0791      CPC	R25,R17
    00FF F084      BLT	0x0110
    0100 370F      CPI	R16,0x7F
    0101 E0E0      LDI	R30,0
    0102 071E      CPC	R17,R30
    0103 F409      BNE	0x0105
    0104 C048      RJMP	0x014D
    0105 370F      CPI	R16,0x7F
    0106 E0E0      LDI	R30,0
    0107 071E      CPC	R17,R30
    0108 F40C      BGE	0x010A
    0109 C048      RJMP	0x0152
    010A 3B0F      CPI	R16,0xBF
    010B E0E0      LDI	R30,0
    010C 071E      CPC	R17,R30
    010D F409      BNE	0x010F
    010E C039      RJMP	0x0148
    010F C042      RJMP	0x0152
    0110 3E0F      CPI	R16,0xEF
    0111 E0E0      LDI	R30,0
    0112 071E      CPC	R17,R30
    0113 F151      BEQ	0x013E
    0114 3E0F      CPI	R16,0xEF
    0115 E0E0      LDI	R30,0
    0116 071E      CPC	R17,R30
    0117 F40C      BGE	0x0119
    0118 C039      RJMP	0x0152
    0119 3F07      CPI	R16,0xF7
    011A E0E0      LDI	R30,0
    011B 071E      CPC	R17,R30
    011C F0E1      BEQ	0x0139
    011D 3F0B      CPI	R16,0xFB
    011E E0E0      LDI	R30,0
    011F 071E      CPC	R17,R30
    0120 F099      BEQ	0x0134
    0121 3F0D      CPI	R16,0xFD
    0122 E0E0      LDI	R30,0
    0123 071E      CPC	R17,R30
    0124 F051      BEQ	0x012F
    0125 3F0E      CPI	R16,0xFE
    0126 E0E0      LDI	R30,0
    0127 071E      CPC	R17,R30
    0128 F009      BEQ	0x012A
    0129 C028      RJMP	0x0152
(0182)                 {
(0183)                     case 0xFE :
(0184)                     {
(0185)                         KeyStatu = Key_Press;
    012A 2422      CLR	R2
    012B 92200106  STS	KeyStatu,R2
(0186)                         return Key_8;
    012D E008      LDI	R16,0x8
    012E C027      RJMP	0x0156
(0187)                         break;
(0188)                     }
(0189)                     
(0190)                     case 0xFD :
(0191)                     {
(0192)                         KeyStatu = Key_Press;
    012F 2422      CLR	R2
    0130 92200106  STS	KeyStatu,R2
(0193)                         return Key_7;
    0132 E007      LDI	R16,7
    0133 C022      RJMP	0x0156
(0194)                         break;
(0195)                     }
(0196)                     
(0197)                     case 0xFB :
(0198)                     {
(0199)                         KeyStatu = Key_Press;
    0134 2422      CLR	R2
    0135 92200106  STS	KeyStatu,R2
(0200)                         return Key_6;
    0137 E006      LDI	R16,6
    0138 C01D      RJMP	0x0156
(0201)                         break;
(0202)                     }
(0203)                     
(0204)                     case 0xF7 :
(0205)                     {
(0206)                         KeyStatu = Key_Press;
    0139 2422      CLR	R2
    013A 92200106  STS	KeyStatu,R2
(0207)                         return Key_5;
    013C E005      LDI	R16,5
    013D C018      RJMP	0x0156
(0208)                         break;
(0209)                     }
(0210)                     
(0211)                     case 0xEF :
(0212)                     {
(0213)                         KeyStatu = Key_Press;
    013E 2422      CLR	R2
    013F 92200106  STS	KeyStatu,R2
(0214)                         return Key_4;
    0141 E004      LDI	R16,4
    0142 C013      RJMP	0x0156
(0215)                         break;
(0216)                     }
(0217)                     

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -