📄 main.lst
字号:
C51 COMPILER V8.02 MAIN 05/08/2012 23:40:12 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驱动AMPIRE128*64液晶
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"source.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 sbit KEY1=P3^0;
31 sbit KEY2=P3^1;
32 sbit KEY3=P3^2; //三个按键控制口
33
34
35 void delay(uint i)
36 {
37 1 while(--i);
38 1 }
39 void Read_busy()//读“忙”函数-----数据线的最高位DB71则busy
40 {
41 1 P0=0x00;
42 1 RS=0;
43 1 RW=1;
44 1 EN=1;
45 1 while(P0 & 0x80);
46 1 EN=0;
47 1 }
48
49 void write_LCD_command(uchar value) //写命令函数
50 {
51 1 Read_busy(); //对LCD的每次读写都要读忙
52 1 RS=0; //选择命令
53 1 RW=0; //读操作
54 1 LCD_databus=value;
55 1 EN=1; //EN由1----0锁存有效数据
C51 COMPILER V8.02 MAIN 05/08/2012 23:40:12 PAGE 2
56 1 _nop_();
57 1 _nop_();
58 1 EN=0;
59 1 }
60
61 void write_LCD_data(uchar value)//写数据函数
62 {
63 1 Read_busy();
64 1 RS=1; //选择数据
65 1 RW=0;
66 1 LCD_databus=value;
67 1 EN=1; //EN由1----0锁存有效数据
68 1 _nop_();
69 1 _nop_();
70 1 EN=0;
71 1 }
72
73 uchar Read_LCD(void) //读数据函数
74 {
75 1 uchar value;
76 1 Read_busy();
77 1 LCD_databus=0xFF; //先进行一次空读操作
78 1 RS=1;
79 1 RW=1;
80 1 EN=1;
81 1 _nop_();
82 1 _nop_();
83 1 EN=0;
84 1
85 1 LCD_databus=0xFF; //读取真正的数据
86 1 RS=1;
87 1 RW=1;
88 1 EN=1;
89 1 value=LCD_databus;
90 1 _nop_();
91 1 _nop_();
92 1 EN=0;
93 1
94 1 return value;
95 1 }
96
97 void Set_page(uchar page) //设置“页”LCD12864共8页,一页是8行点阵点
98 {
99 1 page=0xb8|page; //页的首地址为0xB8
100 1 write_LCD_command(page);
101 1 }
102
103 void Set_line(uchar startline) //设置显示的起始行
104 {
105 1 startline=0xC0|startline; //起始行地址为0xC0
106 1 write_LCD_command(startline); //设置从哪行开始:共0--63;一般从0 行开始显示
107 1 }
108
109 void Set_column(uchar column) //设置显示的列
110 {
111 1 column=column &0x3f; //列的最大值为64
112 1 column= 0x40|column; //列的首地址为0x40
113 1 write_LCD_command(column); //规定显示的列的位置
114 1 }
115
116 void SetOnOff(uchar onoff) //显示开关函数:0x3E是关显示,0x3F是开显示
117 {
C51 COMPILER V8.02 MAIN 05/08/2012 23:40:12 PAGE 3
118 1 onoff=0x3e|onoff; //onoff:1---开显示;0---关显示
119 1 write_LCD_command(onoff);
120 1 }
121
122 void SelectScreen(uchar screen) //选择屏幕
123 {
124 1 switch(screen)
125 1 {
126 2 case 0: CS1=0;CS2=0;break; //全屏
127 2 case 1: CS1=0;CS2=1;break;//左半屏
128 2 case 2: CS1=1;CS2=0;break;//右半屏
129 2 default:break;
130 2 }
131 1 }
132
133 void ClearScreen(uchar screen) //清屏函数
134 {
135 1 uchar i,j;
136 1 SelectScreen(screen); //0--全屏;1---左半屏;2---右半屏
137 1 for(i=0;i<8;i++) //控制页数0-7,共8页
138 1 {
139 2 Set_page(i);
140 2 Set_column(0);
141 2 for(j=0;j<64;j++) //控制列数0-63,共64列
142 2 {
143 3 write_LCD_data(0x00); //写入0,地址指针自加1
144 3 }
145 2 }
146 1 }
147
148 void init_LCD() //LCD的初始化
149 {
150 1 SetOnOff(1); //开显示
151 1 SelectScreen(0);
152 1 ClearScreen(0); //清屏
153 1 Set_line(0); //开始行:0
154 1 }
155 void Draw_dots(uchar x,uchar y,uchar color)
156 {
157 1 uchar x_byte;
158 1 uchar x_bit;
159 1 uchar Temp_data; //暂时存放从LCD读出的数据
160 1 x_byte=(y>>3); //计算出该点属于哪个字节
161 1 x_bit=y-(x_byte<<3); //属于字节的哪一位
162 1
163 1
164 1 if(x>63) //x>63则显示在右半屏
165 1 {
166 2 SelectScreen(2);
167 2 x=x-64;
168 2 }
169 1 else //显示在左半屏
170 1 {
171 2 SelectScreen(1);
172 2 }
173 1 Set_page(x_byte); //设置行地址
174 1 Set_column(x); //设置列地址
175 1 Temp_data=Read_LCD(); //先读出没打点前LCD中的数据
176 1 switch(color)
177 1 {
178 2 case 0x01 : Temp_data &= ~(1<<x_bit);break; //擦除
179 2 case 0x02 : Temp_data ^= (1<<x_bit); break; //反白
C51 COMPILER V8.02 MAIN 05/08/2012 23:40:12 PAGE 4
180 2 case 0x03 : Temp_data |= (1<<x_bit); break; //画点
181 2 default : break;
182 2 }
183 1
184 1 Set_page(x_byte);
185 1 Set_column(x);
186 1 write_LCD_data(Temp_data); //将处理后的数据送到LCD中显示
187 1
188 1 }
189 /**********************************
190 两点间画直线:
191 x1<x2<127,y1<y2<64
192 ***********************************/
193 void Draw_line(unsigned char x1,y1,x2,y2)
194 {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -