📄 5.2.3-1.lst
字号:
C51 COMPILER V7.10 5_2_3_1 06/06/2004 11:46:18 PAGE 1
C51 COMPILER V7.10, COMPILATION OF MODULE 5_2_3_1
OBJECT MODULE PLACED IN 5.2.3-1.OBJ
COMPILER INVOKED BY: D:\Keil\C51\BIN\C51.EXE 5.2.3-1.c ROM(COMPACT) DEBUG OBJECTEXTEND
line level source
1 #include<reg51.h>
2 #include<math.h>
3 #include<INTRINS.H>
4 #define Uchar unsigned char
5 /*注:8031的晶振频率为12MHz*/
6 /***********液晶显示器接口引脚定义***************/
7 sbit Elcm=P2^7;
8 sbit CSALCM= P2^2;
9 sbit CSBLCM= P2^3;
10 sbit Dilcm=P2^0;
11 sbit Rwlcm=P2^1;
12 sbit RST=P1^2;
13 sfr Datalcm=0x80; /*数据口*/
14 /***********常用操作命令和参数定义***************/
15 #define DISPON 0x3f /*显示on*/
16 #define DISPOFF 0x3e /*显示off */
17 #define DISPFIRST 0xc0 /*显示起始行定义*/
18 #define SETX 0xb8 /*X定位设定指令(页)*/
19 #define SETY 0x40 /*Y定位设定指令(列)*/
20 #define Lcdbusy 0x80 /*LCM忙判断位*/
21
22 /**************显示分区边界位置*****************/
23 #define MODL 0x00 /*左区*/
24 #define MODM 0x40 /*左区和中区分界*/
25 #define MODR 0x80 /*中区和右区分界*/
26 #define LCMLIMIT 0x80 /*显示区的右边界*/
27 /*------------------------------------------------*/
28 #define nop() _nop_()
29 /****************全局变量定义*******************/
30 Uchar col,row,cbyte; /*列x,行(页)y,输出数据*/
31 bit xy; /*画线方向标志:1水平*/
32
33 /*****************函数列表**********************/
34 void Lcminit(void); /*液晶模块初始化*/
35 void Delay(Uchar); /*延时,入口数为Ms */
36 void lcdbusyL(void); /*busy判断、等待(左区)*/
37 void lcdbusyM(void); /*busy判断、等待(中区)*/
38 void lcdbusyR(void); /*busy判断、等待(右区)*/
39 void Putedot(Uchar); /*半角字符输出*/
40 void Putcdot(Uchar); /*全角(汉字)输出*/
41 void Wrdata(Uchar); /*数据输出给LCM*/
42 void Lcmcls( void ); /*LCM全屏幕清零(填充0) */
43 void wtcom(void); /*公用busy等待*/
44 void Locatexy(void); /*光标定位*/
45 void WrcmdL(Uchar); /*左区命令输出 */
46 void WrcmdM(Uchar); /*中区命令输出 */
47 void WrcmdR(Uchar); /*右区命令输出 */
48 void Putstr(Uchar *puts,Uchar i); /*中英文字符串输出*/
49 void Rollscreen(Uchar x); /*屏幕向上滚动*/
50 void Rddata(void); /*从液晶片上读数据*/
51 void Linehv(Uchar length); /*横(竖)方向画线*/
52 void point(void); /*打点*/
53 void Linexy(Uchar endx,Uchar endy);
54
55 /******************数组列表*********************/
C51 COMPILER V7.10 5_2_3_1 06/06/2004 11:46:18 PAGE 2
56 Uchar code Ezk[]; /*ASCII常规字符点阵码表 */
57 Uchar code Hzk[]; /*自用汉字点阵码表*/
58 Uchar code STR1[]; /*自定义字符串*/
59 Uchar code STR2[];
60 Uchar code STR3[];
61 Uchar code STR4[];
62
63 /****************************************主程序*****************************************/
64 void main(void)
65 {
66 1 Uchar x,j;
67 1 RST=0;
68 1 Delay(50);
69 1 RST=1;
70 1 Delay(80); /*延时大约40Ms,等待外设准备好*/
71 1 Lcminit(); /*液晶模块初始化,包括全屏幕清屏*/
72 1 col=1;
73 1 row=0;
74 1 for(j=0;j<7;j++)
75 1 {
76 2 Putcdot(j); /*第一行字符输出,12字节*/
77 2 col+=1;
78 2 }
79 1 col=1;
80 1 row=2;
81 1 Putstr(STR2,14); /*第二行字符输出,14字节*/
82 1 col=1;
83 1 row=4;
84 1 Putstr(STR3,11); /*第三行字符输出,11字节*/
85 1 col=1;
86 1 row=6;
87 1 Putstr(STR4,12); /*第四行字符输出,12字节*/
88 1 x=0;
89 1 col=1;
90 1 row=0;
91 1 xy = 1; /*方向标志。定为水平方向*/
92 1 /*Linehv(192); /*画一条横线(0,0)-(191,0)*
93 1 col=0;
94 1 row=15;
95 1 xy = 1;
96 1 Linehv(192); /*画一条横线(0,15)-(191,15)
97 1 col=0;
98 1 row=32;
99 1 xy = 1;
100 1 Linehv(192); /*画一条横线(0,32)-(191,32)
101 1 col=0;
102 1 row=1;
103 1 xy = 0; /*方向标志。定为垂直方向
104 1 Linehv(31); /*画一条竖线(0,1)-(0,31)
105 1 col=191;
106 1 row=1;
107 1 xy = 0;
108 1 Linehv(31); /*画一条竖线(191,1)-(191,31)
109 1 row=63;
110 1 Linexy(44,31); /*画一段斜线(0,63)-(44,31)
111 1 col=44;
112 1 row=31;
113 1 Linexy(190,62); /*继续画斜线(44,31)-(191,63)*/
114 1 while(1)
115 1 {
116 2 Rollscreen(x); /*定位新的显示起始行*/
117 2 //x++;
C51 COMPILER V7.10 5_2_3_1 06/06/2004 11:46:18 PAGE 3
118 2 Delay(100); /*延时,控制滚动速度*/
119 2 }
120 1
121 1
122 1 }
123
124 /***********************画线,任意方向的斜线,不支持垂直的或水平线***********************/
125 void Linexy(Uchar endx,Uchar endy)
126 {
127 1 register Uchar t;
128 1 int xerr=0,yerr=0,delta_x,delta_y,distance;
129 1 Uchar incx,incy;
130 1 delta_x=endx-col; /*计算两个方向的距离*/
131 1 delta_y=endy-row;
132 1 if(delta_x>0) incx=1; /*计算增量方向,增量为0表示既不是垂直线也不是水平线*/
133 1 else if( delta_x==0 ) incx=0;
134 1 else incx=-1;
135 1 if(delta_y>0) incy=1;
136 1 else if( delta_y==0 ) incy=0;
137 1 else incy=-1;
138 1 delta_x = cabs( delta_x ); /* 判定哪个距离比较大*/
139 1 delta_y = cabs( delta_y );
140 1 if( delta_x > delta_y ) distance=delta_x;
141 1 else distance=delta_y;
142 1 /*开始画线*/
143 1 for( t=0;t <= distance+1; t++ ) {
144 2 point();
145 2 xerr += delta_x ;
146 2 yerr += delta_y ;
147 2 if( xerr > distance ) {
148 3 xerr-=distance;
149 3 col+=incx;
150 3 }
151 2 if( yerr > distance ) {
152 3 yerr-=distance;
153 3 row+=incy;
154 3 }
155 2 }
156 1 }
157
158 /***************************画线,只提供X或Y方向的,不支持斜线*************************/
159 void Linehv(Uchar length)
160 {
161 1 Uchar xs,ys;
162 1 if (xy){ys = col;
163 2 for (xs=0;xs<length;xs++){
164 3 col = ys + xs;
165 3 point();}
166 2 }
167 1 else {xs = row;
168 2 for (ys=0;ys<length;ys++)
169 2 {
170 3 row = xs + ys;
171 3 point();}
172 2 }
173 1 }
174
175 /*****************************************画点******************************************/
176 void point(void)
177 {
178 1 Uchar x1,y1,x,y;
179 1 x1=col;
C51 COMPILER V7.10 5_2_3_1 06/06/2004 11:46:18 PAGE 4
180 1 y1=row;
181 1 row=y1>>3; /*取Y方向分页地址*/
182 1 Rddata();
183 1 y=y1&0x07; /*字节内位置计算*/
184 1 x=0x01;
185 1 x=x<<y; /*移入所画点*/
186 1 Wrdata(cbyte|x); /*画上屏幕*/
187 1 col=x1; /*恢复xy坐标*/
188 1 row=y1;
189 1 }
190
191 /**************************************屏幕滚动定位*************************************/
192 void Rollscreen(Uchar x)
193 {
194 1 cbyte = DISPFIRST|x; /*定义显示起始行为x?*/
195 1 WrcmdL(cbyte);
196 1 //WrcmdM(cbyte);
197 1 WrcmdR(cbyte);
198 1 WrcmdL(cbyte);
199 1 }
200
201 /**************************************一个字串的输出***********************************/
202 void Putstr(Uchar *puts,Uchar i)
203 {
204 1 Uchar j,X;
205 1 for (j=0;j<i;j++)
206 1 {
207 2 X = puts[j];
208 2 if (X&0x80)
209 2 {
210 3 Putcdot(X&0x7f);/*只保留低7位*/
211 3 }
212 2 else Putedot(X-0x20); /*ascii码表从0x20开始*/
213 2 }
214 1 }
215
216 /*********************************半角字符点阵码数据输出********************************/
217 void Putedot(Uchar Order)
218 {
219 1 Uchar i,bakerx,bakery; /*共定义4个局部变量*/
220 1 int x; /*偏移量,字符量少的可以定义为UCHAR */
221 1 bakerx = col; /*暂存x,y坐标,已备下半个字符使用*/
222 1 bakery = row;
223 1 x=Order * 0x10; /*半角字符,每个字符16字节*/
224 1 /*上半个字符输出,8列*/
225 1 for(i=0;i<8;i++)
226 1 {
227 2 cbyte = Ezk[x]; /*取点阵码,rom数组*/
228 2 Wrdata(cbyte); /*写输出一字节*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -