?? main.c
字號:
/********http://hi.baidu.com/echoas*******
程序:LCD12864顯示圖形
內容:在12864上顯示正弦曲線——按鍵可調頻率和幅度
學習板:HOT-51
軟件:keil uVision3
液晶:QY12864HZ1
作者:大海橡樹
整理日期:2010-12-08
修改:無
備注:有什么錯誤的地方,歡迎網友們到空間留言
O(∩_∩)O~
********http://hi.baidu.com/echoas********/
#include<AT89X52.h>
#include<math.h>
#include"ZB.h"
#define uchar unsigned char
#define uint unsigned int
#define LCD_databus P0 //LCD數據總線連接P0口
sbit RS=P2^5;
sbit RW=P2^6;
sbit EN=P2^7;//LCD12864三個控制位
sbit DQ=P2^3;//DS18B20數據線
sbit KEY1=P3^2;
sbit KEY2=P3^3;
sbit KEY3=P3^4;
uchar key_value;
uchar HZ1[]="周期";
uchar HZ2[]="幅度";
void delay(uint i) //延時函數
{
while(--i);
}
void Read_busy() //LCD12864忙檢測
{
RS=0;
RW=1;
EN=1;
LCD_databus=0xFF;
while(LCD_databus & 0x80); //判斷最高位,1---busy,0---Nobusy
EN=0;
}
void write_LCD_command(uchar value)//寫指令
{
RS=0;
RW=0;
EN=1;
LCD_databus=value;
delay(7);
EN=0;
}
void write_LCD_data(uchar value)//寫數據
{
RS=1;
RW=0;
EN=1;
LCD_databus=value;
delay(7);
EN=0;
}
void init_LCD() //初始化LCD
{
write_LCD_command(0x30); //8位數,基本指令
delay(100);
write_LCD_command(0x30);
delay(37);
write_LCD_command(0x0C); //開顯示,不顯示光標,光標不閃爍
delay(100);
write_LCD_command(0x01); //清屏指令
delay(100);
write_LCD_command(0x06); //沒寫入數據,地址指針加1
}
void Clear_GDRAM() //清楚GDRAM
{
uchar x,y;
for(y=0;y<64;y++)
{
for(x=0;x<16;x++)
{
write_LCD_command(0x34);
write_LCD_command(y+0x80); //先送垂直地址
write_LCD_command(x+0x80); //后送水平地址
write_LCD_command(0x30); //基本指令
write_LCD_data(0x00); //寫入數據0
write_LCD_data(0x00);
}
}
}
uchar ReadByte() //讀LCD
{
uchar Read_value;
Read_busy();
RS=1;
RW=1;
EN=0;
EN=1;
Read_value=LCD_databus;
EN=0;
return Read_value;
}
void display_BMP(uchar *address)//顯示圖片
{
uchar i,j;
for(i=16;i<32;i++)
{
write_LCD_command(0x80+i); //先送垂直地址
write_LCD_command(0x80); //再送水平地址
for(j=0;j<16;j++)
{
write_LCD_data(*address);//寫入數據
address++;
}
}
for(i=0;i<32;i++)
{
write_LCD_command(0x80+i);//先送垂直地址
write_LCD_command(0x88); //再送水平地址
for(j=0;j<16;j++)
{
write_LCD_data(*address);
address++;
}
}
}
void Draw_dots(uchar x,uchar y,uchar color)
{
uchar ROW,xlabel,xlabel_bit;
uchar Read_H,Read_L; //讀LCD中的數據
write_LCD_command(0x34); //擴充指令
write_LCD_command(0x36); //打開繪圖指令
xlabel=x>>4; //取16*16首地址
xlabel_bit=x & 0x0F; //計算該點在16位數據的第幾位
if(y<32) //如果是上半屏,上下半屏y都是0--31
{
ROW=y;
}
else //顯示的是下半屏
{
ROW=y-32;
xlabel+=8; //規定顯示在下半屏
}
write_LCD_command(ROW+0x80); //送入垂直地址
write_LCD_command(xlabel+0x80);//再送入水平地址
ReadByte(); //讀取當前GDRAM數據前腰進行一次空讀,接下來就可以讀出數據了
Read_H=ReadByte(); //讀高8位
Read_L=ReadByte(); //讀低8位
write_LCD_command(ROW+0x80); //送入垂直地址
write_LCD_command(xlabel+0x80); //再送入水平地址
if(xlabel_bit<8)
{
switch(color)
{
case 0:Read_H &= (~(0x01<<(7-xlabel_bit)));//若變白
break;
case 1:Read_H |= (0x01<<(7-xlabel_bit));//若涂黑
break;
case 2:Read_H ^= (0x01<<(7-xlabel_bit));//若反轉
break;
default:break;
}
write_LCD_data(Read_H);//將數據寫入GDRAM
write_LCD_data(Read_L);//先寫高位,再寫低位(地址指針順序)
}
else
{
switch(color)//color設置
{
case 0: Read_L &= (~(0x01<<(15-xlabel_bit)));//若變白
break;
case 1: Read_L |= (0x01<<(15-xlabel_bit));//若涂黑
break;
case 2: Read_L ^= (0x01<<(15-xlabel_bit));//若反轉
break;
default:break;
}
write_LCD_data(Read_H);
write_LCD_data(Read_L);//寫入數據
}
write_LCD_command(0x30);//回到普通模式
}
void main()
{
uchar i,j;
uchar num;
uchar w=10,A=6;
init_LCD();
Clear_GDRAM();
write_LCD_command(0x36);
display_BMP(ZB);
while(1)
{
write_LCD_command(0x30);
write_LCD_command(0x80);
write_LCD_data('T');
write_LCD_data(':');
write_LCD_data(2*w/100+0x30);
write_LCD_data(2*w%100/10+0x30);
write_LCD_data(2*w%10+0x30);
write_LCD_command(0x83);
write_LCD_data('A');
write_LCD_data(':');
write_LCD_data(A/10+0x30);
write_LCD_data(A%10+0x30);
write_LCD_command(0x36);
for(i=13;i<128;i++)
{
j=35-A*sin((i-13)*3.14/w);
Draw_dots(i,j,1);
delay(400);
}
/**********以下為按鍵掃描函數**************/
if(KEY1==0) //模式鍵按下
{
delay(2000);
if(KEY1==0)
{
while(!KEY1);
key_value++;
if(key_value>2)
key_value=0;
}
}
if(key_value==1) //若選擇的是周期模式
{
write_LCD_command(0x30);
write_LCD_command(0x86);
for(num=0;num<4;num++)
{
write_LCD_data(HZ1[num]); //顯示"周期"漢字
}
if(KEY2==0) //加鍵按下時
{
delay(1500);
if(KEY2==0)
{
while(!KEY2);
w=w+5; //w加
if(w==65)
w=10;
Clear_GDRAM();
write_LCD_command(0x36);//重新顯示圖形
display_BMP(ZB);
}
}
if(KEY3==0)
{
delay(2000);
if(KEY3==0)
{
while(!KEY3);
if(w>=10)
w=w-5;
Clear_GDRAM();
write_LCD_command(0x36);
display_BMP(ZB); //重新顯示圖形
}
}
}
if(key_value==2) //若選擇的是幅度模式
{
write_LCD_command(0x30);
write_LCD_command(0x86);
for(num=0;num<4;num++)
{
write_LCD_data(HZ2[num]);
}
if(KEY2==0)
{
delay(1500);
if(KEY2==0)
{
while(!KEY2);
A=A+2;
if(A==22)
A=8;
Clear_GDRAM();
write_LCD_command(0x36);
display_BMP(ZB);
}
}
if(KEY3==0)
{
delay(2000);
if(KEY3==0)
{
while(!KEY3);
if(A>=6)
A=A-2;
Clear_GDRAM();
write_LCD_command(0x36);
display_BMP(ZB);
}
}
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -