标题: 单片机+LCD12864显示屏实现曲线图温度显示程序 [打印本页]

作者: chinarenxx    时间: 2020-3-24 14:47
标题: 单片机+LCD12864显示屏实现曲线图温度显示程序
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);//回到普通模式
}



作者: jialishoushi    时间: 2020-3-24 16:35
不错  多谢分享
作者: yyzf998    时间: 2020-5-2 10:49
不错的创意,谢谢了!
作者: ttianmei    时间: 2021-1-15 16:08
学习了,多谢分享!
作者: 人人学会单片机    时间: 2021-1-15 16:57
用OLED更方便,OLED12864是竖向取模的。LCD12864是横向 需要转换。有些麻烦
作者: smartphone    时间: 2021-2-24 16:42
哪位大师帮忙把这个改一个max6675的采集程序啊,谢谢了。
作者: cn_zhx    时间: 2021-2-25 10:04
测了,可用
作者: elic885    时间: 2021-8-11 09:54
这个开发板是哪家公司的?貌似跟我的普中的不一样
作者: axiongzhang    时间: 2022-5-19 11:20
直接用h12864更方便,画点画线画框
作者: qpzm2    时间: 2022-11-9 15:20
为啥Proteus打不开
作者: heicad    时间: 2022-11-9 18:35
发表于 2022-11-9 15:20
为啥Proteus打

楼主直接做的成品电路,并没有做Proteus啊,仿真都是在没有实物的前提下做的,既然楼主有实物就没有必要仿真了
作者: oohoh    时间: 2022-11-9 21:20
发表于 2022-11-9 15:20
为啥Proteus

STM32论坛有LCD12864仿真库,另http://www.51hei.com/bbs/dpj-158960-1.html 找找
作者: sdlyyy    时间: 2023-3-15 08:07
谢谢分享,可以参考示波器了,好好学习。
作者: 关中小河    时间: 2024-7-6 16:04
有价值,设计可以用
作者: 电子1311班    时间: 2024-10-14 12:09
实现功能了,感谢分享




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1