📄 main.lst
字号:
C51 COMPILER V8.02 MAIN 05/08/2012 23:39:39 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE MAIN
OBJECT MODULE PLACED IN main.OBJ
COMPILER INVOKED BY: E:\IDEsoftware\Keil uVision3\C51\BIN\C51.EXE main.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /*****http://hi.baidu.com/echoas********
2 程序:MCS-51驱动LCD12864液晶
3 内容:LCD12864显示正弦曲线
4 编译器:keil uVision3
5 开发板:Proteus仿真图
6 作者:大海橡树
7 整理日期:2011-01-28
8 修改:无
9
10 备注:有什么错误的地方,欢迎网友们到空间留言
11
12 O(∩_∩)O~
13
14 ******http://hi.baidu.com/echoas*********/
15 #include <AT89X52.h>
16 #include <intrins.h>
17 #include<math.h>
18 #include"ZB.h"
19 #define uchar unsigned char
20 #define uint unsigned int
21
22 #define LCD_databus P0 //LCD12864的8位数据口
23
24 sbit RS=P2^2; //RS为0---命令;1----数据
25 sbit RW=P2^1; //RW为1---写;0---读
26 sbit EN=P2^0; //使能端
27 sbit CS1=P2^4; //片选1低电平有效,控制左半屏
28 sbit CS2=P2^3; //片选1低电平有效,控制右半屏
29
30
31 void Read_busy()//读“忙”函数-----数据线的最高位DB71则busy
32 {
33 1 P0=0x00;
34 1 RS=0;
35 1 RW=1;
36 1 EN=1;
37 1 while(P0 & 0x80);
38 1 EN=0;
39 1 }
40
41 void write_LCD_command(uchar value) //写命令函数
42 {
43 1 Read_busy(); //对LCD的每次读写都要读忙
44 1 RS=0; //选择命令
45 1 RW=0; //读操作
46 1 LCD_databus=value;
47 1 EN=1; //EN由1----0锁存有效数据
48 1 _nop_();
49 1 _nop_();
50 1 EN=0;
51 1 }
52
53 void write_LCD_data(uchar value)//写数据函数
54 {
55 1 Read_busy();
C51 COMPILER V8.02 MAIN 05/08/2012 23:39:39 PAGE 2
56 1 RS=1; //选择数据
57 1 RW=0;
58 1 LCD_databus=value;
59 1 EN=1; //EN由1----0锁存有效数据
60 1 _nop_();
61 1 _nop_();
62 1 EN=0;
63 1 }
64
65 uchar Read_LCD(void) //读数据函数
66 {
67 1 uchar value;
68 1 Read_busy();
69 1 LCD_databus=0xFF; //先进行一次空读操作
70 1 RS=1;
71 1 RW=1;
72 1 EN=1;
73 1 _nop_();
74 1 _nop_();
75 1 EN=0;
76 1
77 1 LCD_databus=0xFF; //读取真正的数据
78 1 RS=1;
79 1 RW=1;
80 1 EN=1;
81 1 value=LCD_databus;
82 1 _nop_();
83 1 _nop_();
84 1 EN=0;
85 1
86 1 return value;
87 1 }
88
89 void Set_page(uchar page) //设置“页”LCD12864共8页,一页是8行点阵点
90 {
91 1 page=0xb8|page; //页的首地址为0xB8
92 1 write_LCD_command(page);
93 1 }
94
95 void Set_line(uchar startline) //设置显示的起始行
96 {
97 1 startline=0xC0|startline; //起始行地址为0xC0
98 1 write_LCD_command(startline); //设置从哪行开始:共0--63;一般从0 行开始显示
99 1 }
100
101 void Set_column(uchar column) //设置显示的列
102 {
103 1 column=column &0x3f; //列的最大值为64
104 1 column= 0x40|column; //列的首地址为0x40
105 1 write_LCD_command(column); //规定显示的列的位置
106 1 }
107
108 void SetOnOff(uchar onoff) //显示开关函数:0x3E是关显示,0x3F是开显示
109 {
110 1 onoff=0x3e|onoff; //onoff:1---开显示;0---关显示
111 1 write_LCD_command(onoff);
112 1 }
113
114 void SelectScreen(uchar screen) //选择屏幕
115 {
116 1 switch(screen)
117 1 {
C51 COMPILER V8.02 MAIN 05/08/2012 23:39:39 PAGE 3
118 2 case 0: CS1=0;CS2=0;break; //全屏
119 2 case 1: CS1=0;CS2=1;break;//左半屏
120 2 case 2: CS1=1;CS2=0;break;//右半屏
121 2 default:break;
122 2 }
123 1 }
124
125 void ClearScreen(uchar screen) //清屏函数
126 {
127 1 uchar i,j;
128 1 SelectScreen(screen); //0--全屏;1---左半屏;2---右半屏
129 1 for(i=0;i<8;i++) //控制页数0-7,共8页
130 1 {
131 2 Set_page(i);
132 2 Set_column(0);
133 2 for(j=0;j<64;j++) //控制列数0-63,共64列
134 2 {
135 3 write_LCD_data(0x00); //写入0,地址指针自加1
136 3 }
137 2 }
138 1 }
139
140 void InitLCD() //LCD的初始化
141 {
142 1 SetOnOff(1); //开显示
143 1 SelectScreen(0);
144 1 ClearScreen(0); //清屏
145 1 Set_line(0); //开始行:0
146 1 }
147
148 void Draw_dots(uchar x,uchar y,uchar color)
149 {
150 1 uchar x_byte;
151 1 uchar x_bit;
152 1 uchar Temp_data; //暂时存放从LCD读出的数据
153 1 x_byte=(y>>3); //计算出该点属于哪个字节
154 1 x_bit=y-(x_byte<<3); //属于字节的哪一位?
155 1
156 1
157 1 if(x>63) //x>63则显示在右半屏
158 1 {
159 2 SelectScreen(2);
160 2 x=x-64;
161 2 }
162 1 else //显示在左半屏
163 1 {
164 2 SelectScreen(1);
165 2 }
166 1 Set_page(x_byte); //设置行地址
167 1 Set_column(x); //设置列地址
168 1 Temp_data=Read_LCD(); //先读出没打点前LCD中的数据
169 1 switch(color)
170 1 {
171 2 case 0x01 : Temp_data &= ~(1<<x_bit);break; //擦除
172 2 case 0x02 : Temp_data ^= (1<<x_bit); break; //反白
173 2 case 0x03 : Temp_data |= (1<<x_bit); break; //画点
174 2 default : break;
175 2 }
176 1
177 1 Set_page(x_byte);
178 1 Set_column(x);
179 1 write_LCD_data(Temp_data); //将处理后的数据送到LCD中显示
C51 COMPILER V8.02 MAIN 05/08/2012 23:39:39 PAGE 4
180 1
181 1 }
182
183 void Display_HZ(uchar ss,uchar page,uchar column,uchar *p)
184 {
185 1 uchar i;
186 1 SelectScreen(ss);
187 1 Set_page(page); //写上半页
188 1 Set_column(column*16); //控制列
189 1 for(i=0;i<16;i++) //控制16列的数据输出
190 1 {
191 2 write_LCD_data(p[i]); //汉字的上半部分
192 2 }
193 1 Set_page(page+1); //写下半页
194 1 Set_column(column*16); //控制列
195 1 for(i=0;i<16;i++) //控制16列的数据输出
196 1 {
197 2 write_LCD_data(p[i+16]); //汉字的下半部分
198 2 }
199 1 }
200
201 void Display_picture(uchar a[][64])//显示图形--坐标
202 {
203 1 uchar i,j;
204 1
205 1 for(j=0;j<6;j++)
206 1 {
207 2 SelectScreen(1);
208 2 Set_page(j+2); //从第三页开始显示
209 2 Set_column(0);
210 2 for(i=0;i<64;i++)
211 2 {
212 3 write_LCD_data(a[2*j][i]);//每隔一行取一次数组中的数据
213 3 }
214 2 SelectScreen(2);
215 2 Set_page(j+2);
216 2 Set_column(0);
217 2 for(i=0;i<64;i++)
218 2 {
219 3 write_LCD_data(a[2*j+1][i]);//每隔一行取一次数组中的数据
220 3 }
221 2 }
222 1 }
223 void main()
224 {
225 1 uchar x,y;
226 1 InitLCD(); //初始12864
227 1 ClearScreen(0); //清屏
228 1 Set_line(0); //显示开始行
229 1
230 1 Display_HZ(1,0,0,da); //大
231 1 Display_HZ(1,0,1,hai); //海
232 1 Display_HZ(1,0,2,xiang); //橡
233 1 Display_HZ(1,0,3,shu); //树
234 1 Display_HZ(2,0,0,bai); //百
235 1 Display_HZ(2,0,1,du); //度
236 1 Display_HZ(2,0,2,kong); //空
237 1 Display_HZ(2,0,3,jian); //间
238 1 Display_picture(BMP); //坐标图
239 1 for(x=12;x<128;x++) //正弦曲线
240 1 {
241 2 y=35-18*sin((x-12)*3.14/16);
C51 COMPILER V8.02 MAIN 05/08/2012 23:39:39 PAGE 5
242 2 Draw_dots(x,y,2);
243 2 }
244 1
245 1 while(1);
246 1 }
247
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 768 ----
CONSTANT SIZE = 1024 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 12
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -