找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

LCD1602第一行出现白方块

查看数: 705 | 评论数: 9 | 收藏 0
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2025-3-6 14:34

正文摘要:

代码仿真没有问题 #include <reg52.h> #include <intrins.h> #include <stdio.h> // NRF24L01 引脚定义 sbit CE = P3^7; sbit CSN = P3^2; sbit SCK = P3^6; sbit MOSI = P3^3; sbit MISO ...

回复

ID:1133081 发表于 2025-3-7 13:51
发表于 2025-3-7 09:50
这是pcb板,哪有问题

出现白方块是典型1602初始化失败的现象。这与1602的数据端连线接反直接相关。如果不想重新制作PCB,必须用软件把1602驱动程序的数据高低位对调。添加一个高低位对调函数:
  1. uchar exchange(unsigned char dat)
  2. {
  3.         unsigned char i,j=0;
  4.         for(i=8;i>0;i--)
  5.         {
  6.                 j|=(dat&0x01)<<(i-1);
  7.                 dat>>=1;
  8.         }
  9.         return j;
  10. }

  11. void LCD1602_Write_Cmd(unsigned char dat)
  12. {
  13.         RS = 0;
  14. //        RW = 0;
  15. //        P2 = cmd;
  16.         P2=exchange(dat);
  17. //        delay_ms(200);
  18.         E = 1;
  19.         delay_ms(5);
  20.         E = 0;
  21.         delay_ms(5);
  22. }

  23. void LCD1602_Write_Data(unsigned char dat)
  24. {
  25.         RS = 1;
  26. //        RW = 0;
  27. //        delay_ms(200);
  28. //        P2 = dat;
  29.         P2=exchange(dat);
  30.         E = 1;
  31.         delay_ms(5);
  32.         E = 0;
  33.         delay_ms(5);
  34. }

复制代码
ID:584814 发表于 2025-3-7 12:56
貌似这个MCU的P0都没有拉电阻,加上试试
ID:1143623 发表于 2025-3-7 09:59
pcb设计的也没啥问题啊

PCB1_1.zip

2.39 MB, 下载次数: 0

ID:1143623 发表于 2025-3-7 09:50
这是pcb板,哪有问题
ID:161164 发表于 2025-3-7 09:24
盲猜P0口排阻焊反了
ID:1133081 发表于 2025-3-7 06:56
发表于 2025-3-6 15:14
连接了滑动变组3296W20k,单片机P0口接了一个4.7KΩ的排阻

用这个程序测试1602,如还不能正常显示多为硬件电路有问题,1602损坏的可能性极小。
  1. #include<reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. sbit LCD_RS=P0^6;                                        //液晶屏RS口  写指令低,写数据高
  5. sbit LCD_EN=P0^7;                                        //液晶屏EN口  高脉冲使能写指令/数据,低跳变执行
  6. uchar table[] ="0123456789ABCDEF";        //第一行
  7. uchar table1[]="GIJKLMNOPQRSTUVW";        //第二行
  8. /*******100us延时程序********/
  9. void delay(uint x)
  10. {
  11.         uint a,b;
  12.         for(a=x;a>0;a--)
  13.                 for(b=10;b>0;b--);
  14. }
  15. /*******1602液晶屏写指令程序********/
  16. void write_com(uchar com)
  17. {
  18.         LCD_EN=0;        //初始设置LCD_EN低电平
  19.         LCD_RS=0;        //允许写指令
  20.         P2=com;                //传递指令
  21.         delay(10);        //延时1ms
  22.         LCD_EN=1;        //使能写入
  23.         delay(10);        //延时1ms
  24.         LCD_EN=0;        //低跳变执行
  25.         
  26. }
  27. /*******1602液晶屏写数据程序********/
  28. void write_date(uchar date)
  29. {
  30. //        LCD_EN=0;        //初始设置LCD_EN低电平
  31.         LCD_RS=1;        //允许写数据
  32.         P2 =date;        //传递数据
  33.         delay(10);        //延时1ms
  34.         LCD_EN=1;        //使能写入
  35.         delay(10);        //延时1ms
  36.         LCD_EN=0;        //低跳变执行
  37.         
  38. }
  39. /*******1602液晶屏初始化程序********/
  40. void init()                //设置显示模式、
  41. {
  42.         write_com(0x38);//设置16*2显示,5*7点阵,8位数据接口
  43.         write_com(0x01);//显示清零,数据指针清零
  44. //        write_com(0x0f);//设置开显示,显示光标,光标闪烁
  45. //        write_com(0x0e);//设置开显示,显示光标,光标不闪
  46.         write_com(0x0c);//设置开显示,不显光标
  47.         write_com(0x06);//设置写一个字符后地址指针加1
  48. //        write_com(0x07);//设置写一个字符后整屏左移
  49.         write_com(0x80);//数据指针初始化,设置显示初始位置
  50. }
  51. /**********************主程序*************************/
  52. void main()
  53. {
  54.         uchar a;                                        //定义循环变量
  55.         init();                                                //初始化1602程序
  56. /******用for循环按字节逐个写入********/
  57.         write_com(0x80);                        //数据指针第一行起始0x80位置
  58.         for(a=0;a<16;a++)                        //每循环一次写一个字节数据
  59.         {
  60.                 write_date(table[a]);        //写一个字节数据               
  61.         }
  62.         write_com(0xc0);                        //数据指针第二行起始位置0x80+0x40=0xc0
  63.         for(a=0;a<16;a++)                        //每循环一次写一个字节数据
  64.         {
  65.                 write_date(table1[a]);        //写一个字节数据               
  66.         }
  67.         while(1);
  68. }

复制代码
ID:748788 发表于 2025-3-6 17:31
用“方块”搜一下论坛,会有很多回答
ID:1121801 发表于 2025-3-6 16:41
你这是屏坏了吧,程序可以控制的只是显示区域就是每一个5*8的像素方块,还能控制不是显示区域的?

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

Powered by 单片机教程网

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