?? led_key.lst
字號:
C51 COMPILER V7.10 LED_KEY 01/02/2005 16:12:26 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 01/02/2005 16:12:26 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 01/02/2005 16:12:26 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 01/02/2005 16:12:26 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 + -