📄 main.lst
字号:
C51 COMPILER V8.02 MAIN 05/09/2012 00:01:34 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 程序:LCD12864显示图形
3 内容:在12864上显示正弦曲线——按键可调频率和幅度
4 学习板:HOT-51
5 软件:keil uVision3
6 液晶:QY12864HZ1
7 作者:大海橡树
8 整理日期:2010-12-08
9 修改:无
10
11
12 备注:有什么错误的地方,欢迎网友们到空间留言
13
14 O(∩_∩)O~
15
16
17 ********http://hi.baidu.com/echoas********/
18 #include<AT89X52.h>
19 #include<math.h>
20 #include"ZB.h"
21 #define uchar unsigned char
22 #define uint unsigned int
23
24 #define LCD_databus P0 //LCD数据总线连接P0口
25
26 sbit RS=P2^5;
27 sbit RW=P2^6;
28 sbit EN=P2^7;//LCD12864三个控制位
29
30 sbit DQ=P2^3;//DS18B20数据线
31 sbit KEY1=P3^2;
32 sbit KEY2=P3^3;
33 sbit KEY3=P3^4;
34 uchar key_value;
35
36 uchar HZ1[]="周期";
37 uchar HZ2[]="幅度";
38 void delay(uint i) //延时函数
39 {
40 1 while(--i);
41 1 }
42 void Read_busy() //LCD12864忙检测
43 {
44 1 RS=0;
45 1 RW=1;
46 1 EN=1;
47 1 LCD_databus=0xFF;
48 1 while(LCD_databus & 0x80); //判断最高位,1---busy,0---Nobusy
49 1 EN=0;
50 1 }
51
52 void write_LCD_command(uchar value)//写指令
53 {
54 1 RS=0;
55 1 RW=0;
C51 COMPILER V8.02 MAIN 05/09/2012 00:01:34 PAGE 2
56 1 EN=1;
57 1 LCD_databus=value;
58 1 delay(7);
59 1 EN=0;
60 1 }
61
62 void write_LCD_data(uchar value)//写数据
63 {
64 1 RS=1;
65 1 RW=0;
66 1 EN=1;
67 1 LCD_databus=value;
68 1 delay(7);
69 1 EN=0;
70 1 }
71
72 void init_LCD() //初始化LCD
73 {
74 1 write_LCD_command(0x30); //8位数,基本指令
75 1 delay(100);
76 1 write_LCD_command(0x30);
77 1 delay(37);
78 1 write_LCD_command(0x0C); //开显示,不显示光标,光标不闪烁
79 1 delay(100);
80 1 write_LCD_command(0x01); //清屏指令
81 1 delay(100);
82 1 write_LCD_command(0x06); //没写入数据,地址指针加1
83 1 }
84
85 void Clear_GDRAM() //清楚GDRAM
86 {
87 1 uchar x,y;
88 1 for(y=0;y<64;y++)
89 1 {
90 2 for(x=0;x<16;x++)
91 2 {
92 3 write_LCD_command(0x34);
93 3 write_LCD_command(y+0x80); //先送垂直地址
94 3 write_LCD_command(x+0x80); //后送水平地址
95 3 write_LCD_command(0x30); //基本指令
96 3 write_LCD_data(0x00); //写入数据0
97 3 write_LCD_data(0x00);
98 3 }
99 2 }
100 1 }
101
102 uchar ReadByte() //读LCD
103 {
104 1 uchar Read_value;
105 1 Read_busy();
106 1 RS=1;
107 1 RW=1;
108 1 EN=0;
109 1 EN=1;
110 1 Read_value=LCD_databus;
111 1 EN=0;
112 1
113 1 return Read_value;
114 1 }
115
116 void display_BMP(uchar *address)//显示图片
117 {
C51 COMPILER V8.02 MAIN 05/09/2012 00:01:34 PAGE 3
118 1 uchar i,j;
119 1 for(i=16;i<32;i++)
120 1 {
121 2 write_LCD_command(0x80+i); //先送垂直地址
122 2 write_LCD_command(0x80); //再送水平地址
123 2 for(j=0;j<16;j++)
124 2 {
125 3 write_LCD_data(*address);//写入数据
126 3 address++;
127 3 }
128 2 }
129 1
130 1 for(i=0;i<32;i++)
131 1 {
132 2 write_LCD_command(0x80+i);//先送垂直地址
133 2 write_LCD_command(0x88); //再送水平地址
134 2 for(j=0;j<16;j++)
135 2 {
136 3 write_LCD_data(*address);
137 3 address++;
138 3 }
139 2 }
140 1
141 1 }
142
143 void Draw_dots(uchar x,uchar y,uchar color)
144 {
145 1 uchar ROW,xlabel,xlabel_bit;
146 1 uchar Read_H,Read_L; //读LCD中的数据
147 1 write_LCD_command(0x34); //扩充指令
148 1 write_LCD_command(0x36); //打开绘图指令
149 1 xlabel=x>>4; //取16*16首地址
150 1 xlabel_bit=x & 0x0F; //计算该点在16位数据的第几位
151 1 if(y<32) //如果是上半屏,上下半屏y都是0--31
152 1 {
153 2 ROW=y;
154 2 }
155 1 else //显示的是下半屏
156 1 {
157 2 ROW=y-32;
158 2 xlabel+=8; //规定显示在下半屏
159 2 }
160 1 write_LCD_command(ROW+0x80); //送入垂直地址
161 1 write_LCD_command(xlabel+0x80);//再送入水平地址
162 1 ReadByte(); //读取当前GDRAM数据前腰进行一次空读,接下来就可以读出数据了
163 1 Read_H=ReadByte(); //读高8位
164 1 Read_L=ReadByte(); //读低8位
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -