📄 lcd.lst
字号:
C51 COMPILER V7.06 LCD 04/02/2007 15:23:04 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE LCD
OBJECT MODULE PLACED IN .\obj\lcd.obj
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE lcd.c LARGE OPTIMIZE(6,SPEED) BROWSE INCDIR(.\;.\c51) DEFINE(KEIL) DEBUG OB
-JECTEXTEND PRINT(.\lst\lcd.lst) OBJECT(.\obj\lcd.obj)
stmt level source
1 #include<math.h>
2 #include<INTRINS.H>
3 #include "lcd.h"
4 #include "main.h"
5
6
7
8
9 /****************全局变量定义*******************/
10 uchar row=0,col=0,cbyte; /*行(页)x,列y,输出数据*/
11 bit xy; /*画线方向标志:1水平,0垂直*/
12
13
14 /*************************************液晶屏初始化**************************************/
15 void Lcdinit(void)
16 { Delay(40);
17 1 cbyte = DISPOFF; /*关闭显示屏*/
18 1 WrcmdL(cbyte);
19 1 WrcmdR(cbyte);
20 1 cbyte = DISPON; /*打开显示屏*/
21 1 WrcmdL(cbyte);
22 1 WrcmdR(cbyte);
23 1 cbyte = DISPFIRST; /*定义显示起始行为零*/
24 1 WrcmdL(cbyte);
25 1 WrcmdR(cbyte);
26 1 Lcdclr(); /*清屏*/
27 1 Locatexy();
28 1 }
29 /*********************************制定坐标函数******************************************/
30 void WR_rowcol(uchar x,uchar y)
31 {row=x;
32 1 col=y;
33 1 }
34 /*********************************命令输出到左区控制口*********************************/
35 void WrcmdL(uchar X)
36 {
37 1 lcdbusyL(); /*确定分区,返回时保留分区状态不变*/
38 1 RS= 0; /*命令操作*/
39 1 RW = 0; /*写输出*/
40 1 Data= X; /*数据输出到数据口*/
41 1 E = 1;_nop_();E= 0; /*读入到LCD*/
42 1 }
43
44 /*********************************命令输出到右区控制口********************************/
45 void WrcmdR(uchar X)
46 {
47 1 lcdbusyR(); /*确定分区,返回时保留分区状态不变*/
48 1 RS= 0; /*命令操作*/
49 1 RW= 0; /*写输出*/
50 1 Data = X; /*命令输出到数据口*/
51 1 E = 1;_nop_();E = 0; /*读入到LCM*/
52 1 }
53 /************************分区操作允许等待,返回时保留分区选择状态*************************/
54 void lcdbusyL(void)
C51 COMPILER V7.06 LCD 04/02/2007 15:23:04 PAGE 2
55 {
56 1 CS1 = 1; CS2 = 0; /*置CS1为1,CS2为0,选择左区*/
57 1 wtcom(); /*等待使能*/
58 1 }
59 void lcdbusyR(void)
60 {
61 1 CS1= 0; CS2=1; /*置CS1为0,CS2为1,选择右区*/
62 1 wtcom(); /*等待使能*/
63 1 }
64 void wtcom(void)
65 {
66 1 RS= 0; /*清零RS*/
67 1 RW = 1; /*置RW为1*/
68 1 Data = 0xFF;
69 1 E= 1;_nop_();
70 1 while(Data & Lcdbusy);
71 1 E = 0;
72 1 }
73 /************************************清屏,全屏幕清零***********************************/
74 void Lcdclr( void )
75 {
76 1 for(row=0;row<8;row++)
77 1 for(col=0;col<LCDLIMIT;col++) Wrdata(0);
78 1 }
79 /******************根据设定的坐标数据,定位LCD上的下一个操作单元位置******************/
80 void Locatexy(void)
81 { uchar x,y;
82 1 switch (col&0x40) /* col与0xC0*/
83 1 { /*条件分支执行 */
84 2
85 2 case 0: {lcdbusyL();break;} /*左区*/
86 2 case 0x40: {lcdbusyR();break;} /*右区*/
87 2 }
88 1 x = row&0x07|SETX;
89 1 y = col&0x3F|SETY;
90 1 wtcom(); /*等待使能*/
91 1 RS= 0; /*清零rs */
92 1 RW= 0; /*清零RW*/
93 1 Data = x;
94 1 E= 1;_nop_();E = 0;
95 1 wtcom();
96 1 RS = 0;
97 1 RW= 0;
98 1 Data= y;
99 1 E = 1;_nop_();E = 0;
100 1 }
101 /*************************************数据写输出/**************************************/
102 void Wrdata(uchar X)
103 {
104 1 Locatexy(); /*坐标定位,返回时保留分区状态不变*/
105 1 RS= 1; /*数据输出*/
106 1 RW = 0; /*写输出*/
107 1 Data = X; /*数据输出到数据口*/
108 1 E = 1; /*读入到LCD*/
109 1 _nop_();
110 1 E = 0;
111 1 }
112 /***********************画线,任意方向的斜线,不支持垂直的或水平线***********************/
113 void Linexy(uchar posx,uchar posy,uchar endx,uchar endy)
114 {
115 1 uchar t;
116 1 int xerr=0,yerr=0,delta_x,delta_y,distance;
C51 COMPILER V7.06 LCD 04/02/2007 15:23:04 PAGE 3
117 1 uchar incx,incy;
118 1 WR_rowcol(posx,posy) ;
119 1 delta_x=endy-row; /*计算两个方向的距离*/
120 1 delta_y=endx-col;
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(row,col);
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 posx,uchar posy,uchar length,uchar XY)
149 { uchar xs,ys;
150 1 if(XY==0x00)
151 1 xy=0;
152 1 else xy=1;
153 1 WR_rowcol(posx,posy);
154 1 if (xy)
155 1 {ys = col;
156 2 for (xs=0;xs<length;xs++)
157 2 { col = ys + xs;
158 3 point(row,col);}
159 2 }
160 1 else {xs = row;
161 2 for (ys=0;ys<length;ys++)
162 2 {
163 3 row = xs + ys;
164 3 point(row,col);}
165 2 }
166 1 }
167
168 /*****************************************画点******************************************/
169 void point(uchar posx,uchar posy)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -