📄 lcd.lst
字号:
C51 COMPILER V7.01 LCD 06/30/2007 11:42:50 PAGE 1
C51 COMPILER V7.01, COMPILATION OF MODULE LCD
OBJECT MODULE PLACED IN LCD.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE LCD.c LARGE BROWSE DEBUG OBJECTEXTEND
stmt level source
1 #include <string.h>
2 #include <stdio.h>
3 #include <absacc.h>
4 #include "ASCII.h"
5 #include "LCD.h"
6 #include "System.h"
7
8 #define BASE 0x8000
9
10 //
11 unsigned char code line[] = {"肀肀肀肀肀肀肀肀肀肀肀肀肀肀肀肀肀肀肀肀"}; // 分割线
12 unsigned char code UpArrow[]={"芗"};
13 unsigned char code DownArrow[]={"兦"};
14 unsigned char code LeftArrow[]={"阼"};
15 unsigned char code RightArrow[]={"囿"};
16
17 //写命令函数
18 void CmdWrite(unsigned char n)
19 {
20 1 RES=1;
21 1 A0=1;
22 1 WR=0;
23 1 P6MDOUT = 0XFF;
24 1 P6=n;
25 1 WR=1;
26 1 A0=0;
27 1 }
28
29 //写数据函数
30 void DataWrite(unsigned char m)
31 {
32 1 RES=1;
33 1 A0=0;
34 1 WR=0;
35 1 P6MDOUT = 0XFF;
36 1 P6=m;
37 1 WR=1;
38 1 A0=1;
39 1 }
40
41
42 //清屏函数,清空LCDfrom行至to行
43 void Clear(int from,int to)
44 {
45 1 int i,j;
46 1 CS=0;
47 1 CmdWrite(CSRDIR_RIGHT); //光标移动方向4cH
48 1 Locatexy(0,from);
49 1 CmdWrite(MWRITE); //数据写入显示缓冲区42H
50 1 for(i=from;i<to;i++)
51 1 {
52 2 for(j=0;j<40;j++)
53 2 DataWrite(0x00);
54 2 }
55 1 CS=1;
C51 COMPILER V7.01 LCD 06/30/2007 11:42:50 PAGE 2
56 1 }
57
58 //LCD初始化函数
59 void Init_LCD()
60 {
61 1 mLES_SW=1; //将LEDWS(P7^0)置1,LED由P5控制
62 1 CS=0; //片选LCD
63 1 RES=0; //LCD Reset
64 1
65 1 CmdWrite(SYSTEMSET); //SYSTEM SET 指令代码 40H
66 1
67 1 DataWrite(0x30); //P1 00110000B B=1;无边界 W/S=0,为单屏结构;M0~M3=0; 8*8点阵
68 1 DataWrite(0x87); //P2 10000111B WF=1,FX=7,显示字符宽为8像素
69 1 DataWrite(0x07); //P3 00000111B FY=7,显示字符高为8像素
70 1 DataWrite(0x27); //P4_CR 一行能显示40(0X27)个字符,即320/8=40byte
71 1 DataWrite(0x42); //P5_TC/R=10MHz/(9*240*70Hz)=66(0x42)
72 1 DataWrite(0xf0); //P6_L/F 显示屏有 240行(0xEF)
73 1 DataWrite(0x28); //P7_APL显示屏一行所占显示缓冲区40字节,
74 1 DataWrite(0x00); //P8_APH
75 1
76 1 CmdWrite(SCROLL); //SCROLL 指令代码0x44H 显示区设置
77 1
78 1 DataWrite(0x00); //P1_SAD1L_第一显示区的起始地址从显示RAM0x00开始
79 1 DataWrite(0x00); //P2_SAD1H
80 1 DataWrite(0xf0); //P3_SL1___第一显示区共有240行
81 1
82 1 DataWrite(0x00); //P4_SAD2L_第二显示区的首地址从显示RAM 9600地址开始 2580H
83 1 DataWrite(0x00); //P5_SAD2H
84 1 DataWrite(0x00); //P6_SL2___第二显示区共有240行
85 1
86 1 DataWrite(0x80); //P7_SAD3L_第3显示区的首地址从显示RAM 0x7080地址开始
87 1 DataWrite(0x25); //P8_SAD3H
88 1
89 1 DataWrite(0x00); //P9_SAD4L
90 1 DataWrite(0x00); //P10_SAD4H
91 1
92 1 CmdWrite(HDOTSCR); //HDOTEST 指令代码 0x5AH 点位置设置,初始化时清零
93 1 DataWrite(0x00);
94 1
95 1 CmdWrite(OVLAY); //设置双层合成显示方式0x5BH
96 1 DataWrite(0x0c); //图形显示方式00001100,DM1=1,DM2=1; 二重合成显示方式,或逻辑, 图形显示方式
97 1
98 1 CmdWrite(DISPON); //开显示0x59H
99 1 DataWrite(0x44); //0100 0100B第1,3显示区工作,光标不显示
100 1
101 1 Clear(0,480); //1,3区全部清空
102 1 CS=1;
103 1 }
104
105 unsigned int LCD_RAM_ORG=LCD_Area1; //设置工作区为1区
106 //光标定位,x以字节为单位,y以点为单位,LCD左上角为坐标原点,LCD_RAM_ORG控制LCD工作区
107 void Locatexy(unsigned char x,unsigned char y)
108 {
109 1 unsigned int temp;
110 1 temp =(unsigned int) y*40+x+LCD_RAM_ORG;
111 1 CmdWrite(CSRW); // 光标Locate,定位
112 1 DataWrite( (unsigned char)(temp) ); // 写入参数CSRL设置参数光标指针低8位
113 1 DataWrite( (unsigned char)(temp>>8) ); // 写入参数CSRH设置参数光标指针高8位
114 1 }
115
116
117 /*******************画点函数*************************/
C51 COMPILER V7.01 LCD 06/30/2007 11:42:50 PAGE 3
118 void Point(int x,unsigned char y) //在x,y坐标处(都是点坐标)画点.x-[0,320),y-[0,240)
119 {
120 1 unsigned char temp=0x80;
121 1 unsigned char value;
122 1 temp=(temp >> (x%8));
123 1 CS=0;
124 1 //先读出该点数据
125 1 Locatexy(x/8,y); //定位
126 1 CmdWrite(MREAD); //发读命令
127 1
128 1 P6MDOUT=0x00; //配置P6为数字输入 (数字输入=漏极开路+SFR写1)
129 1 P6=0xff;
130 1 A0=1;
131 1 RD=0;
132 1 RD=1;
133 1 value=P6;
134 1 A0=0;
135 1 P6MDOUT=0xFF;
136 1
137 1 Locatexy(x/8,y); //重新定位
138 1 CmdWrite(MWRITE);
139 1 DataWrite(temp|value); //写入数据
140 1 CS=1;
141 1 }
142
143 //写汉字和字符函数
144 void dprintf(unsigned char x,unsigned char y, char *ptr)
145 {
146 1 unsigned char c1,c2;
147 1 unsigned int i,j,uLen,uRow,uCol;
148 1 unsigned char temp;
149 1 unsigned int k;
150 1 unsigned int offset;
151 1
152 1 CS=0;
153 1 uRow=x%40;
154 1 uCol=y%240;
155 1 uLen=0;
156 1
157 1 CmdWrite(CSRDIR_DOWN); /*光标移动方向定义,自动下移*/
158 1 Locatexy(uRow,uCol);
159 1
160 1 while((unsigned char)ptr[uLen]>=0x20){uLen++;}; /*探测字符串长度*/
161 1 i=0;
162 1 while(i<uLen)
163 1 {
164 2 c1=ptr[i];
165 2 c2=ptr[i+1];
166 2
167 2 if(c1 <=128) // ASCII
168 2 {
169 3 if (c1 >= 0x20)
170 3 {
171 4 CmdWrite( MWRITE ); // 写数据(命令)
172 4 for(j=0;j<16;j++) DataWrite( ASC_MSK[(c1-0x20)*16 +j ]);
173 4 }
174 3 uRow++; // 列数加1
175 3 }
176 2 else // 汉字
177 2 {
178 3 offset=0;
179 3 //调整bank页,从第3页中取常数
C51 COMPILER V7.01 LCD 06/30/2007 11:42:50 PAGE 4
180 3 PSBANK=0x31;
181 3 while(CBYTE[BASE+offset]!=0xFF || CBYTE[BASE+offset+1]!=0xFF)
182 3 {
183 4 unsigned cc1,cc2;
184 4 cc1=CBYTE[BASE+offset];
185 4 cc2=CBYTE[BASE+offset+1];
186 4 if(CBYTE[BASE+offset]==c1 && CBYTE[BASE+offset+1]==c2)
187 4 break;
188 4 offset+=34;
189 4 }
190 3 for(k=0;k<2;k++) //分两列显示该汉字字模,先显示左半部分,再显示右半部分
191 3 {
192 4 Locatexy(uRow+k,uCol);
193 4 CmdWrite(CSRDIR_DOWN);
194 4 CmdWrite(MWRITE); //写数据命令
195 4 for(temp=0;temp<16;temp++)
196 4 {
197 5 DataWrite( CBYTE[BASE+offset+2+temp*2+k]);
198 5 }
199 4 }
200 3 PSBANK=0x11;
201 3 uRow+=2;
202 3 i++;
203 3
204 3 }
205 2
206 2 if(uRow >= 40) // 光标后移
207 2 {
208 3 uCol += 16;
209 3 uRow = 0;
210 3 if( uCol >= 240 ) uCol = 0;
211 3 }
212 2 Locatexy(uRow,uCol);
213 2 i++;
214 2 }
215 1 CS=1;
216 1 }
217 //反色显示汉字,字符
218 void Udprintf(unsigned char x,unsigned char y, char *ptr)
219 {
220 1 unsigned char c1,c2;
221 1 unsigned int i,j,uLen,uRow,uCol;
222 1 unsigned char temp;
223 1 unsigned int k;
224 1 unsigned int offset;
225 1
226 1 CS=0;
227 1 uRow=x%40;
228 1 uCol=y%240;
229 1 uLen=0;
230 1
231 1 CmdWrite(CSRDIR_DOWN); /*光标移动方向定义,自动下移*/
232 1 Locatexy(uRow,uCol);
233 1
234 1 while((unsigned char)ptr[uLen]>=0x20){uLen++;}; /*探测字符串长度*/
235 1 i=0;
236 1 while(i<uLen)
237 1 {
238 2 c1=ptr[i];
239 2 c2=ptr[i+1];
240 2
241 2 if(c1 <=128) // ASCII
C51 COMPILER V7.01 LCD 06/30/2007 11:42:50 PAGE 5
242 2 {
243 3 if (c1 >= 0x20) {
244 4 CmdWrite( MWRITE ); // 写数据(命令)
245 4 for(j=0;j<16;j++) DataWrite( ~ASC_MSK[(c1-0x20)*16 +j]);
246 4 }
247 3 uRow++; // 列数加1
248 3 }
249 2
250 2 else // 汉字
251 2 {
252 3 offset=0;
253 3 //调整bank页,从第3页中取常数
254 3 PSBANK=0x31;
255 3 while(CBYTE[BASE+offset]!=0xFF || CBYTE[BASE+offset+1]!=0xFF)
256 3 {
257 4 if(CBYTE[BASE+offset]==c1 && CBYTE[BASE+offset+1]==c2)
258 4 break;
259 4 offset+=34;
260 4 }
261 3 for(k=0;k<2;k++) //分两列显示该汉字字模,先显示左半部分,再显示右半部分
262 3 {
263 4 Locatexy(uRow+k,uCol);
264 4 CmdWrite(CSRDIR_DOWN);
265 4 CmdWrite(MWRITE); //写数据命令
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -