?? 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 + -