📄 12864.lst
字号:
C51 COMPILER V7.07 12864 09/12/2008 07:31:04 PAGE 1
C51 COMPILER V7.07, COMPILATION OF MODULE 12864
OBJECT MODULE PLACED IN 12864.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE 12864.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 //LCD12864
2 //**********************************************************
3 //连线表: CPU=89C51 SysClock=12MHz *
4 //RS=P2.0 R/W=P2.1 E=P2.2 CS1=P2.3 CS2=P2.4 *
5 //DB0-DB7=P0.0-P0.7 /Reset=InBoard *
6 //**********************************************************
7 #include <reg52.h>
8 #include <stdlib.h>
9 #include <intrins.h>
10 #include <stdio.h>
11 #include <math.h>
12 #define uchar unsigned char
13 #define uint unsigned int
14 /********************引脚定义********************/
15 #define DataPort P3 //LCD128*64 I/O 信号管脚
16 sbit RS =P2^0; //数据指令
17 sbit RW =P2^1; //读写
18 sbit E =P2^2; //使能
19 sbit CSL =P2^3; //左片选
20 sbit CSR =P2^4; //右片选
21 sbit Key1=P1^3;
22 sbit Key2=P1^4;
23 uchar Page; //页 地址
24 uchar Col; //列 地址
25 uchar code BMP1[]; //一幅图
26 uchar code HZK_12[]; //12×12阵点字模
27 uchar code ASC_5x7[]; //5×7阵点字模
28 uchar str[4];
29 /********************函数定义*******************/
30 void BusyL(void); //左屏检测忙
31 void BusyR(void); //右屏检测忙
32 void CheckBusy(void); //读取忙信号
33 void Delay(uint MS); //延时
34 void Locatexy(void); //将屏幕横向0-12纵向0-7转换成左、右屏的的X、Y
35 void WriteCommandL( uchar CommandByte ); //向左屏写入指令
36 void WriteCommandR( uchar CommandByte ); //向右屏写入指令
37 uchar ReadData( void ); //读数据
38 void WriteData( uchar DataByte ); //写数据
39 void LcmClear( void ); //清屏
40 void LcmInit( void ); //初始化
41 void LcmPutBMP( uchar *puts ); //显示一幅图
42 void LcmReverseBMP( void ); //将整屏反显
43 void LcmPutHZ_12( uchar x,uchar y,uchar HZcode ); //在屏幕上任意点显示一个12×12汉字
44 uchar * uchartostr(unsigned char unm); //将值转成字符串
45 void LcmPutAsc( uchar asc ); //显示一个5×7的ASC字符
46 void LcmPutstr( uchar row,uchar y,uchar * str ); //在设定位置显示字符串
47 void LcmPutpoint( uchar ro,uchar lie,uchar colour ); //在设定位置显示一个点
48
49 /***************************/
50 /*检查Busy */
51 /***************************/
52 void BusyL(void)
53 {
54 1 CSL= 1;
55 1 CSR= 0;
C51 COMPILER V7.07 12864 09/12/2008 07:31:04 PAGE 2
56 1 CheckBusy();
57 1 }
58 void BusyR(void)
59 {
60 1 CSL= 0;
61 1 CSR= 1;
62 1 CheckBusy();
63 1 }
64 void CheckBusy(void)
65 {
66 1 RS = 0; //指令
67 1 RW = 1;
68 1 DataPort= 0xFF; //输出0xff以便读取正确
69 1 E = 1;
70 1 _nop_();
71 1 while(!(DataPort & 0x80));
72 1 /*DataPort & 0x80);*/
73 1 //Status Read Bit7 = BUSY 这地方有点问题,用了while(//DataPort & 0x80)后就一直
74 1 //读不到0了,陷入死循环。当用while(0) 时反而能正常工作,不知道有没有人能解释
75 1 E = 0;
76 1 _nop_();
77 1 }
78 /********************************************************/
79 /*根据设定的坐标数据,定位LCM上的下一个操作单元位置 */
80 /********************************************************/
81 void Locatexy(void)
82 {
83 1 uchar x,y;
84 1 switch (Col&0xc0) /* col.and.0xC0 */
85 1 { /*条件分支执行 */
86 2 case 0: {BusyL();break;}/*左区 */
87 2 case 0x40: {BusyR();break;}/*右区 */
88 2 }
89 1 x = Col&0x3F|0x40; /* col.and.0x3f.or.Set Y Address*/
90 1 y = Page&0x07|0xB8; /* row.and.0x07.or.set Page */
91 1 CheckBusy(); /* waitting for enable */
92 1 RS = 0; //指令
93 1 RW = 0; //写
94 1 DataPort = y; //设置页面地址
95 1 E = 1;
96 1 _nop_();
97 1 E = 0;
98 1 _nop_();
99 1 CheckBusy(); /* waitting for enable */
100 1 RS = 0;
101 1 RW = 0;
102 1 DataPort = x; //设置列地址
103 1 E = 1;
104 1 _nop_();
105 1 E = 0;
106 1 _nop_();
107 1 }
108 /***************************/
109 /*写指令 */
110 /***************************/
111 void WriteCommandL( uchar CommandByte )
112 {
113 1 BusyL();
114 1 DataPort = CommandByte;
115 1 RS = 0; //指令
116 1 RW = 0;
117 1 E = 1;
C51 COMPILER V7.07 12864 09/12/2008 07:31:04 PAGE 3
118 1 _nop_();
119 1 E = 0;
120 1 _nop_();
121 1 }
122 void WriteCommandR( uchar CommandByte )
123 {
124 1 BusyR();
125 1 DataPort = CommandByte;
126 1 RS = 0; //指令
127 1 RW = 0;
128 1 E = 1;
129 1 _nop_();
130 1 E = 0;
131 1 _nop_();
132 1 }
133 /***************************/
134 /*读数据 */
135 /***************************/
136 uchar ReadData( void )
137 {
138 1 uchar DataByte;
139 1 Locatexy(); /*坐标定位,返回时保留分区状态不变 */
140 1 RS = 1; /*数据输出*/
141 1 RW = 1; /*读入 */
142 1 DataPort = 0xFF; //输出0xff以便读取正确
143 1 E = 1; /*读入到LCM*/
144 1 _nop_();
145 1 DataByte = DataPort; /*数据读出到数据口P1 */
146 1 E = 0;
147 1 _nop_();
148 1 return DataByte;
149 1 }
150 /***************************/
151 /*写数据 */
152 /***************************/
153 void WriteData( uchar DataByte )
154 {
155 1 Locatexy(); /*坐标定位,返回时保留分区状态不变 */
156 1 RS = 1; /*数据输出*/
157 1 RW = 0; /*写输出 */
158 1 DataPort = DataByte; /*数据输出到数据口 */
159 1 E = 1; /*写入到LCM*/
160 1 _nop_();
161 1 E = 0;
162 1 _nop_();
163 1 }
164 void LcmClear( void )
165 {
166 1 Page = 0;
167 1 Col = 0;
168 1 for(Page=0;Page<8;Page++)
169 1 for(Col=0;Col<128;Col++)
170 1 WriteData(0);
171 1 }
172 void LcmInit( void )
173 {
174 1 Delay(200); //等待复位
175 1 WriteCommandL(0x3f); //开显示
176 1 WriteCommandR(0x3f);
177 1
178 1 WriteCommandL(0xc0); //设置起始地址=0
179 1 WriteCommandR(0xc0);
C51 COMPILER V7.07 12864 09/12/2008 07:31:04 PAGE 4
180 1 WriteCommandL(0x3f); //开显示
181 1 WriteCommandR(0x3f);
182 1 LcmClear();
183 1 Col = 0;
184 1 Page= 0;
185 1 Locatexy();
186 1 }
187 void LcmPutBMP( uchar *puts )
188 {
189 1 uint X=0;
190 1 Page = 0;
191 1 Col = 0;
192 1 for(Page=0;Page<8;Page++)
193 1 {
194 2 for(Col=0;Col<128;Col++)
195 2 {
196 3 WriteData( puts[X] );
197 3 X++;
198 3 }
199 2 }
200 1 }
201 void LcmReverseBMP( void )
202 {
203 1 uchar temp;
204 1 Page = 0;
205 1 Col = 0;
206 1 for(Page=0;Page<8;Page++)
207 1 {
208 2 for(Col=0;Col<128;Col++)
209 2 {
210 3 temp = ReadData(); //空读一次
211 3 temp = ReadData();
212 3 temp = ~temp;
213 3 WriteData(temp);
214 3 }
215 2 }
216 1 }
217 void LcmPutHZ_12( uchar x,uchar y,uchar HZcode )
218 {
219 1 uchar offset,Rd,Wt,m,tmp,i;
220 1 uint n;
221 1 if(x<117&y<53)
222 1 {
223 2 Page=(y & 0x38)>>3;
224 2 Col=x;
225 2 n = 0x18*HZcode;
226 2 offset=y&0x07;
227 2 if(offset<5)
228 2 {
229 3 for(i=12;i>0;i--)
230 3 {
231 4 Rd=ReadData();
232 4 Rd=ReadData();
233 4 m=HZK_12[n];
234 4 Wt=Rd&(0xff>>(8-offset))|(m<<offset);
235 4 WriteData(Wt);
236 4 Page++;
237 4 n++;
238 4 tmp=m;
239 4 m=HZK_12[n];
240 4 Rd=ReadData();
241 4 Rd=ReadData();
C51 COMPILER V7.07 12864 09/12/2008 07:31:04 PAGE 5
242 4 Wt=tmp>>(8-offset)|(m<<offset)|(Rd&(0xff<<(offset+4)));
243 4 WriteData(Wt);
244 4 Col++;
245 4 Page--;
246 4 n++;
247 4 }
248 3 }
249 2 else
250 2 {
251 3 for(i=12;i>0;i--)
252 3 {
253 4 Rd=ReadData();
254 4 Rd=ReadData();
255 4 m=HZK_12[n];
256 4 Wt=Rd&(0xff>>(8-offset))|(m<<offset);
257 4 WriteData(Wt);
258 4 Page++;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -