万年历51单片机LCD1602不显示是什么原因

如题所述

给你一个显示的例程,你看看你自己的程序或硬件错在何处。

#define LCD1602_FLAG
#define LCD1602_PORT P0
#include<reg51.h>
#include<stddef.h>
#define uchar unsigned char

sbit lcd1602_rs=P2^0;
sbit lcd1602_e=P2^2;
sbit lcd1602_rw=P2^1;
sbit lcd1602_busy=P0^7;

uchar str[]="This is Key Test";
uchar keyval,keystr[16];

void delay(uchar a)
{
uchar i;
while(a--)for(i=0;i<120;i++);
}

/*
************************************
 * å‡½æ•°åç§°ï¼šlcd1602_CheckBusy()
 * å‡½æ•°åŠŸèƒ½ï¼šçŠ¶æ€æŸ¥è¯¢
************************************
*/

void lcd1602_CheckBusy()
{
    do
    {
    lcd1602_busy=1;
    lcd1602_rs=0;
    lcd1602_rw=1;
    lcd1602_e=0;
    lcd1602_e=1;
    }
while(lcd1602_busy);
}

/*
***************************************
 * å‡½æ•°åç§°: lcd1602_WriteCmd()
 * å‡½æ•°åŠŸèƒ½ï¼šå†™å‘½ä»¤
 * å…¥å£å‚数:命令字
 * å‡ºå£å‚数:无
***************************************
*/

void lcd1602_WriteCmd(const uchar cmd)
{
    lcd1602_CheckBusy();
lcd1602_rs=0;
lcd1602_rw=0;
lcd1602_e=1;
LCD1602_PORT=cmd;
lcd1602_e=0;
}

/*
*******************************************
 * å‡½æ•°åç§°ï¼šlcd1602_WriteData()
 * å‡½æ•°åŠŸèƒ½ï¼šå†™æ•°æ®
 * å…¥å£å‚数:c--待写数据
 * å‡ºå£å‚数:无
*********************************************
*/

void lcd1602_WriteData(const uchar c)
{
    lcd1602_CheckBusy();
lcd1602_rs=1;
lcd1602_rw=0;
lcd1602_e=1;
LCD1602_PORT=c;
lcd1602_e=0;
}

/*
***********************************************
 * å‡½æ•°åç§°ï¼šlcd1602_Init()
 * å‡½æ•°åŠŸèƒ½ï¼šåˆå§‹åŒ–LCD
 * å…¥å£å‚数:无
 * å‡ºå£å‚数:无
***********************************************
*/

void lcd1602_Init()
{
    lcd1602_WriteCmd(0x38); //显示模式为8位2行5*7点阵
    lcd1602_WriteCmd(0x0c); //display enable,flag enable,flash enable,
    lcd1602_WriteCmd(0x06); //flag move to right,screen don't move
    lcd1602_WriteCmd(0x01); //clear screen
}

/*
************************************************
 * å‡½æ•°åç§°ï¼šlcd1602_Display()
 * å‡½æ•°åŠŸèƒ½ï¼š å­—符显示
 * å…¥å£å‚数:ptr--字符或字符串指针
 * å‡ºå£å‚数:无
 * è¯´    æ˜Žï¼šç”¨æˆ·å¯é€šè¿‡ä»¥ä¸‹æ–¹å¼æ¥è°ƒç”¨ï¼š
 *           1)lcd1602_Display("Hello,world!");
 *           2) INT8U å­˜å‚¨ç±»åž‹ txt[]="要显示的字符串";
 *              æˆ–者 INT8U å­˜å‚¨ç±»åž‹ txt[]={'t','x','t',..,'\0'};
 *              INT8U *ptr;
 *              ptr=&txt;
 *              lcd1602_Display(ptr);
 *              æˆ– lcd1602_Display(txt);
 *              æˆ– lcd1602_Display(&txt);
************************************************
*/

void lcd1602_Display(const uchar *ptr,uchar line)
{
    uchar data i=0;
uchar *data q;

q=ptr;
switch(line)
{
case 0:
lcd1602_WriteCmd(0x80);
while(q!=NULL && (*q!='\0') && i<16)
     {
lcd1602_WriteData(*q);
q++;
i++;
     }
break;
case 1:
lcd1602_WriteCmd(0xc0);
while(q!=NULL && (*q!='\0') && i<16)
     {
lcd1602_WriteData(*q);
q++;
i++;
}
break;
}
}

uchar kbscan(void)
{
unsigned char sccode,recode;
P3=0x0f;  //发0扫描,列线输入
if ((P3 & 0x0f) != 0x0f)  //有键按下
{
delay(20);   //延时去抖动
if ((P3&0x0f)!= 0x0f)
{
sccode = 0xef;    //逐行扫描初值
while((sccode&0x01)!=0)
{
    P3=sccode;
if((P3&0x0f)!=0x0f)
{
    recode=(P3&0x0f)|0xf0;
while((P3&0x0f)!=0x0f);//等待键抬起
return((~sccode)+(~recode));
 }
        else
sccode=(sccode<<1)|0x01;
}
}
}
return 0;  //无键按下,返回0
}
uchar getkey(void)
{
uchar key;
key=kbscan();
if(key==0){keyval=0xff;return(0);}
switch(key)
{
case 0x11:keyval=7;break;
case 0x12:keyval=4;break;
case 0x14:keyval=1;break;
case 0x18:keyval=10;break;
case 0x21:keyval=8;break;
case 0x22:keyval=5;break;
case 0x24:keyval=2;break;
case 0x28:keyval=0;break;
case 0x41:keyval=9;break;
case 0x42:keyval=6;break;
case 0x44:keyval=3;break;
case 0x48:keyval=11;break;
case 0x81:keyval=12;break;
case 0x82:keyval=13;break;
case 0x84:keyval=14;break;
case 0x88:keyval=15;break;
default:keyval=0xff;break;
}
if(keyval!=0xff)return(1);
else return(0);
}


