📄 lcd_disp.lst
字号:
C51 COMPILER V8.01 LCD_DISP 06/17/2008 20:51:00 PAGE 1
C51 COMPILER V8.01, COMPILATION OF MODULE LCD_DISP
OBJECT MODULE PLACED IN LCD_Disp.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE LCD_Disp.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /*****************************************************
2 *文件名称:LCD_Disp.c
3 *****************************************************/
4 #include "lCD_PortConfig.h"
5 #include "LCD_Driver.h"
6 #include "LCD_Disp.h"
7 #include "stdlib.h"
8 #include "sch.h"
9
10 uchar Figure_Date [4]={0x00,0x0e,0x04,0x00}; //存放从ROM中读取的基本形状显示代码
11 uchar Figure_Date_New[4]={0x00,0x00,0x00,0x00};
12 uchar Figure_Date_Old[4]={0x00,0x0e,0x04,0x00};
13 uchar Game_Over=1; // 1游戏正常运行,0游戏结束
14 ulong idata Disp_Buff[32]; //定义显示缓存
15 uchar X_Coor=25,Y_Coor=0; //存放X Y坐标
16 uchar Fig_Type=4;
17 uchar Clr_Preview[4]={0,0,0,0}; //用于清除预览框
18 uchar SUM=0; //存储总分
19 uchar speed=0; //速度寄存器
20
21 uchar code a[4]={0,0x06,0x06,0}; //"田"字形
22
23 uchar code b[4]={0x04,0x04,0x04,0x04};//"|"字形
24 uchar code c[4]={0x00,0x00,0x0f,0x00};//"一"字形
25
26 uchar code d[4]={0x00,0x0e,0x04,0x00};
27 uchar code e[4]={0x04,0x0c,0x04,0x00};
28 uchar code f[4]={0x04,0x0e,0x00,0x00};
29 uchar code g[4]={0x04,0x06,0x04,0x00};
30
31 uchar code h[4]={0x00,0x0c,0x06,0x00};
32 uchar code i[4]={0x02,0x06,0x04,0x00};
33
34 uchar code j[4]={0x00,0x06,0x0c,0x00};
35 uchar code k[4]={0x08,0x0c,0x04,0x00};
36
37 uchar code fen[]={0x10,0x01,0x30,0x01,0x10,0x02,0x08,0x04,0x08,0x0C,0x04,0x18,0x02,0x70,0xF9,0x27,
38 0x20,0x04,0x20,0x04,0x20,0x04,0x20,0x04,0x10,0x04,0x08,0x05,0x04,0x02,0x02,0x00}; /*"分",0*/
39
40 uchar code shu[]={0x10,0x04,0x92,0x0C,0x54,0x04,0x38,0x04,0xFF,0x7E,0x38,0x22,0xD4,0x22,0x12,0x23,
41 0x10,0x14,0xFF,0x14,0x48,0x08,0x2C,0x08,0x30,0x14,0x4C,0x72,0x03,0x21,0x00,0x00};/*"数",1*/
42
43 uchar code su[]={0x00,0x01,0x02,0x01,0xF4,0x3F,0x04,0x01,0x00,0x01,0xE0,0x1F,0x27,0x11,0x24,0x11,
44 0xE4,0x1F,0x84,0x05,0x44,0x19,0x34,0x11,0x04,0x01,0x0A,0x01,0xF1,0x7F,0x00,0x00};/*"速",2*/
45
46 uchar code du[]={0x80,0x00,0x00,0x01,0xFC,0x7F,0x44,0x04,0x44,0x04,0xF4,0x3F,0x44,0x04,0xC4,0x07,
47 0x04,0x00,0xE4,0x1F,0x44,0x08,0x84,0x04,0x04,0x03,0x82,0x0C,0x62,0x70,0x19,0x20};/*"度",3*/
48
49 uchar code you[]={0x22,0x04,0x44,0x04,0x44,0x04,0xF0,0x7D,0x21,0x02,0x2A,0x3D,0xEA,0x10,0xA4,0x08,
50 0xA4,0x08,0xA4,0x7E,0xA3,0x08,0x92,0x08,0x92,0x08,0x92,0x08,0xAA,0x0A,0x42,0x04};/*"游",4*/
51
52 uchar code xi[]={0x00,0x02,0x00,0x0A,0x7E,0x12,0x40,0x12,0x22,0x02,0xA4,0x7F,0x18,0x02,0x10,0x22,
53 0x30,0x14,0x28,0x0C,0x48,0x04,0x44,0x0A,0x82,0x49,0x60,0x50,0x00,0x60,0x00,0x40};/*"戏",5*/
54
55 uchar code jie[]={0x08,0x04,0x08,0x04,0x04,0x04,0xC4,0x7F,0x12,0x04,0x0F,0x04,0x88,0x3F,0x04,0x00,
C51 COMPILER V8.01 LCD_DISP 06/17/2008 20:51:00 PAGE 2
56 0x02,0x00,0x9F,0x3F,0x80,0x20,0x80,0x20,0x98,0x20,0x87,0x3F,0x80,0x20,0x00,0x00};/*"结",6*/
57
58 uchar code shu1[]={0x80,0x00,0x80,0x00,0xFF,0x7F,0x80,0x00,0xFC,0x1F,0x84,0x10,0x84,0x10,0xFC,0x1F,
59 0xC4,0x10,0xA0,0x01,0xA0,0x02,0x90,0x0C,0x8C,0x70,0x83,0x20,0x80,0x00,0x80,0x00};/*"束",7*/
60
61 uchar code num[10][16]={
62 {0x00,0x00,0x00,0x18,0x24,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x24,0x18,0x00,0x00},
63 {0x00,0x00,0x00,0x08,0x0E,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x3E,0x00,0x00},/*"1",0*/
64
65 {0x00,0x00,0x00,0x3C,0x42,0x42,0x42,0x20,0x20,0x10,0x08,0x04,0x42,0x7E,0x00,0x00},/*"2",1*/
66
67 {0x00,0x00,0x00,0x3C,0x42,0x42,0x20,0x18,0x20,0x40,0x40,0x42,0x22,0x1C,0x00,0x00},/*"3",2*/
68
69 {0x00,0x00,0x00,0x20,0x30,0x28,0x24,0x24,0x22,0x22,0x7E,0x20,0x20,0x78,0x00,0x00},/*"4",3*/
70
71 {0x00,0x00,0x00,0x7E,0x02,0x02,0x02,0x1A,0x26,0x40,0x40,0x42,0x22,0x1C,0x00,0x00},/*"5",4*/
72
73 {0x00,0x00,0x00,0x38,0x24,0x02,0x02,0x1A,0x26,0x42,0x42,0x42,0x24,0x18,0x00,0x00},/*"6",5*/
74
75 {0x00,0x00,0x00,0x7E,0x22,0x22,0x10,0x10,0x08,0x08,0x08,0x08,0x08,0x08,0x00,0x00},/*"7",6*/
76
77 {0x00,0x00,0x00,0x3C,0x42,0x42,0x42,0x24,0x18,0x24,0x42,0x42,0x42,0x3C,0x00,0x00},/*"8",7*/
78
79 {0x00,0x00,0x00,0x18,0x24,0x42,0x42,0x42,0x64,0x58,0x40,0x40,0x24,0x1C,0x00,0x00},/*"9",8*/
80
81 };/*"0",9*/
82
83 /*--------------------------------------------------
84 *函数名称:Write_OneDot
85 *功 能:在屏幕任意坐标描绘一个点
86 *参 数:X 横坐标(0-63)
87 Y 纵坐标(0-63)
88 color 要填充的颜色 0:白色 1:黑色
89 *返 回:无
90 ---------------------------------------------------*/
91 void Write_OneDot(uchar X,uchar Y,uchar color)
92 {
93 1
94 1 uchar Column_H,Column_L ,Page,Offset, RamDate,temp;
95 1
96 1 if(X<128&&Y<64) //坐标超出显示区域不显示
97 1 {
98 2 Page=Y/8; //将坐标转换为相应的page,column以及位偏移量
99 2 Offset=Y%8;
100 2 Column_L=X&0x0f;
101 2 Column_H=X>>4;
102 2
103 2 LCD_RegWrite(Page|0xb0); //设置地址
104 2 LCD_RegWrite(Column_H|0x10);
105 2 LCD_RegWrite(Column_L);
106 2
107 2 RamDate=LCD_DateRead(); //读取该地址对应的显示数据
108 2
109 2 if(color) //将XY坐标对应的位清零或置一,其余位保持不变
110 2 {
111 3 switch (Offset)
112 3 {
113 4 case 0: temp=0x01; break;
114 4 case 1: temp=0x02; break;
115 4 case 2: temp=0x04; break;
116 4 case 3: temp=0x08; break;
117 4 case 4: temp=0x10; break;
C51 COMPILER V8.01 LCD_DISP 06/17/2008 20:51:00 PAGE 3
118 4 case 5: temp=0x20; break;
119 4 case 6: temp=0x40; break;
120 4 case 7: temp=0x80; break;
121 4 }
122 3 RamDate=RamDate|temp;
123 3
124 3 LCD_DateWrite(RamDate);
125 3 }
126 2 else
127 2 {
128 3 switch(Offset)
129 3 {
130 4 case 0: temp=0xfe;break;
131 4 case 1: temp=0xfd;break;
132 4 case 2: temp=0xfb;break;
133 4 case 3: temp=0xf7;break;
134 4 case 4: temp=0xef;break;
135 4 case 5: temp=0xdf;break;
136 4 case 6: temp=0xbf;break;
137 4 case 7: temp=0x7f;break;
138 4 }
139 3 RamDate=RamDate&temp;
140 3
141 3 LCD_DateWrite(RamDate);
142 3 }
143 2 }
144 1 }
145 /*--------------------------------------------------
146 *函数名称:Write_OneLargeDot
147 *功 能:预览框更新
148 *参 数:*p 指向要写入的内容
149 *返 回:无
150 ---------------------------------------------------*/
151 void Write_OneLargeDot(uchar X,uchar Y,uchar color)
152 {
153 1 X=X-10;
154 1
155 1 Write_OneDot(2*X,2*Y,color);
156 1 Write_OneDot(2*X+1,2*Y,color);
157 1 Write_OneDot(2*X,2*Y+1,color);
158 1 Write_OneDot(2*X+1,2*Y+1,color);
159 1 }
160 /*--------------------------------------------------
161 *函数名称:Write_Preview
162 *功 能:预览框更新
163 *参 数:*p 指向要写入的内容
164 *返 回:无
165 ---------------------------------------------------*/
166 void Write_Preview(uchar *p)
167 {uchar i,j,m,n,temp;
168 1 uchar x,y;
169 1 x=70;
170 1 y=16;
171 1 for(i=0;i<4;i++)
172 1 {
173 2 temp=*p;
174 2 for(j=0;j<4;j++)
175 2 {
176 3 if(temp&0x01)
177 3 {
178 4 for(m=0;m<4;m++)
179 4 {
C51 COMPILER V8.01 LCD_DISP 06/17/2008 20:51:00 PAGE 4
180 5 for(n=0;n<4;n++)
181 5 Write_OneDot(x+n,y-m,1);
182 5 }
183 4 }
184 3 else
185 3 {
186 4 for(m=0;m<4;m++)
187 4 {
188 5 for(n=0;n<4;n++)
189 5 Write_OneDot(x+n,y-m,0);
190 5 }
191 4 }
192 3 temp=temp>>1;
193 3 x=x+4;
194 3 }
195 2 p++;
196 2 x=70;
197 2 y=y-4;
198 2 }
199 1
200 1 }
201
202
203 /*--------------------------------------------------
204 *函数名称:Write_4x4Ram
205 *功 能:在屏幕任意坐标处显示一个4X4区域,
206 以坐标点为起始向第一象限延伸
207 *参 数:X 横坐标(10-41)
208 Y 纵坐标(1-31)
209 *p 指向存放数据的数组
210 *返 回:无
211 ---------------------------------------------------*/
212
213 void Write_4x4Ram(char X,char Y,uchar *p)
214 {
215 1 uchar i,j,temp;
216 1 for(i=0;i<4;i++)
217 1 {
218 2 temp=*p;
219 2 for(j=0;j<4;j++)
220 2 {
221 3 if(temp&0x01)
222 3 Write_OneLargeDot( X+j, Y-i, 1);
223 3 //else
224 3 //Write_OneLargeDot( X+j, Y-i, 0);
225 3 temp=temp>>1;
226 3 }
227 2 p++;
228 2 }
229 1 }
230 /*--------------------------------------------------
231 *函数名称:Write_One_Word
232 *功 能:指定位置显示一个汉字(16X16)
233 *参 数:x y *p
234 *返 回:无
235 ---------------------------------------------------*/
236 void Write_One_Word(uchar x,uchar y,uchar code *p)
237 {
238 1 uchar i,j,k,temp;
239 1 for(i=0;i<16;i++)
240 1 {
241 2 for(j=0;j<2;j++)
C51 COMPILER V8.01 LCD_DISP 06/17/2008 20:51:00 PAGE 5
242 2 {
243 3 temp=*p;
244 3 for(k=0;k<8;k++)
245 3 {
246 4 if(temp&0x01)
247 4 Write_OneDot(x+k,y+i,1);
248 4 else
249 4 Write_OneDot(x+k,y+i,0);
250 4 temp=temp>>1;
251 4 }
252 3 p++;
253 3 x=x+8;
254 3 }
255 2 x=x-16;
256 2 }
257 1 }
258 /*--------------------------------------------------
259 *函数名称:Disp_Over
260 *功 能:显示游戏结束
261 *参 数:无
262 *返 回:无
263 ---------------------------------------------------*/
264 void Disp_Game_Over(void)
265 {
266 1 Write_One_Word(0,15,you);
267 1 Write_One_Word(16,15,xi);
268 1 Write_One_Word(32,15,jie);
269 1 Write_One_Word(48,15,shu1);
270 1
271 1 }
272 /*--------------------------------------------------
273 *函数名称:Write_One_Byte
274 *功 能:指定位置显示一个字符(8X16)
275 *参 数:x y n
276 *返 回:无
277 ---------------------------------------------------*/
278 void Write_One_Byte(uchar x,uchar y,uchar const n)
279 {uchar *p;
280 1 uchar i,k,temp;
281 1 p=&num[n][0];
282 1 for(i=0;i<16;i++)
283 1 { temp=*p;
284 2 for(k=0;k<8;k++)
285 2 {
286 3 if(temp&0x01)
287 3 Write_OneDot(x+k,y+i,1);
288 3 else
289 3 Write_OneDot(x+k,y+i,0);
290 3 temp=temp>>1;
291 3 }
292 2 p++;
293 2 }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -