LCD12864显示花屏
时间:10-02
整理:3721RD
点击:
最近做了个基于51的智能家居系统,用LCD12864显示温湿度等一些数据,烧好程序后,LCD不显示数据。(确认LCD完好)。求解答?
LCD是ST7920控制的,带字库
驱动部分代码如下:
/*****************************************/
#include<reg52.h>
#include<intrins.h>
#include"LCD12864.h"
#include"delay_ms.h"
#include"DS1302.h"
/***************变量定义****************/
unsigned char code shu[]={"2016年12月15日"} ;
unsigned char code shu1[]={"星期1 水温28.7℃ "} ;
unsigned char code shu2[]={"时间22: 10: 14"} ;
unsigned char code shu3[]={"湿度 % 温度 ℃ "} ;
unsigned char code shu4[]={"0123456789"};
unsigned char wd_bai,wd_shi,wd_ge,wd_xiao1,wd_xiao2;
/************LCD12864初始化ˉ***************/
void init_lcd12864()
{
lcd_wr=0;
lcd_rs=0;
lcd_en=0;
zhiling(0x34); //扩充指令操作
zhiling(0x34);
delay(3);
zhiling(0x30); //基本指令操作
zhiling(0x30);
delay(3);
zhiling(0x0c);
delay(3);
zhiling(0x01);
delay(3);
zhiling(0x80);
delay(10);
zhiling(0x80);
for(i=0;i<14;i++)
{
shuju(shu[i]);
delay(10);
}
zhiling(0x90);
for(i=0;i<16;i++)
{
shuju(shu1[i]);
delay(10);
}
zhiling(0x88);
for(i=0;i<14;i++)
{
shuju(shu2[i]);
delay(10);
}
zhiling(0x98);
delay(1);
for(i=0;i<16;i++)
{
shuju(shu3[i]);
delay(3);
}
}
/*void zhiling(unsigned char zl) //向LCD12864写指令
{
lcd_wr=0;
lcd_rs=0;
LCD_IO=zl;
delay(1);
lcd_en=1;
delay(1);
lcd_en=0;
delay(1);
} */
void zhiling(unsigned char zl)
{
lcd_en = 0;
_nop_();
_nop_();
lcd_rs = 0;
_nop_();
_nop_();
lcd_wr = 0;
_nop_();
_nop_();
lcd_en = 1;
_nop_();
_nop_();
LCD_IO = zl;
_nop_();
_nop_();
lcd_en = 0;
_nop_();
_nop_();
delay(5);
}
/*void shuju(unsigned int sj) //向LCD12864写数据
{
lcd_wr=0;
lcd_rs=1;
LCD_IO=sj;
delay(1);
lcd_en=1;
delay(1);
lcd_en=0;
delay(1);
}*/
void shuju(unsigned int sj)
{
lcd_en = 0;
_nop_();
_nop_();
lcd_rs=1;
_nop_();
_nop_();
lcd_wr=0;
_nop_();
_nop_();
lcd_en=1;
_nop_();
_nop_();
LCD_IO=sj;
_nop_();
_nop_();
lcd_en=0;
_nop_();
_nop_();
delay(5);
}
void qushu_time(unsigned char qs) //取数,分离数据
{
unsigned char f;
f=BCD_Decimal(qs);
shi=f/10;
ge=f%10;
}
void shijian1(unsigned char com1,unsigned char record1) //星期显示函数
{
unsigned char shi,ge;
shi=record1/10;
ge=record1%10;
zhiling(com1);
//shuju(shu4[shi]);
shuju(shu4[ge]);
}
void shijian(unsigned char com2,unsigned char record2) //其他数据显示函数
{
unsigned char shi,ge;
shi=record2/10;
ge=record2%10;
zhiling(com2);
shuju(shu4[shi]);
shuju(shu4[ge]);
}
void qushu_DS18B20(unsigned int qs) //分离数据
{
wd_bai=qs/10000;
wd_shi=qs%10000/1000;
wd_ge=qs%1000/100;
wd_xiao1=qs%100/10;
wd_xiao2=qs%10;
}
LCD是ST7920控制的,带字库
驱动部分代码如下:
/*****************************************/
#include<reg52.h>
#include<intrins.h>
#include"LCD12864.h"
#include"delay_ms.h"
#include"DS1302.h"
/***************变量定义****************/
unsigned char code shu[]={"2016年12月15日"} ;
unsigned char code shu1[]={"星期1 水温28.7℃ "} ;
unsigned char code shu2[]={"时间22: 10: 14"} ;
unsigned char code shu3[]={"湿度 % 温度 ℃ "} ;
unsigned char code shu4[]={"0123456789"};
unsigned char wd_bai,wd_shi,wd_ge,wd_xiao1,wd_xiao2;
/************LCD12864初始化ˉ***************/
void init_lcd12864()
{
lcd_wr=0;
lcd_rs=0;
lcd_en=0;
zhiling(0x34); //扩充指令操作
zhiling(0x34);
delay(3);
zhiling(0x30); //基本指令操作
zhiling(0x30);
delay(3);
zhiling(0x0c);
delay(3);
zhiling(0x01);
delay(3);
zhiling(0x80);
delay(10);
zhiling(0x80);
for(i=0;i<14;i++)
{
shuju(shu[i]);
delay(10);
}
zhiling(0x90);
for(i=0;i<16;i++)
{
shuju(shu1[i]);
delay(10);
}
zhiling(0x88);
for(i=0;i<14;i++)
{
shuju(shu2[i]);
delay(10);
}
zhiling(0x98);
delay(1);
for(i=0;i<16;i++)
{
shuju(shu3[i]);
delay(3);
}
}
/*void zhiling(unsigned char zl) //向LCD12864写指令
{
lcd_wr=0;
lcd_rs=0;
LCD_IO=zl;
delay(1);
lcd_en=1;
delay(1);
lcd_en=0;
delay(1);
} */
void zhiling(unsigned char zl)
{
lcd_en = 0;
_nop_();
_nop_();
lcd_rs = 0;
_nop_();
_nop_();
lcd_wr = 0;
_nop_();
_nop_();
lcd_en = 1;
_nop_();
_nop_();
LCD_IO = zl;
_nop_();
_nop_();
lcd_en = 0;
_nop_();
_nop_();
delay(5);
}
/*void shuju(unsigned int sj) //向LCD12864写数据
{
lcd_wr=0;
lcd_rs=1;
LCD_IO=sj;
delay(1);
lcd_en=1;
delay(1);
lcd_en=0;
delay(1);
}*/
void shuju(unsigned int sj)
{
lcd_en = 0;
_nop_();
_nop_();
lcd_rs=1;
_nop_();
_nop_();
lcd_wr=0;
_nop_();
_nop_();
lcd_en=1;
_nop_();
_nop_();
LCD_IO=sj;
_nop_();
_nop_();
lcd_en=0;
_nop_();
_nop_();
delay(5);
}
void qushu_time(unsigned char qs) //取数,分离数据
{
unsigned char f;
f=BCD_Decimal(qs);
shi=f/10;
ge=f%10;
}
void shijian1(unsigned char com1,unsigned char record1) //星期显示函数
{
unsigned char shi,ge;
shi=record1/10;
ge=record1%10;
zhiling(com1);
//shuju(shu4[shi]);
shuju(shu4[ge]);
}
void shijian(unsigned char com2,unsigned char record2) //其他数据显示函数
{
unsigned char shi,ge;
shi=record2/10;
ge=record2%10;
zhiling(com2);
shuju(shu4[shi]);
shuju(shu4[ge]);
}
void qushu_DS18B20(unsigned int qs) //分离数据
{
wd_bai=qs/10000;
wd_shi=qs%10000/1000;
wd_ge=qs%1000/100;
wd_xiao1=qs%100/10;
wd_xiao2=qs%10;
}
是不是小编写的代码程序有错误?
不错
首先打开串口能能显示的设备,在while(1)里通过串口发送数据,这样能判断程序是不是卡死在某个地方,然后降低时钟周期试试,有可能IO口太快液晶反应不过来
把写指令和数据的函数里边的延时改长一点
粗看你的程序好像缺少LCD初始化部分或者说不完整吧。因为所有的LCD都有控制芯片[段码的LCD例外],因此控制显示,首先需要对LCD控制器初始化,而后才能向LCD的RAM中写入东西显示出来。还有一点,LCD有一个复位引脚,如果使用硬件复位,那么初始化程序必须等外部硬件复位完成后运行,如果是程序复位,你的程序中少这一条语句。查查看