📄 main.lst
字号:
C51 COMPILER V3.20, SN-0 MAIN 02/28/07 13:53:15 PAGE 1
DOS C51 COMPILER V3.20, COMPILATION OF MODULE MAIN
OBJECT MODULE PLACED IN MAIN.O
COMPILER INVOKED BY: C:\DJ51\OMF51\BIN\C51.EXE D:\DYJ\TEST\MAIN.C DB OE RB(0) OT(5) SM PR(MAIN.LST) OJ(MAIN.O)
stmt level source
1 #include <reg51.h>
2 #include <intrins.h>
3 #include <absacc.h>
4 #include <stdlib.h>
5 #include <string.h>
6 #include "table.h"
7
8 /*---lcd driver.c----*/
9 /*-----------------------------------------------------*/
10 /* 定义LCD引脚 */
11 /*-----------------------------------------------------*/
12 #define RS P1_0 /*RS为寄存器选择信号,RS=0时,为命令或状态寄存器;RS=1时,为数据寄存器*/
13 #define RW P1_1 /*RW为读写控制信号,RW=0时,为写状态;RS=1时,为读状态*/
14 #define E P1_2 /*芯片的使能信号*/
15 #define CS1 P1_4 /*左屏幕的选择信号*/
16 #define CS2 P1_5 /*右屏幕的选择信号*/
17 #define com8255 XBYTE[0xff2b] /*扩展口8255的命令端口地址*/
18 #define Data XBYTE[0xff28] /*用8255的PA口做为LCD的数据接口*/
19 /*-----------------------------------------------------*/
20 /* 延时模块 */
21 /*-----------------------------------------------------*/
22 void Delay400Ms(void) small
23 {
24 1 unsigned char TempCycA = 5;/*改变TempCycA、TempCycB的值,可改变延时时间*/
25 1 unsigned int TempCycB;
26 1 while(TempCycA--)
27 1 {
28 2 TempCycB=7269;
29 2 while(TempCycB--);
30 2 };
31 1 }
32
33 /*-----------------------------------------------------*/
34 /* 状态检查函数,判断是否处于忙状态 */
35 /*-----------------------------------------------------*/
36 void CheckState() small
37 {
38 1 RS=0;
39 1 RW=1;
40 1 do
41 1 {
42 2 E=1; /*如频率太高可以多加几个,以便读出数据*/
43 2 E=1;
44 2 E=1;
45 2 E=1;
46 2 }
47 1 while (Data&0x80);/*检查状态寄存器的最高为是否为高,为高就表示忙,继续等待变低*/
48 1 }
49
50 /*-----------------------------------------------------*/
51 /* 写显示数据 形参dat:显示数据 */
52 /*-----------------------------------------------------*/
53 void WriteByte(unsigned char dat) small
54 {
55 1 CheckState();/*写前先检查LCD是否忙*/
C51 COMPILER V3.20, SN-0 MAIN 02/28/07 13:53:15 PAGE 2
56 1 RS=1;
57 1 RW=0; /*写入数据*/
58 1 Data=dat;
59 1 E=1;
60 1 E=1;
61 1 E=1;
62 1 E=1;
63 1 E=0; /*下降沿时写入数据*/
64 1 }
65
66 /*-----------------------------------------------------*/
67 /* 向LCD发送命令 形参command :命令 */
68 /*-----------------------------------------------------*/
69 void SendCommandToLCD(unsigned char command) small
70 {
71 1 CheckState();
72 1 RS=0;
73 1 RW=0;
74 1 Data=command;
75 1 E=1;
76 1 E=1;
77 1 E=1;
78 1 E=1;
79 1 E=0;
80 1 }
81
82 /*----------------------------------------------------*/
83 /* 设定行地址(页)--X 0-7 */
84 /*----------------------------------------------------*/
85 void SetLine(unsigned char line) small
86 {
87 1 line=line & 0x07; /* 0<=line<=7*/
88 1 line=line|0xb8; /*1011 1xxx*/
89 1 SendCommandToLCD(line);
90 1 }
91
92 /*----------------------------------------------------*/
93 /* 设定列地址--Y 0-63 */
94 /*----------------------------------------------------*/
95 void SetColumn(unsigned char column) small
96 {
97 1 column=column &0x3f; /* 0=<column<=63*/
98 1 column=column | 0x40; /*01xx xxxx*/
99 1 SendCommandToLCD(column);
100 1 }
101
102 /*----------------------------------------------------*/
103 /* 设定显示开始行--XX */
104 /*----------------------------------------------------*/
105 void SetStartLine(unsigned char startline) small /*0--63*/
106 {
107 1 startline=startline & 0x07; /*??0x3f*/
108 1 startline=startline|0xc0; /*1100 0000*/
109 1 SendCommandToLCD(startline);
110 1 }
111
112 /*----------------------------------------------------*/
113 /* 开关显示 */
114 /*----------------------------------------------------*/
115 void SetOnOff(unsigned char onoff) small
116 {
117 1 onoff=0x3e | onoff;
C51 COMPILER V3.20, SN-0 MAIN 02/28/07 13:53:15 PAGE 3
118 1 SendCommandToLCD(onoff);
119 1 }
120
121 /*----------------------------------------------------*/
122 /* 清除内存 */
123 /*----------------------------------------------------*/
124 void Clr_Scr() small
125 {
126 1 unsigned char j,k;
127 1 CS1=1;
128 1 CS2=1; /*左右屏同时选通*/
129 1 SetLine(0);
130 1 SetColumn(0);
131 1 for(k=0;k<8;k++)
132 1 {
133 2 SetLine(k); /*第K页*/
134 2 for(j=0;j<64;j++)
135 2 WriteByte(0x00);
136 2 }
137 1 }
138
139 /*----------------------------------------------------*/
140 /* 初始化LCD屏 */
141 /*----------------------------------------------------*/
142 void init_lcd() small
143 {
144 1
145 1 CS1=1;
146 1 CS2=1; /*左右屏同时选通*/
147 1 SetOnOff(0x3f); /*关显示*/
148 1 SetLine(0x00); /* 设定页*/
149 1 SetStartLine(0x00);
150 1 SetColumn(0x00);
151 1 SetOnOff(0x3f); /*开显示*/
152 1 }
153
154 /*----------------------------------------------------*/
155 /*说明:12864液晶横放,汉字按正常方式显示,pag:0~7; */
156 /* row:0~7(从左到右,水平行,一行可显示8个汉字) */
157 /*功能:指定位置显示汉字16*16 */
158 /*----------------------------------------------------*/
159 void word_disp(unsigned char pag,unsigned char row, unsigned int code *hzk) small
160 {
161 1 unsigned char j=0,i=0,k=0;
162 1 for(j=0;j<2;j++)
163 1 {
164 2 if (row <4)
165 2 {
166 3 k=row;
167 3 CS1=1;
168 3 CS2=0; /*左屏幕显示*/
169 3
170 3 }
171 2 else
172 2 {
173 3 k = row-4;
174 3 CS1=0;
175 3 CS2=1; /*右屏幕显示*/
176 3 }
177 2 SetLine(pag+j);
178 2 SetColumn(k*16);
179 2 for(i=0;i<16;i++)
C51 COMPILER V3.20, SN-0 MAIN 02/28/07 13:53:15 PAGE 4
180 2 {
181 3 WriteByte(hzk[16*j+i]);
182 3 }
183 2 }
184 1 }
185
186 /*----------------------------------------------------*/
187 /*说明:12864液晶横放,字符按正常方式显示,pag:0~7; */
188 /* row:0~15(从左到右,水平行,一行可显示16个字符) */
189 /*功能:指定位置显示字符8*16 */
190 /*----------------------------------------------------*/
191 void byte_disp(unsigned char pag, unsigned char row, unsigned int code *bytek) small
192 {
193 1 unsigned char j=0,i=0,k=0;
194 1 for(j=0;j<2;j++)
195 1 {
196 2 if (row < 8)
197 2 {
198 3 k=row;
199 3 CS1=1;
200 3 CS2=0; /*左屏幕显示*/
201 3 }
202 2 else
203 2 {
204 3 k=row-8;
205 3 CS1=0;
206 3 CS2=1; /*右屏幕显示*/
207 3
208 3 }
209 2 SetLine(pag+j);
210 2 SetColumn(k*8);
211 2 for(i=0;i<8;i++)
212 2 {
213 3 WriteByte(bytek[8*j+i]);
214 3 }
215 2 }
216 1 }
217
218 /*----------------------------------------------------*/
219 /*说明:12864液晶横放,图形按正常方式显示,pag:0~7; */
220 /* row:0~15(从左到右,水平行,一行可显示16个小图片) */
221 /*功能:指定位置显示图片8*8 */
222 /*----------------------------------------------------*/
223 void photo_disp(unsigned char pag, unsigned char row, unsigned int code *photo) small
224 {
225 1 unsigned char i=0,k=0;
226 1
227 1 if (row < 8)
228 1 {
229 2 k=row;
230 2 CS1=1;
231 2 CS2=0; /*左屏幕显示*/
232 2 }
233 1 else
234 1 {
235 2 k=row-8;
236 2 CS1=0;
237 2 CS2=1; /*右屏幕显示*/
238 2 }
239 1
240 1 SetLine(pag);
241 1 SetColumn(k*8);
C51 COMPILER V3.20, SN-0 MAIN 02/28/07 13:53:15 PAGE 5
242 1 for(i=0;i<8;i++)
243 1 {
244 2 WriteByte(photo[i]);
245 2 }
246 1 }
247
248
249 /*----------------------------------------------------*/
250 /*功能:指定位置显示图片1*8长条 */
251 /*----------------------------------------------------*/
252 void now_disp(unsigned char pag, unsigned char row, unsigned int code *photo) small
253 {
254 1 unsigned char i=0,k=0;
255 1
256 1 if (row < 8)
257 1 {
258 2 k=row;
259 2 CS1=1;
260 2 CS2=0; /*左屏幕显示*/
261 2 }
262 1 else
263 1 {
264 2 k=row-8;
265 2 CS1=0;
266 2 CS2=1; /*右屏幕显示*/
267 2 }
268 1
269 1 SetLine(pag);
270 1 SetColumn(k*8+7);
271 1 WriteByte(photo[0]);
272 1
273 1 }
274
275 /*----------------------------------------------------*/
276 /*说明:全屏幕显示子程序 */
277 /*功能:直接显示一幅128*64的BMP图片 */
278 /*----------------------------------------------------*/
279 void bmp_disp(unsigned int code *bmp) small
280 { unsigned char j,k,i;
281 1 CS1=1;
282 1 CS2=0; /*CS1=1,CS2=0 先写左屏幕*/
283 1 SetLine(0);
284 1 SetColumn(0);
285 1 for(k=0;k<8;k++)
286 1 { SetLine(k); /*第K页*/
287 2 for(i=0;i<8;i++)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -