📄 6963a.lst
字号:
C51 COMPILER V7.50 6963A 12/30/2008 12:27:16 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE 6963A
OBJECT MODULE PLACED IN 6963a.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE 6963a.c BROWSE DEBUG OBJECTEXTEND
line level source
1 //液晶控制器T6963的C语言驱动程序
2 //评:系转载,液晶控制器T6963的C语言驱动程序,T6963应用广泛,特别是240×128的液晶基本上都是用这个芯片。
3
4 #include "absacc.h"
5 #include "math.h"
6 #include "ASCII816.h" //字符点阵库 0x20--0x7F
7 #include "HZTable.h" //汉字点阵库(自做)
8 #include "menu.h" //汉字点阵库(自做)
9
10 //set following data by user according to LCD
11 #define ComPort 0xB101
12 #define DataPort 0xB000
13 #define GraphAddr 0x0000 //head of graph
14
15 //以8*8字符计算,显示屏横向、纵向可以显示的字符个数
16 //以240*128为例:
17 #define LineChar 30 //一行16个字符(8*8)
18 #define ColumnChar 16 //总共16列
19
20
21 //指令,数据 读写状态检查
22 #define RWCheck() { unsigned char sta; do{ sta=XBYTE[ComPort] & 0x03; } while(sta!=0x03); }
23 //数据自动读 状态检查
24 #define AutoRCheck() { unsigned char sta; do{ sta=XBYTE[ComPort] & 0x04; } while(sta!=0x04); }
25 //数据自动写 状态检查
26 #define AutoWCheck() { unsigned char sta; do{ sta=XBYTE[ComPort] & 0x08; } while(sta!=0x08); }
27
28 /*------输入/出函数,与T6963通讯------------------------------------------------*/
29 /*------------------------------------------------------------------------*/
30
31 // 向数据口发Data
32 #define OutPortData(dat ) { RWCheck(); XBYTE[DataPort]=dat; }
33
34 //写有 1 个参数命令
35 #define OutPortCom1(command) { RWCheck(); XBYTE[ComPort]= command; }
36
37 //写有 2 个参数命令
38 #define OutPortCom2(dat, command) { OutPortData(dat); OutPortCom1(command); }
39
40 //写有 3 个参数命令
41 #define OutPortCom3(data1, data2, command) { OutPortData(data1); OutPortData(data2); OutPortCom1(command);
-}
42
43
44 unsigned char InPortData() { RWCheck(); return(XBYTE[DataPort]); }
45
46 /*-----------------------------------------------------------------------------------*/
47 //显示8*16字符
48 //lin:行(0-7), column: 列(0-15)
49 //ch:字符代码(标准ASCII码)
50 void ShowChar(unsigned char lin,unsigned char column,unsigned char ch)
51 {
52 1 unsigned char i;
53 1 unsigned char dat;
54 1 unsigned int StartAddr;
C51 COMPILER V7.50 6963A 12/30/2008 12:27:16 PAGE 2
55 1
56 1 StartAddr=lin*LineChar +column; //定位起始行
57 1
58 1 for(i=0;i<16;i++)
59 1 {
60 2 dat=ASCII816[ ch-0x20 ][i];
61 2 OutPortCom3( (unsigned char)(StartAddr), (unsigned char)(StartAddr>>8), 0x24); //set address
62 2 OutPortCom2( dat, 0xc4);
63 2
64 2 StartAddr=StartAddr + LineChar;
65 2 }
66 1 }
67
68 /*----------------------------------------------------------------------------------------------*/
69 //显示一个汉字(16*16点阵)
70 //lin:行(0-7), column: 列(0-7)
71 //hzcode: 汉字代码(自定义的)
72 void ShowHZ(unsigned char lin,unsigned char column,unsigned int hzcode)
73 {
74 1 unsigned char i;
75 1 unsigned int StartAddr;
76 1
77 1 StartAddr=lin*LineChar + column; //定位起始行
78 1
79 1 for(i=0;i<16;i++)
80 1 {
81 2 OutPortCom3( (unsigned char)(StartAddr), (unsigned char)(StartAddr>>8), 0x24);
82 2 OutPortCom2( HZTable[hzcode][i*2], 0xc0); //左半部 地址加一
83 2 OutPortCom2( HZTable[hzcode][i*2+1], 0xc4); //右半部 字模地址加一
84 2
85 2 StartAddr=StartAddr + LineChar;
86 2 }
87 1 }
88 /////////////////////////////////////////////////////////////////////////////////////////////
89 //显示一个汉字(16*16点阵)
90 //lin:行(0-7), column: 列(0-7)
91 //hzcode: 汉字代码(自定义的)
92 void ShowHZD(unsigned char lin,unsigned char column,unsigned int hzcode)
93 {
94 1 unsigned char i,j;
95 1 unsigned int StartAddr;
96 1
97 1 StartAddr=lin*LineChar*16 +column; //定位起始行
98 1
99 1 for(i=0;i<35;i++)
100 1 {
101 2 OutPortCom3( (unsigned char)(StartAddr), (unsigned char)(StartAddr>>8), 0x24); //定位当前操作位置
102 2 for(j=0;j<5;j++) OutPortCom2( HZTable[hzcode][i*5+j], 0xc0); //显示当前一行
103 2
104 2 StartAddr=StartAddr + LineChar;
105 2 }
106 1 }
107
108 ////////////////////////////////////////////////////////////////////////////////////////////
109 /*-----------------------------------------------------------------------------------*/
110 //显示一行字符串(汉字,字母混排,一行16字节)
111 //lin:行
112 //lineheadaddr: 此行汉字代码区首地址
113 void ShowLine(unsigned char lin,unsigned char column,unsigned char linehead[])
114 {
115 1 unsigned char i,j;
116 1 unsigned char byte;
C51 COMPILER V7.50 6963A 12/30/2008 12:27:16 PAGE 3
117 1 unsigned int hzcode;
118 1
119 1 for( i= column,j=0; i< column+14 ; )
120 1 { byte=linehead[j];
121 2 if(byte < 0x80) //字母
122 2 {
123 3 ShowChar(lin, i , byte);
124 3 i=i+1;j=j+1;
125 3 }
126 2 else // byte >= 0x80(汉字)
127 2 {
128 3 byte=byte & 0x7f; //最高位置0,即:减去0x8000
129 3 hzcode=byte*256 + linehead[j+1]; //加低8位,组合成整型数地址
130 3 ShowHZ( lin,i,hzcode);
131 3 i=i+2;j=j+2;
132 3 }
133 2 }
134 1 }
135
136 /*-----------------------------------------------------------------------------------*/
137 //显示一屏汉字
138 //pageheadaddr:此屏汉字代码地址区首地址
139 void ShowPage(unsigned char lin,unsigned char column1,unsigned char pagehead[][14])
140 {
141 1 unsigned char i;
142 1 for(i=0;i< 4 ;i++)
143 1 ShowLine((lin+i*20),column1,pagehead[i]); //1行8个汉字,16字节
144 1 }
145
146 /*----------------------------------------------------------------------------------------------------*/
147 //反显一个字符
148 //lin:行(0-7), column: 列(0-15)
149 void ReverseShowChar(unsigned char lin,unsigned char column)
150 {
151 1 unsigned char i;
152 1 unsigned char dat;
153 1 unsigned int StartAddr;
154 1
155 1 StartAddr=lin*LineChar +column; //定位起始行
156 1
157 1 for(i=0;i<16;i++)
158 1 {
159 2 OutPortCom3( (unsigned char)(StartAddr), (unsigned char)(StartAddr>>8), 0x24); //set address
160 2 OutPortCom1( 0xc5 ); //数据一次读,地址不变
161 2 dat=InPortData(); //读入数据
162 2 dat=~dat; //取反
163 2 OutPortCom2( dat, 0xc4); //送回
164 2
165 2 StartAddr=StartAddr+ LineChar;
166 2 }
167 1 }
168
169
170 /*----------------------------------------------------------------------------------------------------*/
171 //反显一个汉字
172 //lin:行(0-7), column: 列(0-15)
173 void ReverseShowHZ(unsigned char lin,unsigned char column)
174 {
175 1 ReverseShowChar(lin,column);
176 1 ReverseShowChar(lin,column+1);
177 1 }
178 /*----------------------------------------------------------------------------------------------------*/
C51 COMPILER V7.50 6963A 12/30/2008 12:27:16 PAGE 4
179 //反显一行汉字
180 //lin:行(0-7)
181 void ReverseShowLine(unsigned char lin)
182 {
183 1 unsigned char column;
184 1 for(column=0; column< ColumnChar; column++) ReverseShowChar(lin,column);
185 1 }
186
187
188 //////////////////////////////////////////////////////////////////////////////////////
189 void ShowPicture(unsigned char Startline,unsigned char Startcolumn,unsigned char LineWidth,unsigned char C
-olumnWidth,unsigned int address)
190 {
191 1 unsigned char i,j;
192 1 unsigned int StartAddr;
193 1
194 1 StartAddr=Startline*LineChar + Startcolumn; //定位起始位置
195 1
196 1 for(i=0;i<ColumnWidth;i++)
197 1 {
198 2
199 2 OutPortCom3( (unsigned char)(StartAddr), (unsigned char)(StartAddr>>8), 0x24); //set address
200 2 for(j=0;j<LineWidth;j++)
201 2 {
202 3 OutPortCom2( CBYTE[address + i*LineWidth+ j ], 0xc0);
203 3 }
204 2 StartAddr=StartAddr + LineChar;
205 2 }
206 1 }
207
208 //////////////////////////////////////////////////////////////////////////////////////////////////////////
-//////////////////////////////
209 /////////////////////////////////////////////////////////////////////////////
210 //图形函数,用于描点画图
211 //---------------------------------------------------------------------------
212 //在指定位置显示一个点
213 //如果显示屏超过了256*256,请修改这个函数 PointX,PointY的类型
214 //Mode 1:显示 0:清除该点
215 Pixel(unsigned char PointX,unsigned char PointY, bit Mode)
216 {
217 1 unsigned int StartAddr=0;
218 1 unsigned char dat;
219 1
220 1 StartAddr=PointX*LineChar + PointY/8;
221 1 dat=0xf0+7-PointY%8;
222 1 if(Mode) dat=dat|0x08;
223 1
224 1 OutPortCom3( (unsigned char)(StartAddr),(unsigned char)(StartAddr>>8),0x24 ); //设置该点所在单元地址
225 1 OutPortCom1(dat);
226 1 }
227
228 //-------------------------------------------------------------------------------
229 //划线函数
230 void Line( unsigned char x1, unsigned char y1, unsigned char x2, unsigned char y2, bit Mode)
231 {
232 1 unsigned char x,y;
233 1 double k,b;
234 1
235 1 if( abs(y1-y2) <= abs(x1-x2) ) // |k|<=1
236 1 {
237 2 k=(float)(y2-y1) / (float)(x2-x1) ;
238 2 b=y1-k*x1;
C51 COMPILER V7.50 6963A 12/30/2008 12:27:16 PAGE 5
239 2
240 2 if( x1 <= x2 )
241 2 {
242 3 for(x=x1;x<=x2;x++)
243 3 {
244 4 y=k*x+b;
245 4 Pixel(x, y, Mode);
246 4 }
247 3 }
248 2 else
249 2 {
250 3 for(x=x2;x<=x1;x++)
251 3 { y=k*x+b;
252 4 Pixel(x, y, Mode);
253 4 }
254 3 }
255 2 }
256 1 else // abs(y1-y2) > abs(x1-x2) |K|>1
257 1 {
258 2 k=(float)(x2-x1) / (float)(y2-y1) ;
259 2 b=x1-k*y1;
260 2
261 2 if( y1 <= y2 )
262 2 {
263 3 for(y=y1;y<=y2;y++)
264 3 { x=k*y+b;
265 4 Pixel( x , y,Mode );
266 4 }
267 3 }
268 2 else
269 2 {
270 3 for(y=y2;y<=y1;y++)
271 3 { x=k*y+b;
272 4 Pixel( x , y,Mode );
273 4 }
274 3 }
275 2 }
276 1 }
277
278 /*---------------------------------------------------------------------------------------------------*/
279 void ClearScreen()
280 {
281 1
282 1 unsigned int i;
283 1 ///////// 清显示 RAM 区 0000h--2000h (8k)
284 1 OutPortCom3(0x00,0x00,0x24); //设置指针地址0000H
285 1
286 1 OutPortCom1(0xb0); //设置自动写状态
287 1 for(i=0x00;i<0x2000;i++) OutPortData(0x00); // data=0;
288 1 OutPortCom1(0xb2); // 自动写结束
289 1 }
290
291 //初始化LCD
292 //需要手动设置
293 void InitLCD()
294 {
295 1 OutPortCom3( 0x00,0x00,0x42 ); //设置图形显示区域首地址GraphAddr
296 1 OutPortCom3( 30,0x00,0x43 ); //设置图形显示区域宽度 : LineChar
297 1
298 1 // OutPortCom3( 0x00,0x00,0x42 ); //设置图形显示区域首地址GraphAddr
299 1 // OutPortCom3( 0x10,0x00,0x43); //设置图形显示区域宽度:10H
300 1
C51 COMPILER V7.50 6963A 12/30/2008 12:27:16 PAGE 6
301 1 OutPortCom1(0xa7); //设置光标形状 cursor size 8x8
302 1 OutPortCom1(0x80); //设置显示方式: CGROM方式 文本\图形 "或"
303 1 OutPortCom1(0x98); //设置显示开关: 1001 1100 图形
304 1
305 1 ClearScreen();
306 1 }
307
308
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1818 ----
CONSTANT SIZE = 1712 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 53
IDATA SIZE = ---- ----
BIT SIZE = ---- 2
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -