📄 led_key.lst
字号:
C51 COMPILER V7.10 LED_KEY 12/14/2004 10:51:16 PAGE 1
C51 COMPILER V7.10, COMPILATION OF MODULE LED_KEY
OBJECT MODULE PLACED IN .\Led_key.obj
COMPILER INVOKED BY: C:\Program Files\Keil\C51\BIN\C51.EXE ..\SourceFile\Led_key.c LARGE BROWSE DEBUG OBJECTEXTEND PRINT
-(.\Led_key.lst) OBJECT(.\Led_key.obj)
line level source
1 /*************************************************/
2
3 /********************显示与键盘接口********/
4
5 /*************2002年12月13日*******************/
6
7 /************WROTE BY WANGSW********************/
8 #include "reg52x2.h"
9 #include <intrins.h>
10
11 #include "define.h"
12
13 #include "led_key.h"
14
15 #define KEY_SHORT_INTERVAL 2
16 #define KEY_LONG_INTERVAL 40
17
18 sbit SDA = P1^0; /*模拟串行转并行口,下降沿有效,输出为低电平可控点亮*/
19 sbit SCL = P1^1; /*模拟串并行转换的时钟信号线*/
20
21 sbit KEY = P1^2; /*键盘,低电平有效,检测位*/
22
23 sbit DISPLAY0 = P1^3; /*EBIT4, 低电平有效*/
24 sbit DISPLAY1 = P1^4; /*EBIT3*/
25 sbit DISPLAY2 = P1^5; /*EBIT2*/
26 sbit DISPLAY3 = P1^6; /*EBIT1*/
27
28 sbit LED = P1^7; /*EBIT0,低电平有效*/
29
30 bool LED_KEY_SIGN = FALSE;
31
32 byte data KeyCounter = 0;
33
34 byte data KeyIntervalSafeguard = 0; /*用于连续两个按键速度过快导致按键混乱*/
35
36 byte data g_KeyStore = 0x00;
37
38 static byte code KeyMap[8] = /*键盘转换*/
39 {
40 KEY1, KEY2, KEY3, KEY4, KEY5, KEY6, KEY7, KEY8
41 };
42
43 static byte code LedDisplayMap[2][16] =
44 {
45 {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E},
46 {0x40, 0x79, 0x24, 0x30, 0x19, 0x12, 0x02, 0x78, 0x00, 0x10, 0x08, 0x03, 0x46, 0x21, 0x06, 0x0E}
47 };
48
49 static void SendData(byte value);
50
51 static byte KeyCheck(void); /*键值检测*/
52
53
54 /******************************************************************************************
C51 COMPILER V7.10 LED_KEY 12/14/2004 10:51:16 PAGE 2
55 *函数名: SendData
56 *参数: value 需要进行串并转换的数据,是一字节8位数据
57 *返回值: 无
58 *描述: 把数据value按照从高位到低位串行发送到串并转换电路输
59 入端,主要可以用来协助完成底层LED显示
60 *编写: 王绍伟
61 *版本信息: V1.0 2003年8月15日
62 ******************************************************************************************/
63 static void SendData(byte value)
64 {
65 1 byte data counter;
66 1 SCL = 1;
67 1 for(counter = 0; counter < 8; counter++)
68 1 {
69 2 if(value & 0x80) /*判断数据*/
70 2 {
71 3 SDA = 1;
72 3 }
73 2 else
74 2 {
75 3 SDA = 0;
76 3 }
77 2 SCL = 0; /*产生时钟动作*/
78 2 SCL = 1;
79 2 value = value << 1;
80 2 }
81 1 }
82
83
84 /******************************************************************************************
85 *函数名: KeyCheck
86 *参数: 无
87 *返回值: counter 返回键值
88 ERROR 返回出错信息
89 *描述: 通过扫描键盘返回按下的按键号
90 *编写: 王绍伟
91 *版本信息: V1.0 2003年8月15日
92 ******************************************************************************************/
93 static byte KeyCheck(void)
94 {
95 1 byte counter;
96 1 SDA = 1; /*注意,原来数据为0,现在为1*/
97 1 for(counter = 0; counter < 8; counter++) /*r先将扫描线上都置为高电平*/
98 1 {
99 2 SCL = 0;
100 2 SCL = 1;
101 2 }
102 1 SDA = 0; /*r然后逐行置为低电平,侦测P1.2(KEY反馈线)*/
103 1
104 1 for(counter = 0; counter < 8; counter++) /*需要修改计数值*/
105 1 {
106 2 SCL = 0;
107 2 SCL = 1;
108 2 delay(1); /*必须的延迟,否则数据出错*/
109 2 if(!KEY)
110 2 {
111 3 return(counter); /*r扫描出按下键就返回按下的键值并退出函数*/
112 3 }
113 2 }
114 1 return(ERROR); /*r若没有扫描到按下键就返回ERROR*/
115 1 }
116
C51 COMPILER V7.10 LED_KEY 12/14/2004 10:51:16 PAGE 3
117
118
119
120 /******************************************************************************************
121 *函数名: led_key_led_control
122 *参数: LedIndex 点亮的LED发光管号,其取值从1~8有效
123 *返回值: 无
124 *描述: 根据LedIndex的值决定选择点亮哪一只LED管
125 *编写: 王绍伟
126 *版本信息: V1.0 2003年8月15日
127 ******************************************************************************************/
128
129 extern void led_key_led_control(byte LedIndex)
130 {
131 1 P1 = 0xFF;
132 1 if(LedIndex)
133 1 {
134 2 LedIndex = 1 << (LedIndex - 1); /*r当1左移(LedIndex-1)位后,发送到串并行转换电路*/
135 2 SendData(~LedIndex);
136 2 LED = 0; /*r开启DP-51的Q1三极管,这样就可以开启LED管点亮*/
137 2 }
138 1
139 1
140 1 }
141
142
143 /******************************************************************************************
144 *函数名: led_key_led_display_control
145 *参数: value LED显示数码值
146 boDp 是否显示小数点
147 LedDisplayIndex 代表显示那一块LED
148 *返回值: 无
149 *描述: 对选择的LED模块让其显示一个数码的程序
150 *编写: 王绍伟
151 *版本信息: V1.0 2003年8月15日
152 ******************************************************************************************/
153 extern void led_key_led_display_control(byte LedDisplayIndex, bool boDp, byte value)
154 {
155 1 byte i;
156 1 i = boDp;
157 1 P1 = 0xFF;
158 1 SendData(LedDisplayMap[i][value]); /*r发送LED显示数据到串并转换电路*/
159 1
160 1 P1 &= ~(0x04 << LedDisplayIndex);
161 1 }
162
163
164 /******************************************************************************************
165 *函数名: led_key_key_check
166 *参数: 无
167 *返回值: 无
168 *描述: 按键扫描判定程序
169 *编写: 王绍伟
170 *版本信息: V1.0 2003年8月15日
171 ******************************************************************************************/
172 extern void led_key_key_check(void) /*5*5=25mS*/
173 {
174 1 byte i;
175 1
176 1 P1 = 0xFF; /*初始化原状态,以免引起错误*/
177 1 SDA = 0;
178 1 for(i = 0; i < 8; i++) /*r基于DP-51硬件构造,先向扫描线上发送低电平*/
C51 COMPILER V7.10 LED_KEY 12/14/2004 10:51:16 PAGE 4
179 1 {
180 2 SCL = 0;
181 2 SCL = 1;
182 2 }
183 1
184 1 if(KEY) /*r检测反馈线,若无键按下,则KEY(P1.2)则会保持高电平,此时判定无键按下,退出键扫程序*/
185 1 {
186 2 KeyCounter = 0;
187 2 return;
188 2 }
189 1
190 1 if(KeyIntervalSafeguard) /*设置这段程序是为了让判定两次按键之间的时间间隔大于等于0.1s,此段程序在初始化后
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -