找回密码
 
返回列表 发新帖
查看: 13870|回复: 14
打印 上一主题 下一主题

单片机+LCD12864显示屏实现曲线图温度显示程序

[复制链接]
LCD12864显示屏实现曲线图温度显示程序经过调试正常运行,可以给大家作一个参考。是51单片机开发板给的新教程与大家分享。

制作出来的实物图如下:
调试图.JPG (122.09 KB, 下载次数: 85)

电路原理图如下:
原理图.JPG (108.12 KB, 下载次数: 84)


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);//回到普通模式
}


不错  多谢分享
不错的创意,谢谢了!
学习了,多谢分享!
用OLED更方便,OLED12864是竖向取模的。LCD12864是横向 需要转换。有些麻烦
哪位大师帮忙把这个改一个max6675的采集程序啊,谢谢了。[em02]
测了,可用
这个开发板是哪家公司的?貌似跟我的普中的不一样
9
ID:744744 发表于 来自手机 | 只看该作者
直接用h12864更方便,画点画线画框
为啥Proteus打不开
发表于 2022-11-9 15:20
为啥Proteus打

楼主直接做的成品电路,并没有做Proteus啊,仿真都是在没有实物的前提下做的,既然楼主有实物就没有必要仿真了

STM32论坛有LCD12864仿真库,另http://www.51hei.com/bbs/dpj-158960-1.html 找找
谢谢分享,可以参考示波器了,好好学习。
有价值,设计可以用
实现功能了,感谢分享
返回列表 发新帖

Powered by 单片机教程网

快速回复 返回顶部 返回列表