📄 lcd.lst
字号:
C51 COMPILER V8.01 LCD 12/04/2006 10:50:22 PAGE 1
C51 COMPILER V8.01, COMPILATION OF MODULE LCD
OBJECT MODULE PLACED IN lcd.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE lcd.c LARGE OPTIMIZE(7,SPEED) BROWSE ORDER MODDP2 DEBUG OBJECTEXTEND
line level source
1
2 #include <stdarg.h>
3 #include <stdio.h>
4
5 #include "system.h"
6 #include "compiler.h"
7 #include "lcd.h"
8 #include "dot.h"
9
10 char etxt[40];
11
12 void lprintf(Uchar Ox,Uchar Oy,unsigned char att,char * fmt, ...)
13 {
14 1 va_list arg_ptr;
15 1 va_start (arg_ptr, fmt); //规格化字符串
16 1 vsprintf (etxt, fmt, arg_ptr);
17 1 dprintf (Ox, Oy, etxt,att) //汉字字母混合显示
18 1 va_end (arg_ptr);
19 1 }
20
21 // 写指令代码子程序
22 void vComToLcd( Uchar ComByte )
23 {
24 1 vLcdCmdPort(ComByte);
25 1 }
26
27 // 写参数及显示数据子程序
28 void vDataToLcd( Uchar dataW )
29 {
30 1 vLcdDataPort(dataW);
31 1 }
32
33 /*=====================================
34 初始化子程序
35 ======================================*/
36 void vInitLcd( void ) {
37 1
38 1 Uchar i;
39 1
40 1 vComToLcd( SystemSet ); // 系统参数设置
41 1 for (i=0;i<8;i++) {
42 2 vDataToLcd( ParaSysTable8[i] ); //
43 2 }
44 1
45 1 vComToLcd( Scroll ); //设定显示区域起始地址
46 1 for (i=0;i<10;i++) {
47 2 vDataToLcd( ParaScrTableA[i] );
48 2 }
49 1
50 1 vComToLcd( HdotScr ); // 写入点位移指令代码
51 1 vDataToLcd( 0 ); // 写入P1参数
52 1 vComToLcd( Ovlay ); // 显示合成方式设置
53 1 vDataToLcd( 0x0c ); // 0000 0100 显示一区三区图形,二重"或"合成
54 1 vComToLcd( DispOn ); // 写入指令代码
55 1 vDataToLcd( 0x54 ); // 显示 1~4 区开显示,光标关显示
C51 COMPILER V8.01 LCD 12/04/2006 10:50:22 PAGE 2
56 1 }
57
58 /*==============================================================================
59 ; 汉字写入子程序(图形方式)。每次调用输出一个汉字
60 ; 支持图形方式使用,完成汉字点阵码的输出。
61 ; 携入参数: Ox,Oy....写入显示的左上角坐标,Ox是以字节单位,Oy以行扫描线单位
62 Ptr......汉字码,库内的排列编码,大型程序时请改用Uint类型
63 ; 无返回数据。
64 ==============================================================================*/
65 void vDrawLogo(Uchar mOx, Uchar mOy, Uint mLogoWidth, Uchar mLogoHigh, Uchar mPosion)
66 {
67 1 unsigned int DotPtr,Optr;
68 1 unsigned char ColCount,RowCount,mByte;
69 1
70 1 DotPtr = 0;
71 1 Optr = (Uint)mOy*paraP9 + mOx; //显示单元起始位置
72 1 if(mPosion)Optr += ((Uint)BasePart2)<<8; //指向第二区加上第二区首地址
73 1 mByte = (Uchar)(mLogoWidth/8); //一行显示字节
74 1
75 1 for(RowCount=0;RowCount<mLogoHigh;RowCount++)
76 1 {
77 2 //光标起点定位
78 2 vComToLcd(CsrW); //光标定位指令
79 2 vDataToLcd((Uchar)(Optr&0xff)); //设置光标地址CSR
80 2 vDataToLcd((Uchar)(Optr/256 ));
81 2
82 2 vComToLcd(CsrDirR); //光标自动右移。
83 2
84 2 //显示一行
85 2 vComToLcd(mWrite); //数据写指令
86 2 for (ColCount=0;ColCount<mByte;ColCount++)
87 2 {
88 3 vDataToLcd(CdotLogolib[DotPtr]); //写入数据
89 3 DotPtr++;
90 3 }
91 2 Optr += 0x28;
92 2 }
93 1
94 1 }
95
96 void vClearLcd( void )
97 {
98 1 Uint lcd_ram = 0x2580;
99 1 vComToLcd( CsrDirR ); // 光标移动方向定义:自动右移
100 1 vComToLcd( CsrW ); // 光标Locate,定位
101 1 vDataToLcd(0); // 写入参数CSRL设置参数光标指针低8位
102 1 vDataToLcd(0); // 写入参数CSRH设置参数光标指针高8位
103 1 vComToLcd( mWrite ); // 数据写入指令,代码0x42
104 1 while(lcd_ram--)
105 1 {
106 2 vDataToLcd( 0x0 ); // 写入数据0
107 2 }
108 1
109 1 lcd_ram = 0x2580;
110 1 vComToLcd( CsrDirR ); // 光标移动方向定义:自动右移
111 1 vComToLcd( CsrW ); // 光标Locate,定位
112 1 vDataToLcd(0x00); // 写入参数CSRL设置参数光标指针低8位
113 1 vDataToLcd(0x40); // 写入参数CSRH设置参数光标指针高8位
114 1 vComToLcd( mWrite ); // 数据写入指令,代码0x42
115 1 while(lcd_ram--)
116 1 {
117 2 vDataToLcd( 0x0 ); // 写入数据0
C51 COMPILER V8.01 LCD 12/04/2006 10:50:22 PAGE 3
118 2 }
119 1 }
120
121 /*============================================================================
122 光标位定位,用于在1区图形方式下。
123 输入参数约定: x...水平方向字节单位坐标,即可以以半个汉字宽度设定水平坐标。
124 y...垂直方向以行线定位的坐标,可以定位到点单位。
125 左上角约定坐标为( 0, 0 )
126
127 ============================================================================*/
128 void Locatexy(Uchar x,Uchar y, Uchar attribs)
129 {
130 1 Uint temp;
131 1 temp = (Uint)y*paraP9+x;
132 1 if(attribs)temp += ((Uint)BasePart2)<<8; // 如果需要就指向第二区,加上第二区首地址
133 1 vComToLcd(CsrW); // 光标Locate,定位
134 1 vDataToLcd((Uchar)(temp & 0xff)); // 写入参数CSRL设置参数光标指针低8位
135 1 vDataToLcd((Uchar)(temp /256 )); // 写入参数CSRH设置参数光标指针高8位
136 1 }
137
138 /*=============================================================================
139 ASCII(8*16) 及 汉字(16*16) 混合字符串显示函数
140 输入参数约定:
141 x,y显示字符串的左上角xy坐标.x..8点一字节位置; y..一条扫描线定位
142
143 *ptr...字符串指针,本函数所指的是flash字串
144 att....显示区标志,0...第一区;1...第二区
145 返回参数:输出字串长度,留意汉字一个算两个
146 其它假定:调用时汉字必须在字库数组中已经存在,否则将输出不正确的结果
147 ==============================================================================*/
148 Uchar dprintf(Uchar x,Uchar y, char *ptr, Uchar att)
149 {
150 1 Uchar c1,c2;
151 1 Uchar i,j,uLen,uRow,uCol,temp;
152 1 Uint k;
153 1 uRow = x;
154 1 uCol = y;
155 1 uLen=0;
156 1
157 1 vComToLcd( CsrDirD ); // 光标移动方向定义:自动下移
158 1 Locatexy(uRow,uCol,att); //起点定位
159 1 while ( (Uchar)*(ptr+uLen) >= 0x10 ){uLen++;}; //探测字串长度
160 1 i=0;
161 1 while(i<uLen)
162 1 {
163 2 c1 = ptr[i];
164 2 c2 = ptr[i+1];
165 2
166 2 //ascii字符与汉字内码的区别在于128做分界,大于界线的为汉字码
167 2 if(c1 <=128) // ASCII
168 2 {
169 3 if (c1 >= 0x10) {
170 4 vComToLcd( mWrite ); // 写数据(命令)
171 4 for(j=0;j<16;j++) vDataToLcd( ASC_MSK[(c1-0x20)*16 +j ]);
172 4 }
173 3 uRow++; // 列数加1
174 3 }
175 2 else // 中文
176 2 {
177 3 for(j=0;j<sizeof(Cdotlib)/sizeof(Cdotlib[0]);j++) // 查找定位
178 3 {
179 4 if((c1 == Cdotlib[j].Index[0]) && (c2 == Cdotlib[j].Index[1]))
C51 COMPILER V8.01 LCD 12/04/2006 10:50:22 PAGE 4
180 4 break;
181 4 }
182 3 for(k=0;k<2;k++) // 分16行输出
183 3 {
184 4 Locatexy(uRow+k,uCol,att);
185 4 vComToLcd( mWrite ); // 写数据(命令)
186 4 for(temp=0;temp<16;temp++) vDataToLcd( Cdotlib[j].Msk[temp*2 + k]);
187 4 }
188 3 uRow +=2; // 光标右移一大格
189 3 i++;
190 3 }
191 2 if(uRow >= 40) // 光标后移
192 2 {
193 3 uCol += 16; // Y坐标
194 3 uRow = 0; // X坐标
195 3 if( uCol >= 240 ) uCol = 0;
196 3 }
197 2
198 2 Locatexy(uRow,uCol,att);
199 2 i++;
200 2 }
201 1 return uLen; //返回字串长度,汉字按2字节计算
202 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 969 ----
CONSTANT SIZE = 5388 ----
XDATA SIZE = 40 70
PDATA SIZE = ---- ----
DATA SIZE = ---- ----
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 + -