📄 lcd_fun.lst
字号:
C51 COMPILER V7.06 LCD_FUN 05/14/2007 22:03:38 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE LCD_FUN
OBJECT MODULE PLACED IN LCD_FUN.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE LCD_FUN.C LARGE BROWSE DEBUG OBJECTEXTEND
stmt level source
1 #include "at89x52.h"
2 #include "stdio.h"
3 #define uchar unsigned char
4 #define uint unsigned int
5
6 sbit sclk=P1^0;//时钟
7 sbit sdin=P1^1; //数据
8 sbit dc=P1^2;//1写数据,0写指令
9 sbit sce=P1^3;//片选
10 sbit res=P1^7;//复位,0复位
11
12 extern uchar code gFontLib[][24];
13 extern uchar code font6x8[][6];
14
15 //-------------------------------延时----------------------------------
16 void delayus(uchar m)
17 {
18 1 while(m--);
19 1 }
20 void delay_1ms(void) //1ms延时函数
21 {
22 1 uint i;
23 1 for (i=0;i<1140;i++);
24 1 }
25 void delay_nms(uint n) //N ms延时函数
26 {
27 1 uint i=0;
28 1 for (i=0;i<n;i++)
29 1 delay_1ms();
30 1 }
31 //----------------------------写一字节--------------------------------------------
32 void LCD_write_byte(uchar datatemp,bit mod)
33 {
34 1 uchar data i=8;
35 1 sce=0;
36 1 dc=mod; //mod=0,命令模式。mod=1,数据模式。
37 1 while (i--)
38 1 {
39 2 if (datatemp&0x80)
40 2 sdin=1;
41 2 else
42 2 sdin=0;
43 2 sclk=0;
44 2 sclk=1;
45 2 datatemp<<=1;
46 2 }
47 1 dc=1;
48 1 sce=1;
49 1 sdin=1;
50 1 }
51 //-----------------------LCD初始化--------------------------------------------
52 void LCD_init(void)
53 {
54 1 res=0;
55 1 delayus(100);
C51 COMPILER V7.06 LCD_FUN 05/14/2007 22:03:38 PAGE 2
56 1 res=1;
57 1 sce=1;
58 1 sdin=1;
59 1 sclk=1;
60 1 LCD_write_byte(0x21,0);//初始化Lcd,功能设定使用扩充指令
61 1 LCD_write_byte(0xd5,0);//设定液晶偏置电压(高--低)
62 1 LCD_write_byte(0x20,0);//使用基本指令
63 1 LCD_write_byte(0x0C,0);//设定显示模式,正常显示
64 1 }
65 //----------------------设定地址 y=0~5,x=0~83----------------------------------------
66 void LCD_set_XY(uchar X, uchar Y)
67 {
68 1 LCD_write_byte(Y|0x40, 0); // column
69 1 LCD_write_byte(X|0x80 , 0); // row
70 1 }
71 //----------------------清全屏 ------------------------------------------------------
72 extern bit r0,r1,r2,r3;//对应某一行反显标志位;
73 extern uchar gLCDScr[4][7];
74 void LCD_clr(void)
75 {
76 1 uchar data m,n;
77 1 LCD_set_XY(0,0);
78 1 for (m=0;m<6;m++)
79 1 {
80 2 for (n=0;n<84;n++)
81 2 LCD_write_byte(0,1);
82 2 }
83 1 r0=r1=r2=r3=0;//对应某一行反显标志位同时清零
84 1 for(m=0;m<4;m++)//字符点阵跟踪表同时清零
85 1 for(n=0;n<7;n++)
86 1 gLCDScr[m][n]=0;
87 1 }
88 //----------------------正/反显示英文字符-------------------------------------------------
89 void LCD_write_char(uchar c,bit reverse)
90 {
91 1 uchar data line;
92 1 if(c>127)
93 1 c='?';
94 1 if(reverse)
95 1 for (line=0; line<6; line++)
96 1 LCD_write_byte(~font6x8[c][line], 1);
97 1 else
98 1 for (line=0; line<6; line++)
99 1 LCD_write_byte(font6x8[c][line], 1);
100 1 }
101
102
103 //-------------------正/反显示英文字符串显示函数-----------------------------------------------
104 //reverse为1则反显示。
105 void LCD_write_english_string(uchar X,uchar Y,char *s,bit reverse)
106 {
107 1 LCD_set_XY(X,Y);
108 1 while (*s)
109 1 {
110 2 LCD_write_char(*s,reverse);
111 2 s++;
112 2 }
113 1 }
114
115 /*--------------------在LCD上显示汉字------------------------------------------------------
116
117 输入参数:X、Y :显示汉字的起始X、Y坐标;
C51 COMPILER V7.06 LCD_FUN 05/14/2007 22:03:38 PAGE 3
118 ch_wide :汉字点阵的宽度
119 num :显示汉字的个数;
120 line :汉字点阵数组中的起始行数
121 row :汉字显示的行间距
122 编写日期 :2004-8-11
123 最后修改日期 :2004-8-12
124 测试:
125 LCD_write_chi(0,0,12,7,0,0);
126 LCD_write_chi(0,2,12,7,0,0);
127 LCD_write_chi(0,4,12,7,0,0);
128
129 void LCD_write_chinese_string(uchar X, uchar Y,
130 uchar ch_wide,uchar num,
131 uchar line,uchar row)
132 {
133 uchar data i,n;
134
135 LCD_set_XY(X,Y); //设置初始位置
136
137 for (i=0;i<num;)
138 {
139 for (n=0; n<ch_wide*2; n++) //写一个汉字
140 {
141 if (n==ch_wide) //写汉字的下半部分
142 {
143 if (i==0) LCD_set_XY(X,Y+1);
144 else
145 LCD_set_XY((X+(ch_wide+row)*i),Y+1);
146 }
147 LCD_write_byte(gFontLib[line+i][n],1);
148 }
149 i++;
150 LCD_set_XY((X+(ch_wide+row)*i),Y);
151 }
152 }
153 */
154 /*-----------------位图绘制函数------------------------------------------------------
155
156 输入参数:X、Y :位图绘制的起始X、Y坐标;
157 *map :位图点阵数据;
158 Pix_x :位图像素(长)
159 Pix_y :位图像素(宽)
160
161 编写日期 :2004-8-13
162 最后修改日期 :2004-8-13 */
163 void LCD_DrawPic(uchar X,uchar Y,uchar *map,
164 uchar Pix_x,uchar Pix_y)
165 {
166 1 uint data i,n;
167 1 uchar row;
168 1
169 1 if (Pix_y%8==0) row=Pix_y/8; //计算位图所占行数
170 1 else
171 1 row=Pix_y/8+1;
172 1
173 1 for (n=0;n<row;n++)
174 1 {
175 2 LCD_set_XY(X,Y);
176 2 for(i=0; i<Pix_x; i++)
177 2 {
178 3 LCD_write_byte(map[i+n*Pix_x], 1);
179 3 }
C51 COMPILER V7.06 LCD_FUN 05/14/2007 22:03:38 PAGE 4
180 2 Y++; //换行
181 2 }
182 1 }
183 //----------------------写一屏图 -----------------------------------------------
184 /*void LCD_write_pic(uchar *map)
185 {
186 uchar e;
187 uchar t;
188 uchar k;
189 uint d=0;
190 for (t=0;t<6;t++)
191 {
192 for (k=0;k<84;k++)
193 {
194 e=*(map+d);
195 d++;
196 LCD_write_byte(e,1);
197 }
198 }
199 }*/
200 //---------------------------正/反显示 12*12点阵字符-------------------------------
201 /* 屏幕划分为4*7=28个区,用X,Y表示
202 0<=X<4, 0<=Y<7
203 字符点阵数据以小字库形式置于FLASH中
204 3310LCD以水平寻址模式时,每次接收8位,以列形式显示到屏幕中
205 因此,显示12*12点阵相当于用3字节显示2行字符
206 则第一行字符会履盖第二行的头4位
207 解决:设置一个显示字符点阵跟踪表
208 满屏显示4*7=28,需保存28个字符的点阵链接
209 表元素由1字节组成,可寻址256个字符 */
210
211 unsigned char idata gLCDx,gLCDy;//输出8位数据的最低位为点阵字的最高位
212 unsigned char gLCDScr[4][7]; // 字符点阵跟踪表
213 void LCD_set_RC(unsigned char x, unsigned char y) //R(row),C(column);
214 {
215 1 gLCDx = x;
216 1 gLCDy = y;
217 1 if(y>6) { //如果某行字数大于6
218 2 gLCDy = 0;
219 2 gLCDx ++; //跳向另一行开始位置
220 2 }
221 1 if(x>3)
222 1 gLCDx = 0;
223 1 if(x<2)
224 1 LCD_set_XY(y*12,x);
225 1 else
226 1 LCD_set_XY(y*12,x+1);
227 1 }
228 bit r0,r1,r2,r3;//对应某一行反显标志位;
229 void LCD_putc(unsigned char iIndex,bit reverse)
230 {
231 1 unsigned char data i,iTmp,dat;
232 1 gLCDScr[gLCDx][gLCDy] = iIndex;
233 1 LCD_set_RC(gLCDx,gLCDy);
234 1 switch(gLCDx) {
235 2 case 0:
236 2 if(reverse)
237 2 { for(i=0;i<12;i++){ // 显示高8位
238 4 LCD_write_byte(~gFontLib[iIndex][i],1);
239 4 }
240 3 r0=1;
241 3 }
C51 COMPILER V7.06 LCD_FUN 05/14/2007 22:03:38 PAGE 5
242 2 else
243 2 { for(i=0;i<12;i++){ // 显示高8位
244 4 LCD_write_byte(gFontLib[iIndex][i],1);
245 4 }
246 3 r0=0;
247 3 }
248 2 LCD_set_XY(gLCDy*12,1);
249 2 for(i=0;i<12;i++) { // 显示低4位
250 3 iTmp = gLCDScr[1][gLCDy];
251 3 iTmp = gFontLib[iTmp][i]<<4;
252 3 //iTmp <<= 4;
253 3 dat = gFontLib[iIndex][i+12];
254 3 if(r0)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -