LCD12864顯示屏實現曲線圖溫度顯示程序經過調試正常運行,可以給大家作一個參考。是51單片機開發板給的新教程與大家分享。
制作出來的實物圖如下:
調試圖.JPG (122.09 KB, 下載次數: 85)
下載附件
2020-3-24 14:45 上傳
電路原理圖如下:
原理圖.JPG (108.12 KB, 下載次數: 84)
下載附件
2020-3-24 14:11 上傳
Keil代碼下載:
LCD12864顯示溫度曲線(keil4).rar
(136.38 KB, 下載次數: 335)
2020-3-24 14:11 上傳
點擊文件名下載附件
LCD12864 下載積分: 黑幣 -5
以下是部份代碼,完整包可以下載查看。溫度傳感器是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);//回到普通模式
}
|