📄 19264.lst
字号:
C51 COMPILER V7.50 19264 02/19/2008 11:05:14 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE 19264
OBJECT MODULE PLACED IN 19264.OBJ
COMPILER INVOKED BY: d:\Keil7.5\C51\BIN\C51.EXE 19264.C BROWSE DEBUG OBJECTEXTEND
line level source
1 /*************************************************************
2 功能: 液晶(LCD)显示程序;
3 LCD: TRULY M19264-5A1 192*64点阵
4 驱动器: S6B0108/S6B0107或HD61202及相兼容驱动器
5 MPU: AT89S51
6 开发环境: KEIL C51
7 作者: 纪长城
8 日期: 2005年10月
9 ************************************************************/
10 #include <REGX52.H>
11 #include <ZKDot.h>
12
13
14 #define DISP_OFF 0X3E //关闭显示
15 #define DISP_ON 0X3F //打开显示
16 #define START_ROW 0xC0 //设置起始行 C0H-FFH 对应显示存储器的 0-64行
17 #define FIRST_PAGE 0xB8 //设置页 B8-BF将DDRAM分为8个页面0-7
18 #define START_YADD 0x40 //设置列 40H-7FH 对应0-63个 列单元地址
19
20 /*----------------------------------------
21 MPU端口定义
22 ----------------------------------------*/
23 #define LCD_PORT P0
24 #define LCD_RESET P2_2
25 #define LCD_CSA P2_3
26 #define LCD_CSB P2_4
27 #define LCD_RS P2_5
28 #define LCD_RW P2_6
29 #define LCD_E P2_7
30
31 /*------------------------------------------
32 LCD的区选择程序:F为要选通的区,取值为0,1,2,
33 对应选中三个区,取其它值选中第三个区
34 --------------------------------------------*/
35 void LCD_CSAB_SET(unsigned char block)
36 {
37 1 if(0==block) //0 选择第一区
38 1 {
39 2 LCD_CSA=0;
40 2 LCD_CSB=0;
41 2 }
42 1 else if(1==block) //1 选择第二区
43 1 {
44 2 LCD_CSA=0;
45 2 LCD_CSB=1;
46 2 }
47 1 else //2 选择第三区
48 1 {
49 2 LCD_CSA=1;
50 2 LCD_CSB=0;
51 2 }
52 1 }
53
54
55 /*---------------------------------------
C51 COMPILER V7.50 19264 02/19/2008 11:05:14 PAGE 2
56 //延时子程序
57 ----------------------------------------*/
58 void Delay_xMs(unsigned int xMs)
59 {
60 1 unsigned int i,j;
61 1 for(i=0;i<xMs;i++)
62 1 for(j=0;j<500;j++);
63 1 }
64
65
66 /*---------------------------------------
67 向LCD中写入指令或指令,F=0 是指令,F=1是数据,bkock是选择写入哪个区
68 ---------------------------------------*/
69 void LCD_Write( unsigned char Com,bit F)
70 {
71 1 LCD_PORT = Com; //把数据输出
72 1 LCD_RS = F; //确定是数据还是指令
73 1 LCD_RW = 0;
74 1
75 1 LCD_E = 1;
76 1 LCD_E = 0; //电平下降沿数据写入控制器
77 1 }
78
79 /*----------------------------------------------
80 坐标定位程序
81 参数XPage 定位页 取值0--7 共8页
82 Y 横向定位 取值0-191 共192列
83 -----------------------------------------------*/
84 void LCD_XY_SET(unsigned char X,unsigned char YPage)
85 {
86 1 if(X<64) //在第一个区中
87 1 {
88 2 LCD_CSAB_SET(0);
89 2 LCD_Write(FIRST_PAGE|YPage,0);
90 2 LCD_Write(START_YADD|X,0);
91 2 }
92 1 else if(X<128) //在第二个区中
93 1 {
94 2 LCD_CSAB_SET(1);
95 2 LCD_Write(FIRST_PAGE|YPage,0);
96 2 LCD_Write(START_YADD|X-64,0);
97 2 }
98 1 else if(X<192) //在第三个区中
99 1 {
100 2 LCD_CSAB_SET(2);
101 2 LCD_Write(FIRST_PAGE|YPage,0);
102 2 LCD_Write(START_YADD|X-128,0);
103 2 }
104 1 }
105
106
107 /*--------------------------------------------
108 清除一行的子程序 H是要清的页,取值0-3
109 --------------------------------------------*/
110 void LCD_Clear_H(unsigned char H)
111 {
112 1 unsigned char i,j,k;
113 1 for (k=0;k<2;k++)
114 1 for (i=0;i<3;i++)
115 1 {
116 2 LCD_XY_SET(i*64,H*2+k);
117 2 for(j=0;j<64;j++) LCD_Write(0x00,1);
C51 COMPILER V7.50 19264 02/19/2008 11:05:14 PAGE 3
118 2 }
119 1 }
120
121 /*----------------------------------------
122 LCD初始化程序
123 ----------------------------------------*/
124 void LCD_Init(void)
125 {
126 1 unsigned char i;
127 1 LCD_E = 0;
128 1 LCD_RW = 1;
129 1 LCD_RS = 0;
130 1
131 1 LCD_RESET= 0; //液晶模块复位
132 1 Delay_xMs(10); //等待10mS
133 1 LCD_RESET= 1; //液晶结束复位电平
134 1
135 1 LCD_CSAB_SET(0);
136 1 LCD_Write(DISP_ON,0); //模块1显示开
137 1 LCD_CSAB_SET(1);
138 1 LCD_Write(DISP_ON,0); //模块2显示开
139 1 LCD_CSAB_SET(2);
140 1 LCD_Write(DISP_ON,0); //模块3显示开
141 1 for (i=0;i<4;i++) LCD_Clear_H(i); //清屏
142 1 }
143
144 /*----------------------------------------
145 读display RAM
146 ---------------------------------------*
147 unsigned char LCD_READ_RAM(unsigned char x,unsigned char y)
148 {
149 unsigned char temp;
150 LCD_XY_SET(x,y);
151 LCD_RW = 1; //设置为读数据
152 LCD_RS = 1;
153 LCD_PORT =0XFF; //设置总线为高电平(空)
154 LCD_E = 0;
155 LCD_E = 1;
156 temp =LCD_PORT;
157 LCD_E =0;
158 return temp;
159 }
160
161
162 /*------------------------------------------
163 设制起始行,参数line为要起始的行,取值范围0--63,block 为要设置的块
164 -----------------------------------------*/
165 void LCD_LINE_SET(unsigned char line)
166 {
167 1 unsigned char i;
168 1 for (i=0;i<3;i++)
169 1 {
170 2 LCD_CSAB_SET(i);
171 2 LCD_Write(START_ROW|line,0);
172 2 }
173 1 }
174
175 /*----------------------------------------------
176 显示一个16*8的ASCII的程序 ,参数是ascii码值,x取值0-191,y取值0-3 只能显示四行
177 ------------------------------------------------*
178 bit LCD_PRINT_ASCII_1608(unsigned char ascii,unsigned char x,unsigned char y)
179 {
C51 COMPILER V7.50 19264 02/19/2008 11:05:14 PAGE 4
180 unsigned char i,j;
181 if((x+8)>191)return 1;
182 for(j=0;j<2;j++)
183 for(i=j;i<16;i+=2)
184 {
185 LCD_XY_SET(x+(i>>1),y*2+j);
186 LCD_Write(AsciiDotBig[(ascii-0x20)*16+i],1);
187 }
188 return 0;
189 }
190
191 /*-------------------------------------------------
192 查找汉字程序 参数是内码的高8位与低8位
193 ---------------------------------------------------*/
194 unsigned char LCD_SEARCH_HZ16(unsigned char h,unsigned char l)
195 {
196 1 unsigned char i;
197 1 for(i=0;i<17;i++)
198 1 if(HZ[i].Index[0]==h&&HZ[i].Index[1]==l) return i;
199 1 }
200
201 /*----------------------------------------------------
202 16点阵的汉字显示程序
203 ----------------------------------------------------*/
204 bit LCD_PRINT_HZ16(unsigned char wz,unsigned char x,unsigned char y)
205 {
206 1 unsigned char i,j;
207 1
208 1 if((x+16)>192) return 1;
209 1 for(j=0;j<2;j++)
210 1 for(i=0;i<16;i++)
211 1 {
212 2 LCD_XY_SET(x+i,y*2+j);
213 2 LCD_Write(HZ[wz].Msk[i+(16*j)],1);
214 2 }
215 1 return 0;
216 1 }
217
218 /*--------------------------------------------
219 点操作函数,参数,X/Y,取值为192/64 F 0-1,0是画点,1是取消点
220 ---------------------------------------*
221 void LCD_POINT(unsigned char X,unsigned char Y,bit F)
222 {
223 unsigned char i,j,k;
224 i=Y&&0xF8;//i是X/8的余数
225 Y>>=3; //x是X/8的商
226 j=LCD_READ_RAM(X,Y);//空读操作
227 j=LCD_READ_RAM(X,Y);//读出8位数据
228 LCD_XY_SET(X,Y);
229 k=1<<i;
230 if(F)
231 {
232 k=~k;
233 LCD_Write(j&k,1);
234 }
235 else
236 LCD_Write(j|k,1);
237 }
238 /*-----------------------------------------------
239 显示图像的一个例子
240 ---------------------------------------------*
241 void LCD_TU(void)
C51 COMPILER V7.50 19264 02/19/2008 11:05:14 PAGE 5
242 {
243 unsigned char i,j;
244 for(i=0;i<6;i++)
245 for(j=0;j<100;j++)
246 {
247 LCD_XY_SET(j,i);
248 LCD_Write(TP[i*100+j],1);
249 }
250 }
251
252
253 /*---------------------------------------------
254 测试主函数
255 -------------------------------------------------*/
256 void main()
257 {
258 1 unsigned char i,m;
259 1 unsigned char code c[]="南京普耕科技有限责任公司";
260 1 LCD_Init();
261 1
262 1 // LCD_TU();
263 1
264 1 for(i=0;i<24;i+=2) //24为12个汉字
265 1 {
266 2 m=LCD_SEARCH_HZ16(c[i],c[i+1]);
267 2 LCD_PRINT_HZ16(m,i*8,3);
268 2 }
269 1
270 1
271 1 for(i=0;i<64;i++)
272 1 {
273 2 LCD_LINE_SET(i);
274 2 if(i==0)
275 2 Delay_xMs(500); //等待
276 2 else
277 2 Delay_xMs(20); //等待
278 2 }
279 1 while(1);
280 1
281 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 495 ----
CONSTANT SIZE = 501 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 3
IDATA SIZE = ---- ----
BIT SIZE = ---- 1
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -