📄 键盘显示模块.lst
字号:
(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 + -