main()
{
uchar num;
lcd1602_Init();
lcd1602_Display(str,0);
while(1)
{
if(getkey())
{
if(keyval<10)keystr[num]=keyval+0x30;
else keystr[num]=keyval-10+'A';
lcd1602_Display(keystr,1);
num++;
num%=16;
}

}
}

温馨提示:内容为网友见解,仅供参考
第1个回答  2017-11-30
一般来说几乎都是初始化没做好
第2个回答  2017-11-30
可能是初始化的过程有问题,
懂事电子设计 Vgz

万年历51单片机LCD1602不显示是什么原因
给你一个显示的例程,你看看你自己的程序或硬件错在何处。define LCD1602_FLAG#define LCD1602_PORT P0#include<reg51.h>#include<stddef.h>#define uchar unsigned charsbit lcd1602_rs=P2^0;sbit lcd1602_e=P2^2;sbit lcd1602_rw=P2^1;sbit lcd1602_busy=P0^7;uchar str[]="This is Key Te...

用单片机做的万年历,lcd1602老师显示00:00:80,按键也调不了时间
问题可能出在驱动程序或是硬件,比如说32.768KHz晶振,比如说虚焊等因素造成的

单片机LCD1602万年历仿真正确,但实际显示不正确,会发生混乱?
我看了你说放置有问题,没有看到你的源代码,肯定是程序那里写错了,我也现场仿真了一下看没有问题。我程序是安装模块化写的,发上来有点乱,想要可以加下QQ370670734 我发你参考一下。这是主程序:\/ LCD1602电子钟 DS1302 \/ include "REG52.H"include "DS1302.H"include "LCD1602.H"sbit Key...

用红外遥控器和LCD1602液晶做的万年历...
看是不是由于红外采集导致了你的定时器中止计时。。谁的优先级更高?如果是时钟芯片,这属于硬件计时,所以时间显示停止,可能是由于中断导致了你读取时钟芯片的指令没有执行,你没有读取时钟信息,那么自然时钟也就停止了。。。我估计你应该用的是软件定时器,利用红外指令对软件定时器进行操作。。在中断...

谁有基于AT89C52的万年历设计的完整程序,程序要能烧进去且准确无误,能...
谁有基于AT89C52的万年历设计的完整程序,程序要能烧进去且准确无误,能显示出结果,最好也有仿真图。 10 用到的器件分别是DS1302、DS18B20采集温度、LCD1602显示,实现的功能:可显示时间年月日时分秒,温度,公农历转换,还有闹钟,有按键可调。求会的帮帮忙啊!!采纳的话再加20财富,谢... 用到的器件分别是DS1302、...

基于51单片机的数字电子钟万年历闰年判断闹钟整点报时设计
基于51单片机设计的电子钟万年历闹钟满足以下功能:显示年、月、日、时、分、秒、星期、农历,通过按键设置闹钟与报警,调整时间并判断平年或闰年,共有4个按键实现设置时间\/闹钟、时间加、时间减、设置切换,整点时有蜂鸣器提醒。系统主要由51单片机、DS1302时钟芯片、按键模块、LCD1602显示以及电源构成。AT...

跪求51单片机+12864液晶+1302时钟制成的万年历c程序?
(二)头文件1 显示模块 LCD1602.H#ifndef LCD_CHAR_1602_2009_5_9#define LCD_CHAR_1602_2009_5_9#define uchar unsigned char#define uint unsigned int sbit lcdrs = P2^0; sbit lcdrw = P2^1; sbit lcden = P2^2;void delay(uint z) \/\/ 延时{ uint x,y; for(x=z;x>0;x--) for(y=...

跪求:液晶LCD1602显示时钟的C程序!
顶层文件 万年历.C #include<reg51.h> #include "LCD1602.h" #include "DS1302.h" #define uchar unsigned char #define uint unsigned int sbit speaker=P2^4; bit key_flag1=0,key_flag2=0; SYSTEMTIME adjusted; uchar sec_add=0,min_add=0,hou_add=0,day_add=0,mon_add=0,yea_add=0; ucha...

我已实现了LCD1602显示万年历系统,温度,还可用按键设置修改各值,可是...
设置一个退键。之后进行时间的循环。

基于单片机AT89C51的万年历,只需要显示时间就可以,不加其他的东西_百度...
功 能:初始化LCD1602 \/ void Init_LCD(void){ LCD_Write_Command(0x38);\/\/显示模式设置:16×2显示,5×7点阵,8位数据接口 _delay_ms(1);LCD_Write_Command(0x06);\/\/显示模式设置:光标右移,字符不移 _delay_ms(1);LCD_Write_Command(0x0c);\/\/显示模式设置:显示开,无光标,光标不...

相似回答