📄 led_8_8.lst
字号:
C51 COMPILER V8.02 LED_8_8 08/22/2008 11:51:52 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE LED_8_8
OBJECT MODULE PLACED IN LED_8_8.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE LED_8_8.c BROWSE DEBUG OBJECTEXTEND TABS(2)
line level source
1 #include "LED_8_8.H"
2
3 #define LED1 0x00
4 #define LED2 0x08
5 #define LED3 0x10
6 #define LED4 0x18
7
8 sbit SPI_DATA = P1^4;
9 sbit SPI_CS = P1^3;
10 sbit SPI_CLK = P1^2;
11 void Delay_1ms(int z);
12
13 unsigned char Show[32] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
14 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-};
15
16 unsigned char Show_Temp[32] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,
17 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-};
18
19 unsigned char Pos_x = 0; //坐标初始位置(0,0)对应第2个点阵最后一行的第一个点上
20 unsigned char Pos_y = 0;
21 unsigned char LED_Sel = 2; //点阵块的选择,范围1--4
22 unsigned char Dis_num = 30; //坐标当前位置所对应显示数组位,范围0--31;
23 //****************************************************************************
24 //* 名称:LocateXY()
25 //* 功能:使当前坐标位置亮,但移动后要使它灭
26 //* 注意:(7 - Pos_y)<<1 + 16 左移的优先级比加减低,故要加括号:((7 - Pos_y)<<1) + 16
27 //****************************************************************************
28 void LocateXY(void) //
29 {
30 1 if( (Pos_x>=0) && (Pos_x<8) )
31 1 {
32 2 if( (Pos_y>=0) && (Pos_y<8) ) //第二个点阵
33 2 {
34 3 LED_Sel = 2;
35 3 Dis_num = ((7 - Pos_y)<<1) + 16; //左移1位相当与乘以2!
36 3 }
37 2 else
38 2 if( Pos_y>=8 && Pos_y<16) //第一个点阵
39 2 {
40 3 LED_Sel = 1;
41 3 Dis_num = (15 - Pos_y)<<1;
42 3 }
43 2
44 2 }
45 1 else
46 1 if( Pos_x>=8 && Pos_x<16)
47 1 {
48 2 if( Pos_y>=0 && Pos_y<8) //第四个点阵
49 2 {
50 3 LED_Sel = 4;
51 3 Dis_num = ((7 - Pos_y)<<1) + 17;
52 3 }
C51 COMPILER V8.02 LED_8_8 08/22/2008 11:51:52 PAGE 2
53 2 else
54 2 if( Pos_y>=8 && Pos_y<16) //第三个点阵
55 2 {
56 3 LED_Sel = 3;
57 3 Dis_num = ((15 - Pos_y)<<1) + 1;
58 3 }
59 2
60 2 }
61 1 //=========================坐标所在的位置要为亮,当移走时就灭=======================
62 1 if(Pos_x < 8)
63 1 Show[Dis_num] |= ( 0x80>>Pos_x );
64 1 else
65 1 Show[Dis_num] |= ( 0x80>>(Pos_x-8) );
66 1
67 1 }
68
69 //****************************************************************************
70 //* 名称:Locate_Task()
71 //* 功能:实现光标的移动和点阵的亮灭控制,相当于在点阵上画图
72 //* 说明:可惜这点阵板没有地址锁存芯片74HC573,与键盘有冲突了
73 //****************************************************************************
74 void Locate_Task(void)
75 {
76 1 //*************************************************************
77 1 LocateXY();
78 1 //************************************************************
79 1 if(KeyValue)
80 1 {
81 2 if(KeyValue < 5) //当执行光标移动工作时,要把原来的光标显示清除
82 2 {
83 3 Show[Dis_num] = Show_Temp[Dis_num];
84 3 }
85 2 switch(KeyValue)
86 2 {
87 3 case 1: Pos_x++;
88 3 if(Pos_x >= 16)
89 3 { Pos_x = 0; }
90 3 break;
91 3
92 3 case 2: if(Pos_x == 0)
93 3 { Pos_x = 15; }
94 3 else
95 3 Pos_x--;
96 3 break;
97 3
98 3 case 3: Pos_y++;
99 3 if(Pos_y >= 16)
100 3 { Pos_y = 0; }
101 3 break;
102 3
103 3 case 4: if(Pos_y == 0)
104 3 { Pos_y = 15; }
105 3 else
106 3 Pos_y--;
107 3 break;
108 3
109 3 case 5: if(Show[Dis_num] != Show_Temp[Dis_num]) //当坐标值不相等时(即原来没有置1)置1
110 3 {
111 4 if(Pos_x < 8)
112 4 Show[Dis_num] |= (0x80>>Pos_x);
113 4 else
114 4 Show[Dis_num] |= (0x80>>(Pos_x-8));
C51 COMPILER V8.02 LED_8_8 08/22/2008 11:51:52 PAGE 3
115 4 }
116 3 else //清0
117 3 {
118 4 if(Pos_x < 8)
119 4 Show[Dis_num] &= (0x7F>>Pos_x);
120 4 else
121 4 Show[Dis_num] &= (0x7F>>(Pos_x-8));
122 4 }
123 3
124 3 Show_Temp[Dis_num] = Show[Dis_num]; //一定要保存当前值
125 3 break;
126 3 }
127 2
128 2 KeyValue = 0;
129 2 }
130 1
131 1
132 1 }
133
134 /*
135 void LED_Dis_8(unsigned char LED_Num,unsigned char *Word)
136 {
137 unsigned char row;
138 LED_Num = LED_Num<<3;
139 for(row=0; row<8; row++)
140 {
141 P2 = LED_Num|row;
142 HC595_SendDat(Word[row]);
143 Delay_1ms(1);
144
145 }
146 }
147 */
148 /*
149 void LED_Dis_16(unsigned char *Word) //16*16点阵的显示,没用到定时中断,用延时
150 {
151 unsigned char i = 0;
152 unsigned char row;
153 row = 0 ;
154 for(i=0; i<=7; i++) //显示第1个点阵
155 {
156 P2 = i;
157 HC595_SendDat(Word[row]);
158 row = row+2;
159 Delay_1ms(1);
160 }
161 row = 1;
162 for(i=0; i<8; i++) //显示第2个点阵
163 {
164 P2 = (2<<3)|i;
165 HC595_SendDat(Word[row]);
166 row = row+2;
167 Delay_1ms(1);
168
169 }
170 row = 16;
171
172 for(i=0; i<8; i++) //显示第3个点阵
173 {
174 P2 = (1<<3)|i;
175 HC595_SendDat(Word[row]);
176 row = row+2;
C51 COMPILER V8.02 LED_8_8 08/22/2008 11:51:52 PAGE 4
177 Delay_1ms(1);
178
179 }
180 row = 17;
181 for(i=0; i<8; i++) //显示第4个点阵
182 {
183 P2 = (3<<3)|i;
184 HC595_SendDat(Word[row]);
185 row = row+2;
186 Delay_1ms(1);
187
188 }
189
190 }
191 */
192 /*
193
194 void LED_Dis_16(unsigned char *Word)
195 {
196 unsigned char i = 0;
197 unsigned char row;
198 row = 0 ;
199 for(i=0; i<8; i++) //先显示上面2个点阵
200 {
201 P2 = (0<<3)|i;
202 HC595_SendDat(Word[row]);
203 row++;
204 Delay_1ms(1);
205 P2 = (2<<3)|i;
206 HC595_SendDat(Word[row]);
207 row++;
208 Delay_1ms(1);
209 }
210 for(i=0; i<8; i++) //再显示下面2个点阵
211 {
212 P2 = (1<<3)|i;
213 HC595_SendDat(Word[row]);
214 row ++;
215 Delay_1ms(1);
216 P2 = (3<<3)|i;
217 HC595_SendDat(Word[row]);
218 row ++;
219 Delay_1ms(1);
220 }
221 }
222 */
223 /****************************************************************************
224 * 名称:LED_Display()
225 * 功能:可实现4个8*8点阵构成的16*16点阵的显示
226 * 入口参数:word 要显示的数组
227 * 说明:在定时中断0中每隔0.75ms调用一次
228 ****************************************************************************/
229 unsigned char Couter_8 = 0;
230 unsigned char LED_Number = 0;
231 //=========================第二版本==============================================
232 unsigned char Show_Number = 0;
233 void LED_Display(unsigned char *Word)
234 {
235 1
236 1 Couter_8++;
237 1 Show_Number = Show_Number + 2; //加2是为了点阵间隔显示,由电路布局决定
238 1
C51 COMPILER V8.02 LED_8_8 08/22/2008 11:51:52 PAGE 5
239 1 if(Couter_8 >= 8)
240 1 {
241 2 Couter_8 = 0;
242 2 LED_Number++;
243 2 if(LED_Number >= 4)
244 2 {
245 3 LED_Number = 0;
246 3 }
247 2 switch(LED_Number) //主要是初始化Show_Number,以减少乘除或移位指令的使用
248 2 {
249 3 case 0:
250 3 Show_Number = 0;
251 3 break;
252 3 case 1:
253 3 Show_Number = 16;
254 3 break;
255 3 case 2:
256 3 Show_Number = 1;
257 3 break;
258 3 case 3:
259 3 Show_Number = 17;
260 3 break;
261 3
262 3 }
263 2 }
264 1 P2 = (LED_Number<<3)|Couter_8;
265 1 HC595_SendDat( Word[Show_Number] );
266 1
267 1 }
268
269 /****************************************************************************
270 * 名称:HC595_SendDat()
271 * 功能:向74HC595发送一字节数据
272 * 入口参数:dat 要发送的数据
273 * 说明:发送数据时,高位先发送。
274 ****************************************************************************/
275 void HC595_SendDat(unsigned char dat)
276 { char i;
277 1
278 1 SPI_CS = 0; // SPI_CS = 0
279 1 for(i=0; i<8; i++) // 发送8位数据
280 1 { SPI_CLK = 0; // SPI_CLK = 0
281 2
282 2 /* 设置SPI的DATA输出值 */
283 2 if( (dat&0x80)!=0 )
284 2 SPI_DATA = 1;
285 2 else
286 2 SPI_DATA = 0;
287 2 dat <<= 1;
288 2 SPI_CLK = 1; // SPI_CLK = 1
289 2
290 2 }
291 1
292 1 SPI_CS = 1; // SPI_CS = 1,输出显示数据
293 1 }
294 /*
295 void Delay_1ms(int z)
296 {
297 int i,j;
298 for(i=0;i<z;i++)
299 for(j=0;j<80;j++);
300 }
C51 COMPILER V8.02 LED_8_8 08/22/2008 11:51:52 PAGE 6
301 */
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 582 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 71 ----
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -