📄 main.lst
字号:
C51 COMPILER V8.08 MAIN 11/29/2008 23:51:17 PAGE 1
C51 COMPILER V8.08, COMPILATION OF MODULE MAIN
OBJECT MODULE PLACED IN main.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE main.c BROWSE DEBUG OBJECTEXTEND
line level source
1 //========================================
2 //--------- 小波电子工作室 -----------
3 // LM4229 液晶显示驱动程序
4 // 作者:聂金波 完成日期:2008/0/05
5 // 四川师范大学 电子工程学院 2005级5级
6 // 改进:2008/08/08增加显示5个32*32汉字程序
7 // 2008/08/10增加显示a*b大小照片(a为8的倍数)
8 //----------------------------------------
9 // 本程序参考proteus仿真论坛:http://proteus.5d6d.com一个网友
10 // 写的LCD240*128显示程序,在此表示感谢!
11 //=========================================
12
13
14 #include<AT89X52.h>
15 #include<en_code.h>
16 #include<cn_code.h>
17
18 #define uchar unsigned char
19 #define uint unsigned int
20 #include<picture.h>
21 #define DATA_PORT P0
22
23 //-------------------------------------------
24 // 管脚定义
25 //------------------------------------------
26 sbit HALT=P2^0; //暂不清楚
27 sbit FS1=P2^1; //字体模式选择
28 sbit MD2=P2^2; //方式选择
29 sbit RST=P2^3; //复位
30 sbit CD=P2^4; //数据(L)/命令(H)选择
31 sbit READ=P2^5; //读,低电平有效
32 sbit WRIT=P2^6; //写,低电平有效
33 sbit CE=P2^7; //使能,低电平有效
34
35 //===========================================
36 // 函数声明
37 //-------------------------------------------
38 void delay_lcd(uchar);
39 void write_data(uchar);
40 void write_com(uchar);
41 void clr_lcd(uchar,uchar,uint);
42
43
44
45 //--------------------------------------------
46 // 延时函数
47 //--------------------------------------------
48 void delay_lcd(uchar t)
49 {
50 1 for(;t!=0; t--);
51 1 }
52
53 //--------------------------------------------
54 // 写数据函数
55 //--------------------------------------------
C51 COMPILER V8.08 MAIN 11/29/2008 23:51:17 PAGE 2
56 void write_data(uchar dat)
57 {
58 1 CD=0; //数据
59 1 CE=0; //LCD使能
60 1 WRIT=0; //写
61 1 DATA_PORT=dat; //把数据送到P口
62 1 delay_lcd(1); //当晶振较高时加延时
63 1 WRIT=1; //关写
64 1 CE=1; //关使能
65 1 }
66
67
68 //--------------------------------------------
69 // 写命令函数
70 //--------------------------------------------
71 void write_com(uchar com)
72 {
73 1 CD=1; //命令
74 1 CE=0;
75 1 WRIT=0;
76 1 DATA_PORT=com;
77 1 delay_lcd(1); //当晶振较高时加延时
78 1 WRIT=1;
79 1 CE=1;
80 1 }
81
82
83 //--------------------------------------------
84 // 指定位置、长度清屏
85 //--------------------------------------------
86 void clr_lcd(uchar x,uchar y,uint length)
87 {
88 1 uint i,place;
89 1 place=x*30+y;
90 1 write_data(place&0xff);
91 1 write_data(place/256);
92 1 write_com(0x24); //设置
93 1 for(i=0;i<length;i++)
94 1 write_data(0xff); //写入空格,清屏
95 1 write_com(0xb2); //关闭自动写
96 1 }
97
98
99 //--------------------------------------------
100 // 指定位置向LCD写入指定字符
101 //
102 //
103 //--------------------------------------------
104 void write_lcd(uchar x,uchar y,char *cha)
105 {
106 1 uint place,i=0;
107 1 uchar length,c1,c2,j,k;
108 1 for(length=0;cha[length]!=0;length++);
109 1 do
110 1 {
111 2 c1=cha[i]; //取字符串的ASCII码
112 2 c2=cha[i+1];
113 2 place=x*30+y;
114 2 if(c1<=128) //#####小于128为字符,大于128为汉字
115 2 {
116 3 for(k=0;k<16;++k) //字符设置为16*8
117 3 {
C51 COMPILER V8.08 MAIN 11/29/2008 23:51:17 PAGE 3
118 4 write_data(place&0xff); //写入地址高位
119 4 write_data(place/256); //写入地址低位
120 4 write_com(0x24); //地址设置
121 4 write_com(0xb0); //设置数据自动写
122 4 write_data(ASC_MSK[(c1-0x20)*16+k]); /*---例如:0的ASCII码为0x30,
123 4 //在ASC_MSK中的位置为0x10*16 ---16字节字码依次写入LCD--- */
124 4 write_com(0xb2); //自动复位
125 4 place=place+30;
126 4 }
127 3 if(y>28) //y>28时候需要换行
128 3 {x=x+16;y=0;}
129 3 else //否则,不换行,继续写下一个字符
130 3 {y++;}
131 3 i++;
132 3 }
133 2 else //#####c1大于128为汉字
134 2 {
135 3 for(j=0;j<sizeof(GB_16)/sizeof(GB_16[0]);j++) //找到汉字
136 3 {
137 4 if(c1==GB_16[j].Index[0]&&c2==GB_16[j].Index[1])
138 4 break; //汉字找到则跳出
139 4 }
140 3 if(j<sizeof(GB_16)/sizeof(GB_16[0])) //------如果汉字在子码表内
141 3 {
142 4 for(k=0;k<16;k++) //字符设置为16*8
143 4 {
144 5 write_data(place&0xff); //写入地址高位
145 5 write_data(place/256); //写入地址低位
146 5 write_com(0x24); //地址设置
147 5 write_com(0xb0); //设置数据自动写
148 5 write_data(GB_16[j].Msk[k*2]);
149 5 write_data(GB_16[j].Msk[k*2+1]); //16*16,每行2字节
150 5 write_com(0xb2); //自动复位
151 5 place=place+30; //下一行
152 5 }
153 4 }
154 3 else //-----没找到对应汉字则涂黑
155 3 {
156 4 for(k=0;k<16;k++) //字符设置为16*8
157 4 {
158 5 write_data(place&0xff); //写入地址高位
159 5 write_data(place/256); //写入地址低位
160 5 write_com(0x24); //地址设置
161 5 write_com(0xb0); //设置数据自动写
162 5 write_data(0xff);
163 5 write_data(0xff);
164 5 write_com(0xb2); //自动复位
165 5 place=place+30; //下一行
166 5 }
167 4 }
168 3 if(y>27) //-------换行
169 3 {x+=16;y=0;}
170 3 else //--------不用换行,则下一个字
171 3 {y+=2;}
172 3 i+=2;
173 3 }
174 2 }
175 1 while(i<length);
176 1 }
177
178
179 //--------------------------------------------
C51 COMPILER V8.08 MAIN 11/29/2008 23:51:17 PAGE 4
180 // LM4229初始化函数
181 //--------------------------------------------
182 void lcd_init()
183 {
184 1 FS1 = 0;//fs1管脚高电平时表示字体为8*6;
185 1 //低电平时为8*8
186 1 MD2 = 0;
187 1 HALT = 0;
188 1 write_data(0);
189 1 write_data(0); //图形首地址
190 1 write_com(0x42); //图形首地址设置
191 1 write_data(30);
192 1 write_data(0);
193 1 write_com(0x43); //图形区域设置
194 1 write_com(0x80); //设置为OR模式
195 1 write_com(0x9a); //关闭文本显示,开图形显示
196 1 }
197
198 //========================================================
199 //--------------------------------------------
200 // LM4229在指定位置显示32*32汉字
201 //--------------------------------------------
202
203 void write_pic(uchar x,uchar y)
204 {
205 1 uint place;
206 1 uchar i,n;
207 1 place=x*30+y;
208 1
209 1 for(n=0;n<5;n++) //5个汉字
210 1 {
211 2 for(i=0;i<32;i++) //32*32
212 2 {
213 3 write_data(place&0xff);
214 3 write_data(place/256);
215 3 write_com(0x24); //设置地址
216 3 write_com(0xb0); //设置数据自动写
217 3 write_data(tab_pic[4*i+0+128*n]);
218 3 write_data(tab_pic[4*i+1+128*n]);
219 3 write_data(tab_pic[4*i+2+128*n]);
220 3 write_data(tab_pic[4*i+3+128*n]);
221 3 write_com(0xb2); //自动复位
222 3 place=place+30;
223 3 }
224 2 place=x*30+y+4*(n+1);
225 2 }
226 1 }
227 //===============================================
228
229 //--------------------------------------------
230 // LM4229在指定位置显示a*b图片
231 // a为图片长,b为图片宽(a为8的倍数)
232 //--------------------------------------------
233 void write_image(uchar x,uchar y,uchar a,uchar b,uchar *tab_image)
234 {
235 1 uint place;
236 1 uchar i,j;
237 1 place=x*30+y;
238 1 for(i=0;i<b;i++) //b行数据
239 1 {
240 2 write_data(place&0xff); //写地址低8位
241 2 write_data(place/256); //写地址高8位
C51 COMPILER V8.08 MAIN 11/29/2008 23:51:17 PAGE 5
242 2 write_com(0x24); //设置地址
243 2 write_com(0xb0); //设置数据自动写
244 2 for(j=0;j<a/8;j++) //a/8列数据
245 2 {write_data(tab_image[(a/8)*i+j]);}
246 2 write_com(0xb2); //自动复位
247 2 place=place+30; //换行
248 2 }
249 1 }
250
251 //==============================================
252 void main(){
253 1 uchar count=40;
254 1 lcd_init();
255 1 write_lcd(10,2,"------------------------------");
256 1 write_lcd(102,2,"------------------------------");
257 1 write_lcd(22,1,"北京奥运同北京奥运");
258 1 write_image(33,12,80,72,tab_image_h);
259 1 while(1){
260 2 if(P3_3==0){
261 3 delay_lcd(255);
262 3 if(P3_3==0){
263 4 count+=10;
264 4 write_lcd(count,2,"北京奥运");
265 4 while(P3_3==0);
266 4 }
267 3 }
268 2 }
269 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1015 ----
CONSTANT SIZE = 4942 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 26
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 + -