找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2969|回复: 11
收起左侧

1602显示问题

  [复制链接]
ID:231638 发表于 2017-9-26 21:57 | 显示全部楼层 |阅读模式
|程序一||程序一||程序一||程序一||程序一||程序一||程序一||程序一||程序一||程序一||程序一||程序一||程序一||程序一||程序一|
/**************************************************************************************
*                              LCD1602液晶显示实验                                                                                                  *
实现现象:        具体接线操作请参考视频教程
                        下载程序后插上LCD1602液晶在开发板上,即可显示
注意事项:                                                                                                                                                                  
***************************************************************************************/

#include "reg52.h"                         //此文件中定义了单片机的一些特殊功能寄存器
#include "lcd.h"

typedef unsigned int u16;          //对数据类型进行声明定义
typedef unsigned char u8;

u8 Disp[16]={" Pechin Science "};

/*******************************************************************************
* 函 数 名         : main
* 函数功能                   : 主函数
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void main(void)
{
        u8 i;
        LcdInit();
        LcdWriteCom(0x80);
        for(i=0;i<16;i++)
        {
                LcdWriteData(Disp[i]);       
        }

        while(1);                               
}
|程序一||程序一||程序一||程序一||程序一||程序一||程序一||程序一||程序一||程序一||程序一||程序一||程序一||程序一||程序一|












|程序二||程序二||程序二||程序二||程序二||程序二||程序二||程序二||程序二||程序二||程序二||程序二||程序二||程序二||程序二|
/*******************************************************************************
* 实验名                           : 1602显示红外线值实验
* 使用的IO             : 电机用P1口,键盘使用P3.0、P3.1、P3.2、P3.3
* 实验效果       : LCD1602显示出读取到的红外线的值
*        注意                                         :
*******************************************************************************/
#include<reg51.h>
#include"lcd.h"

sbit IRIN=P3^2;

unsigned char code CDIS1[13]={" Red Control "};
unsigned char code CDIS2[13]={" IR-CODE:--H "};
unsigned char IrValue[6];
unsigned char Time;
void IrInit();
void DelayMs(unsigned int );
/*******************************************************************************
* 函数名         : main
* 函数功能                   : 主函数
* 输入           : 无
* 输出                  : 无
*******************************************************************************/

void main()
{
        unsigned char i;
        IrInit();       
        LcdInit();
        LcdWriteCom(0x80);
        for(i=0;i<13;i++)
        {
                LcdWriteData(CDIS1[i]);       
        }
        LcdWriteCom(0x80+0x40);
        for(i=0;i<13;i++)
        {
                LcdWriteData(CDIS2[i]);       
        }
        while(1)
        {
                IrValue[4]=IrValue[2]>>4;                          //高位
                IrValue[5]=IrValue[2]&0x0f;                //低位       
                if(IrValue[4]>9)
                {
                        LcdWriteCom(0xc0+0x09);                        //设置显示位置
                        LcdWriteData(0x37+IrValue[4]);        //将数值转换为该显示的ASCII码
                }
                else
                {
                        LcdWriteCom(0xc0+0x09);
                        LcdWriteData(IrValue[4]+0x30);        //将数值转换为该显示的ASCII码
                }       
                if(IrValue[5]>9)
                {
                        LcdWriteCom(0xc0+0x0a);
                        LcdWriteData(IrValue[5]+0x37);                //将数值转换为该显示的ASCII码
                }
                else
                {
                        LcdWriteCom(0xc0+0x0a);
                        LcdWriteData(IrValue[5]+0x30);                //将数值转换为该显示的ASCII码
                }       
        }
}                                                                         
/*******************************************************************************
* 函数名         : DelayMs()
* 函数功能                   : 延时
* 输入           : x
* 输出                  : 无
*******************************************************************************/

void DelayMs(unsigned int x)   //0.14ms误差 0us
{
unsigned char i;
  while(x--)
{
  for (i = 0; i<13; i++)
{}
}
}
/*******************************************************************************
* 函数名         : IrInit()
* 函数功能                   : 初始化红外线接收
* 输入           : 无
* 输出                  : 无
*******************************************************************************/

void IrInit()
{
        IT0=1;//下降沿触发
        EX0=1;//打开中断0允许
        EA=1;        //打开总中断

        IRIN=1;//初始化端口
}
/*******************************************************************************
* 函数名         : ReadIr()
* 函数功能                   : 读取红外数值的中断函数
* 输入           : 无
* 输出                  : 无
*******************************************************************************/

void ReadIr() interrupt 0
{
        unsigned char j,k;
        unsigned int err;
        Time=0;                                         
        DelayMs(70);

        if(IRIN==0)                //确认是否真的接收到正确的信号
        {         
               
                err=1000;                                //1000*10us=10ms,超过说明接收到错误的信号
                /*当两个条件都为真是循环,如果有一个条件为假的时候跳出循环,免得程序出错的时
                侯,程序死在这里*/       
                while((IRIN==0)&&(err>0))        //等待前面9ms的低电平过去                 
                {                       
                        DelayMs(1);
                        err--;
                }
                if(IRIN==1)                        //如果正确等到9ms低电平
                {
                        err=500;
                        while((IRIN==1)&&(err>0))                 //等待4.5ms的起始高电平过去
                        {
                                DelayMs(1);
                                err--;
                        }
                        for(k=0;k<4;k++)                //共有4组数据
                        {                               
                                for(j=0;j<8;j++)        //接收一组数据
                                {

                                        err=60;               
                                        while((IRIN==0)&&(err>0))//等待信号前面的560us低电平过去
//                                        while (!IRIN)
                                        {
                                                DelayMs(1);
                                                err--;
                                        }
                                        err=500;
                                        while((IRIN==1)&&(err>0))         //计算高电平的时间长度。
                                        {
                                                DelayMs(1);//0.14ms
                                                Time++;
                                                err--;
                                                if(Time>30)
                                                {
                                                        EX0=1;
                                                        return;
                                                }
                                        }
                                        IrValue[k]>>=1;         //k表示第几组数据
                                        if(Time>=8)                        //如果高电平出现大于565us,那么是1
                                        {
                                                IrValue[k]|=0x80;
                                        }
                                        Time=0;                //用完时间要重新赋值                                                       
                                }
                        }
                }
                if(IrValue[2]!=~IrValue[3])
                {
                        return;
                }
        }                       
}
|程序二||程序二||程序二||程序二||程序二||程序二||程序二||程序二||程序二||程序二||程序二||程序二||程序二||程序二||程序二||程序二|


各位大佬,以上两个程序是普中开发板的两个程序,程序一是单纯的1602显示字符串,结果显示乱码;程序二是1602显示红外遥控的键值,结果正常;两个程序的1602部分的程序是一模一样的所以没有贴出来,不同的只是主函数中显示部分,以及程序二中用到了扫描红外的中断。请问,这个的问题到底在哪儿?在普中的论坛中发现其他人也是同样的问题,所以来请各位大佬一见分晓。
谢过!

回复

使用道具 举报

ID:123289 发表于 2017-9-27 07:06 | 显示全部楼层
程序是你自己写的吗?
是:请先画框图。
不是:请先研读显示屏手册,再理出方案,画出框图,再动手写程序。
回复

使用道具 举报

ID:164602 发表于 2017-9-27 08:37 | 显示全部楼层
我试过了,一点问题也没有。我是HC6800-ES-V2.0板子。
我试了四个程序:原来买板子送的,两个,一个显示字符,一个显示矩阵键值;后来另人买板子送的新程序,基础级一个,和原来的显示字符一样,中级的一个,字符移动程序。都没问题。
在试验中级那个叫LCD1602滚动显示例程时,开始有点乱,与程序不合,我关电源都不行,后来,我按了一次复位键,好了,再下程序就没有问题了。这是什么原因还不知道,猜测是我的板子老了,接触不好(事实是多次这样了),也有可能是1602的初始化没做好,因为时间关系,我没有再仔细研究,你自己试试看。

评分

参与人数 1黑币 +30 收起 理由
admin + 30 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:60379 发表于 2017-9-27 10:41 | 显示全部楼层
建议你去下载《51单片机轻松入门 基于STC15W4K系列》的配套例程对照测试,下载地址:http://pan.baidu.com/s/1bURkE6
回复

使用道具 举报

ID:236012 发表于 2017-9-27 11:42 | 显示全部楼层
你的时序控制的不对啊
回复

使用道具 举报

ID:236168 发表于 2017-9-27 20:21 | 显示全部楼层
你是不是字膜软件有问题!要不是驱动写的不对。
回复

使用道具 举报

ID:236174 发表于 2017-9-27 20:32 | 显示全部楼层
应该是字膜软件有问题!或者。。。
回复

使用道具 举报

ID:231638 发表于 2017-9-27 22:41 | 显示全部楼层
yzwzfyz 发表于 2017-9-27 07:06
程序是你自己写的吗?
是:请先画框图。
不是:请先研读显示屏手册,再理出方案,画出框图,再动手写程序 ...

谢谢大神的指导,但是个人能力有限,目前还没有深入到这些,目前处于学习阶段,是想弄清楚这个问题是为什么。
经过今天仔细观察,已经发现问题是:在1602的驱动程序中他将4位和8位两种写在一起的,他默认的是8位的,而我的是4位的,所以才弄出了这一闹剧。
您的解决问题的思路我会学习的,谢谢。
回复

使用道具 举报

ID:231638 发表于 2017-9-27 22:42 | 显示全部楼层
HC6800-ES-V2.0 发表于 2017-9-27 08:37
我试过了,一点问题也没有。我是HC6800-ES-V2.0板子。
我试了四个程序:原来买板子送的,两个,一个显示字 ...


今天我仔细看了看1602的引脚,要注意的是,虽然普中配的每个1602的插针是16个,但是不能显示的估计是和我同样的问题:没有仔细看看1602,其实1602的pcb板上只有9根插针,也就是说虽然是16根插进了插口,但是只有9根起到了作用,简单的说就是,这种样子的1602是4位的,所以在普中的教程程序中的LCD.H文件里面,他有定义4位和8位的,这时候你要注意是不是他把4位的定义的那句话给屏蔽了(//define LCD1602_4PINS),如果屏蔽了的话,只要把这句话释放就行了,也就是把前面的双斜线去掉。
我只试了最简单的那个显示"Pechin Science"的那个程序,其他不能显示的,他在程序中也有作出标识,有些4位相关的语句需要释放(具体内容就是对高四位读值以后,需要将数据左移四位,然后进行第四位的读值)。



从你的头像我也依稀看出你是普中贴里的谁了,也是你推荐我来这儿的,果然受益颇多,谢谢了。
回复

使用道具 举报

ID:231638 发表于 2017-9-27 22:45 | 显示全部楼层
自己独开一楼,就这一问题说明个人发现,也谢谢各位大佬的悉心指导,分享你们查找问题的思路,谢谢。

今天我仔细看了看1602的引脚,要注意的是,虽然普中配的每个1602的插针是16个,但是不能显示的估计是和我同样的问题:没有仔细看看1602,其实1602的pcb板上只有9根插针,也就是说虽然是16根插进了插口,但是只有9根起到了作用,简单的说就是,这种样子的1602是4位的,所以在普中的教程程序中的LCD.H文件里面,他有定义4位和8位的,这时候你要注意是不是他把4位的定义的那句话给屏蔽了(//define LCD1602_4PINS),如果屏蔽了的话,只要把这句话释放就行了,也就是把前面的双斜线去掉。
我只试了最简单的那个显示"Pechin Science"的那个程序,其他不能显示的,他在程序中也有作出标识,有些4位相关的语句需要释放(具体内容就是对高四位读值以后,需要将数据左移四位,然后进行第四位的读值)。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:231638 发表于 2017-9-27 22:46 | 显示全部楼层
zhaijiwei123 发表于 2017-9-27 20:21
你是不是字膜软件有问题!要不是驱动写的不对。

大兄弟,1602液晶显示屏是不用取字模的吧
回复

使用道具 举报

ID:231437 发表于 2017-9-28 15:05 | 显示全部楼层
1602液晶显示屏是不用取字模的
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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