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