微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > LCD12864显示花屏

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;
}

是不是小编写的代码程序有错误?

不错

首先打开串口能能显示的设备,在while(1)里通过串口发送数据,这样能判断程序是不是卡死在某个地方,然后降低时钟周期试试,有可能IO口太快液晶反应不过来

把写指令和数据的函数里边的延时改长一点

粗看你的程序好像缺少LCD初始化部分或者说不完整吧。因为所有的LCD都有控制芯片[段码的LCD例外],因此控制显示,首先需要对LCD控制器初始化,而后才能向LCD的RAM中写入东西显示出来。还有一点,LCD有一个复位引脚,如果使用硬件复位,那么初始化程序必须等外部硬件复位完成后运行,如果是程序复位,你的程序中少这一条语句。查查看

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top