LCD12864显示屏实现曲线图温度显示程序经过调试正常运行,可以给大家作一个参考。是51单片机开发板给的新教程与大家分享。
制作出来的实物图如下:
电路原理图如下:
Keil代码下载:
LCD12864显示温度曲线(keil4).rar
(136.38 KB, 下载次数: 335)
以下是部份代码,完整包可以下载查看。温度传感器是DS18B20
#include<12864.h>
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;
delay(40);
EN=1;
LCD_databus=value;
delay(40);
EN=0;
}
void write_LCD_data(uchar value)//写数据
{
RS=1;
RW=0;
delay(40);
EN=1;
LCD_databus=value;
delay(40);
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++;
}
}
}
/********************************************************
画点函数说明:增加LCD读函数,目的是使不打点的地方数据保持
不变:方法是先读出不打点位置的数据,打完点后将读到的数据写
入原来的位置,只有这样才会显示打点的曲线。
*********************************************************/
void Draw_dots(uchar x,uchar y,uchar color)
{
uchar ROW,xlabel,xlabel_bit;
uchar Read_H,Read_L;
write_LCD_command(0x34);
write_LCD_command(0x36);
xlabel=x>>4;
xlabel_bit=x & 0x0F;
if(y<32)
{
ROW=y;
}
else
{
ROW=y-32;
xlabel+=8;
}
write_LCD_command(ROW+0x80);
write_LCD_command(xlabel+0x80);
ReadByte(); //读取当前GDRAM数据前要进行一次空读,接下来就可以读出数据了
Read_H=ReadByte();
Read_L=ReadByte();
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);//回到普通模式
}
|