找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2641|回复: 15
收起左侧

单片机+LCD1602液晶显示问题 中间有两个黑点

[复制链接]
ID:97350 发表于 2021-5-28 10:48 | 显示全部楼层 |阅读模式
问题描述: 1602显示如图,中间有两个黑点。如何解决,我贴下1602程序部分
0f856e904589dd642f12b155197ee10.jpg

#define yi 0x80 //LCD第一行的初始位置,因为LCD1602字符地址首位D7恒定为1(100000000=80)
#define er 0x80+0x40 //LCD第二行初始位置(因为第二行第一个字符位置地址是0x40)


//----------------延时函数,后面经常调用----------------------
void delay(uint xms)//延时函数,有参函数
{
        uint x,y;
        for(x=xms;x>0;x--)
         for(y=110;y>0;y--);
}

//--------------------------写指令---------------------------
void write_1602com(uchar com)//****液晶写入指令函数****
{
        lcd1602_rs=0;//数据/指令选择置为指令
        lcd1602_rw=0; //读写选择置为写
        P0=com;//送入数据
        delay(1);
        lcd1602_en=1;//拉高使能端,为制造有效的下降沿做准备
        delay(1);
        lcd1602_en=0;//en由高变低,产生下降沿,液晶执行命令
}

//-------------------------写数据-----------------------------
void write_1602dat(uchar dat)//***液晶写入数据函数****
{
        lcd1602_rs=1;//数据/指令选择置为数据
        lcd1602_rw=0; //读写选择置为写
        P0=dat;//送入数据
        delay(1);
        lcd1602_en=1; //en置高电平,为制造下降沿做准备
        delay(1);
        lcd1602_en=0; //en由高变低,产生下降沿,液晶执行命令
}

//-------------------------初始化-------------------------
void lcd_init()
{
        write_1602com(0x01);//清显示
        write_1602com(0x38);//设置液晶工作模式,意思:16*2行显示,5*7点阵,8位数据
        write_1602com(0x0c);//开显示不显示光标
        write_1602com(0x06);//整屏不移动,光标自动右移
}

回复

使用道具 举报

ID:824490 发表于 2021-5-28 11:41 | 显示全部楼层
这样的问题,在线跟踪一下1602的输入数据,一般都能解决
回复

使用道具 举报

ID:97350 发表于 2021-5-28 12:55 | 显示全部楼层
名字不是重点 发表于 2021-5-28 11:41
这样的问题,在线跟踪一下1602的输入数据,一般都能解决

感谢赐教,请问怎么在线跟踪?
回复

使用道具 举报

ID:879348 发表于 2021-5-28 13:30 | 显示全部楼层
这很明显是显示数字没有转字符串
回复

使用道具 举报

ID:88256 发表于 2021-5-28 13:44 | 显示全部楼层
主函数都没贴出来,应该是送的显示数据错误了
回复

使用道具 举报

ID:824490 发表于 2021-5-28 14:07 | 显示全部楼层
用仿真器跑代码
回复

使用道具 举报

ID:97350 发表于 2021-5-28 14:08 | 显示全部楼层
hhdsdy 发表于 2021-5-28 13:44
主函数都没贴出来,应该是送的显示数据错误了
  1. void main()
  2. {
  3.          unsigned char KEY,NUM;
  4.         unsigned char i,j;
  5.          P1=0xFF;
  6.         EA=1;
  7.         TMOD=0x01;
  8.         IT1=1;//下降沿有效
  9.         EX1=1;//外部中断1开
  10.            
  11.         TH0=0;//T0赋初值
  12.         TL0=0;
  13.         TR0=1;//t0开始计时
  14.          TL1=0x3c;
  15.          TH1=0xb0;
  16.          ET1=1;        
  17.          TR1=0;
  18.          Delay400Ms();         //启动等待,等LCM讲入工作状态
  19.          lcd_init();         //LCD初始化
  20.         write_1602com(yi);//日历显示固定符号从第一行第0个位置之后开始显示
  21.         init_rc522();
  22.         init_eeprom();
  23.         read_eeprom();
  24.         for(i=0;i<16;i++)
  25.         {
  26.                 write_1602dat(name[i]);//向液晶屏写日历显示的固定符号部分
  27.         }
  28.         write_1602com(er);//时间显示固定符号写入位置,从第2个位置后开始显示
  29.         for(i=0;i<16;i++)
  30.         {
  31.                 write_1602dat(start_line[i]);//写显示时间固定符号,两个冒号
  32.         }
  33.         write_1602com(er+9);        //设置光标位置
  34.         write_1602com(0x0f);        //设置光标为闪烁
  35.          Delay5Ms(); //延时片刻(可不要)

  36.          N=0;                                                                                                                //初始化数据输入位数
  37.          while(1)
  38.          {
  39.            
  40.                 ctrl();
  41.                 if(key_disable==1)
  42.                         Alam_KeyUnable();
  43.                 else
  44.                         ALAM=1;                                                                //关报警

  45.                 KEY=keynum();
  46.                 if(KEY!=0||IrOK==1)
  47.                 {        
  48.                         if(key_disable==1)
  49.                         {
  50.                                 second=0;
  51.                         }
  52.                         else
  53.                         {
  54.                                 NUM=coding(Im[2],KEY);
  55.                                 {
  56.                                         switch(NUM)
  57.                                         {
  58.                                                 case ('A'): if(chushihua==1)
  59.                                                             {
  60.                                                              current_id++;
  61.                                                             if(current_id>5)
  62.                                                                          current_id=0;
  63.                                                                          }                                        break;
  64.                                                 case ('B'):        if(chushihua==1)
  65.                                                              write_eeprom_jj(current_id)        ;                                             break;
  66.                                                 case ('C'): if(chushihua==1)
  67.                                                              write_eeprom_j(current_id)        ;                                         break;
  68.                                                 case ('D'): chushihua=0;ResetPassword();                break;      //重新设置密码
  69.                                                 case ('*'): chushihua=0;Cancel();                                break;      //取消当前输入
  70.                                                 case ('#'): chushihua=0; Ensure();                                 break;           //确认键,
  71.                                                 default:
  72.                                                 {        
  73.                                                     chushihua=0;
  74.                                                         //DisplayListChar(0,1,Input);
  75.                                                         write_1602com(er);
  76.                                                         for(i=0;i<16;i++)
  77.                                                         {
  78.                                                                 write_1602dat(Input[i]);
  79.                                                         }
  80.                                                     operation=0;
  81.                                                         if(N<6)                                                           //当输入的密码少于6位时,接受输入并保存,大于6位时则无效。
  82.                                                         {  
  83.                                                                 OneAlam();                                                                //按键提示音                                                
  84.                                                                 //DisplayOneChar(6+N,1,'*');
  85.                                                                  for(j=0;j<=N;j++)
  86.                                                                 {
  87.                                                                         write_1602com(er+6+j);
  88.                                                                         write_1602dat('*');
  89.                                                                 }
  90.                                                                 InputData[N]=NUM;
  91.                                                                 N++;
  92.                                                         }
  93.                                                         else                                                                                //输入数据位数大于6后,忽略输入
  94.                                                         {
  95.                                                                 N=6;
  96.                                                                  break;
  97.                                                         }
  98.                                                 }
  99.                                         }
  100.                                 }
  101.                         }
  102.                  }
  103.         }
  104. }
复制代码
回复

使用道具 举报

ID:97350 发表于 2021-5-28 14:09 | 显示全部楼层
wufa1986 发表于 2021-5-28 13:30
这很明显是显示数字没有转字符串

我觉得应该不是,因为第一张卡可以正常读取出来,第二张卡就显示两个黑屏
回复

使用道具 举报

ID:451718 发表于 2021-5-28 14:42 | 显示全部楼层
读卡的后数据如何传输的?  问题肯定出在传输上,  把读到的数据,用串口发送出来看看就知道了。
回复

使用道具 举报

ID:366877 发表于 2021-5-28 14:58 | 显示全部楼层
应该是显示数据和待显示的位置没对上,前一屏幕信息残留叠加的结果。
回复

使用道具 举报

ID:97350 发表于 2021-5-28 15:19 | 显示全部楼层
感谢各位出谋划策,我再找找原因,有答案会和大家一起分享的。小弟在这里一并谢过
回复

使用道具 举报

ID:584814 发表于 2021-5-29 22:01 | 显示全部楼层
直接用常量在相对的位置显示一个字条,如果还是这样就是硬件坏。
不过一般都是你送的数据有问题,1602直接坏2个显示位并且全显的概率小。
回复

使用道具 举报

ID:517951 发表于 2021-5-31 10:58 | 显示全部楼层
基本不认为是1602的硬件问题,99%是软件写得有问题才出现中间部位的显示异常.
回复

使用道具 举报

ID:97350 发表于 2021-5-31 15:47 | 显示全部楼层
rayin 发表于 2021-5-31 10:58
基本不认为是1602的硬件问题,99%是软件写得有问题才出现中间部位的显示异常.

你说的对,就是软件问题,但是我还没调通
回复

使用道具 举报

ID:97350 发表于 2021-5-31 15:48 | 显示全部楼层
man1234567 发表于 2021-5-29 22:01
直接用常量在相对的位置显示一个字条,如果还是这样就是硬件坏。
不过一般都是你送的数据有问题,1602直接 ...

排除硬件故障了,还在软件调试中
回复

使用道具 举报

ID:390416 发表于 2021-6-19 08:42 | 显示全部楼层
LCD1602显示℃ 这种自定义符号 http://www.51hei.com/bbs/dpj-200685-1.html
LCD1602液晶最新资料 说明了具体的时间要求 http://www.51hei.com/bbs/dpj-205768-1.html
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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