📄 lcd.lst
字号:
C51 COMPILER V7.06 LCD 06/25/2008 15:44:08 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE LCD
OBJECT MODULE PLACED IN LCD.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\c51.exe LCD.C DB OE
stmt level source
1 //********************************************************************************************************
-******************
2 #include <c8051F020.h>
3 #include <intrins.h>
4 #include <string.h>
5 #include <stdio.h>
6 #include <math.h>
7 #include "HEAD.H"
8 //********************************************************************************************************
-******************
9 void LCD_C_D(bit flag,unsigned char ldata)
10 {
11 1 A0 = !flag;
12 1 RD = 1;
13 1 WR = 1;
14 1 CS_LCD = 1;
15 1 P3 = LcdDataChange(ldata); // 由于硬件数据线相反
16 1 CS_LCD = 0;
17 1 WR = 0;
18 1 CS_LCD = 1;
19 1 WR = 1;
20 1 }
21 //********************************************************************************************************
-******************
22 void ChangeV(unsigned char changevol)
23 {
24 1 LCD_C_D(1,0x81); // 设置电量值寄存器
25 1 LCD_C_D(1,changevol); // V5 as 1/7
26 1 }
27 //********************************************************************************************************
-******************
28 void LCD_INIT(void)
29 {
30 1 xdata unsigned char i,j,st_data;
31 1
32 1 Delay_ms(200);
33 1 LCD_CLEAR();
34 1 LCD_C_D(1,0xA1); // Display ON(1)/OFF(0) 设置reverse的显示模式,seg132->seg1/
35 1 LCD_C_D(1,0x40); // 8.4ADD //0x20 //Display Start Line Address
36 1 for(i=0;i<8;i++) // 设置各page地址的column地址从0开始
37 1 {
38 2 st_data = i|0xB0;
39 2 LCD_C_D(1,st_data);
40 2 LCD_C_D(1,0x10);
41 2 LCD_C_D(1,0);
42 2 for (j=0;j<130;j++) // 清空显示RAM
43 2 {
44 3 LCD_C_D(0,0);
45 3 }
46 2 }
47 1 ChangeV(90);
48 1
49 1 LCD_C_D(1,0xA4); // 显示所有点
50 1 LCD_C_D(1,0xA6); // 正常显示
51 1 LCD_C_D(1,0xA3); // 设置电压基准比例1/7,a2
C51 COMPILER V7.06 LCD 06/25/2008 15:44:08 PAGE 2
52 1 LCD_C_D(1,0xC8); // 设置列扫描方向反转,c0
53 1 LCD_C_D(1,0x2F); // 电源供电操作模式boosting on/ regulator on/follower ON
54 1 LCD_C_D(1,0x81); // 设置电量值寄存器
55 1 LCD_C_D(1,0x64); // V5 as 1/7
56 1 LCD_C_D(1,0x23); // 内部电阻比例模式23,27
57 1 LCD_C_D(1,0xAD); // 静态指示常亮模式//cancle
58 1 LCD_C_D(1,0x03); // cancle
59 1 LCD_C_D(1,0xAF); // 设置显示模式ON
60 1
61 1 //LCD_DispStr("RotateSpeed",MainShowAddr,30);
62 1 disp_chn_str("抽油机转速仪",5,20,16,1);
63 1 //LCD_DispStr("Beijing Goldentime",MainShowAddr+30,10);
64 1 disp_chn_str("北京金时",40,35,16,1);
65 1 Display_Data();
66 1 Delay_ms(3000);
67 1 }
68 //********************************************************************************************************
-******************
69 void LCD_CLEAR(void)
70 {
71 1 xdata unsigned char i,j;
72 1
73 1 for (j = 0 ; j < 8 ; j ++)
74 1 {
75 2 for (i = 0 ; i< 128 ; i ++)
76 2 {
77 3 disp_ram[j][i] = 0x00;
78 3 }
79 2 }
80 1
81 1 Display_Data();
82 1 }
83 //********************************************************************************************************
-******************
84 void LCD_Cursor_Show(unsigned char lay_y,unsigned char lay_x)
85 {
86 1 draw_line(lay_x-2,lay_y+8,lay_x+4,lay_y+8);
87 1 Display_Data();
88 1 }
89 //********************************************************************************************************
-******************
90 //送显示缓冲区到显示屏 此液晶屏分左右半屏送显示缓冲区到显示屏是要分别写LCS2选通左半屏LCS1选通右半屏
91 void Display_Data(void)
92 {
93 1 xdata unsigned char i,j,disp_page;
94 1
95 1 disp_page = 0xB4;
96 1 for(i =0 ; i < 8; i++)
97 1 {
98 2 LCD_C_D(1,disp_page);
99 2 LCD_C_D(1,0x10); // 设置列地址高位
100 2 LCD_C_D(1,0x02); // 设置列地址低位0
101 2 for (j = 0;j < 128; j++)
102 2 {
103 3 LCD_C_D(0,disp_ram[i][j]) ;
104 3 }
105 2 disp_page ++;
106 2 if(disp_page > 0xB7)
107 2 disp_page = 0xB0;
108 2 }
109 1
110 1 ChangeV(RTUaddress4[33]);
C51 COMPILER V7.06 LCD 06/25/2008 15:44:08 PAGE 3
111 1 }
112 //********************************************************************************************************
-******************
113 unsigned char LcdDataChange(unsigned char datas)
114 {
115 1 xdata unsigned char i,tempd;
116 1 xdata unsigned char bb[8];
117 1
118 1 tempd=datas;
119 1 for(i=0;i<8;i++)
120 1 {
121 2 if((tempd & 0x01)==0x01)
122 2 bb[i]=1;
123 2 else
124 2 bb[i]=0;
125 2 tempd>>=1;
126 2 }
127 1 tempd=bb[0]*0x80+bb[1]*0x40+bb[2]*0x20+bb[3]*0x10+bb[4]*0x08+bb[5]*0x04+bb[6]*0x02+bb[7]*0x01;
128 1
129 1 return tempd;
130 1 }
131 //********************************************************************************************************
-******************
132 void draw_line(unsigned char x1, unsigned char y1,unsigned char x2, unsigned char y2)
133 {
134 1 xdata unsigned char i,line,page;
135 1 xdata float add_step,temp_step;
136 1
137 1 if(x1 > 126){x1 = x1 - 114;}
138 1 if(x2 > 126){x2 = x2 - 114;}
139 1 if(y1 > 64){y1 = y1 - 64;}
140 1 if(y2 > 64){y2 = y2 - 64;}
141 1 if((x1 == x2) && (y1 == y2))
142 1 {
143 2 line = y1 & 0x07; page = y1 >> 3;
144 2 disp_ram[page][x1] |= (0x01 << line);
145 2 }
146 1 else if(x1 == x2 )
147 1 {
148 2 if( y1 > y2 ) {i = y2; y2 = y1; y1 = i;}
149 2 for(i = y1; i <= y2 ;i++ )
150 2 {
151 3 line = i & 0x07; page = i >> 3;
152 3 disp_ram[page][x1] |= (0x01 << line);
153 3 }
154 2 }
155 1
156 1 else if(y1 == y2 )
157 1 {
158 2 if( x1 > x2 ) {i = x2; x2 = x1; x1 = i;}
159 2 line = 0x01 << (y1 & 0x07); page = y1 >> 3;
160 2 for(i = x1; i <= x2 ;i++ )
161 2 {
162 3 disp_ram[page][i] |= line;
163 3 }
164 2 }
165 1 else
166 1 {
167 2 if((abs)(y2-y1) >= abs(x2-x1))
168 2 {
169 3 temp_step = x1;
170 3 add_step = ((float)x2-(float)x1)/abs((float)y2-(float)y1);
C51 COMPILER V7.06 LCD 06/25/2008 15:44:08 PAGE 4
171 3 if(y1 > y2) i = 1; else i = 0;
172 3 do
173 3 {
174 4 x1 = temp_step;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -