找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 9083|回复: 12
打印 上一主题 下一主题
收起左侧

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

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

制作出来的实物图如下:


电路原理图如下:



Keil代码下载:
LCD12864显示温度曲线(keil4).rar (136.38 KB, 下载次数: 313)

以下是部份代码,完整包可以下载查看。温度传感器是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);//回到普通模式
}


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏8 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:35873 发表于 2020-3-24 16:35 | 只看该作者
不错  多谢分享
回复

使用道具 举报

板凳
ID:688460 发表于 2020-5-2 10:49 | 只看该作者
不错的创意,谢谢了!
回复

使用道具 举报

地板
ID:290464 发表于 2021-1-15 16:08 | 只看该作者
学习了,多谢分享!
回复

使用道具 举报

5#
ID:390416 发表于 2021-1-15 16:57 | 只看该作者
用OLED更方便,OLED12864是竖向取模的。LCD12864是横向 需要转换。有些麻烦
回复

使用道具 举报

6#
ID:53978 发表于 2021-2-24 16:42 | 只看该作者
哪位大师帮忙把这个改一个max6675的采集程序啊,谢谢了。
回复

使用道具 举报

7#
ID:883031 发表于 2021-2-25 10:04 | 只看该作者
测了,可用
回复

使用道具 举报

8#
ID:959867 发表于 2021-8-11 09:54 | 只看该作者
这个开发板是哪家公司的?貌似跟我的普中的不一样
回复

使用道具 举报

9#
ID:744744 发表于 2022-5-19 11:20 来自手机 | 只看该作者
直接用h12864更方便,画点画线画框
回复

使用道具 举报

10#
ID:1051166 发表于 2022-11-9 15:20 | 只看该作者
为啥Proteus打不开
回复

使用道具 举报

11#
ID:262 发表于 2022-11-9 18:35 | 只看该作者
发表于 2022-11-9 15:20
为啥Proteus打

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

使用道具 举报

12#
ID:237354 发表于 2022-11-9 21:20 | 只看该作者

STM32论坛有LCD12864仿真库,另http://www.51hei.com/bbs/dpj-158960-1.html 找找
回复

使用道具 举报

13#
ID:824664 发表于 2023-3-15 08:07 | 只看该作者
谢谢分享,可以参考示波器了,好好学习。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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