LCD1602液晶显示屏没显示数据

2019-07-16 02:59发布

LCD1602.rar (44.21 KB, 下载次数: 45) 这个是ISIS图
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
//50US秒延时
sbit rs=P2^4;
sbit rw=P2^5;
sbit e=P2^6;
uchar table1[]="kkkk";
uchar table2[]="1234";

void delay_50us(x)//延时
{
uchar j;
for(;x>0;x--);
for(j=19;j>0;j--);
}
void xie_com(uchar com)//开启写
{
e=0;
rs=0;
rw=0;
P0=com;
delay_50us(10);
e=1;
delay_50us(20);
e=0;
}
void xie_data(uchar dat)//写数据
{
e=0;
rs=1;
rw=0;
P0=dat;
delay_50us(10);
e=1;
delay_50us(20);
e=0;
}
void init(void)//初始化函数
{
delay_50us(300);
xie_com(0x38);
delay_50us(100);
xie_com(0x38);
delay_50us(100);
xie_com(0x38);
xie_com(0x38);
xie_com(0x08);
xie_com(0x01);
xie_com(0x06);
xie_com(0x0c);

}

main()
{
uchar j;
init();//初始化
xie_com(0x80);//第1行起始位子
for(j=0;j<16;j++)
{
  xie_data(table1[j]);
  delay_50us(10);
}
xie_com(0x80+0x40);//第2行起始位子
for(j=0;j<16;j++)
{
  xie_data(table2[j]);
  delay_50us(10);
}
while(1);
}
发现LCD1602没显示数据!
123.png
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
15条回答
dongyumin
2019-07-16 05:26
估计这贴子类容太容易了,没人愿意教、、、
你这代码有问题。没必要什么都去延时个几毫秒的,延时那么多干嘛。你这个设置显示坐标有问题,你每次写入数据前都把要写入的坐标地址发送一次。
  1. #include<lcd1602.h>
  2. #include<reg52.h>
  3. #include<delay.h>
  4. #include<intrins.h>

  5. sbit RS=P2^0;
  6. sbit RW=P2^1;
  7. sbit EN=P2^2;
  8. #define RS_CLR RS=0
  9. #define RS_SET RS=1
  10. #define RW_SET RW=1
  11. #define RW_CLR RW=0
  12. #define EN_SET EN=1
  13. #define EN_CLR EN=0
  14. #define DataPort P1

  15. bit LCD1602_CheckBusy()
  16. {
  17. DataPort=0xff;

  18. RS_CLR;
  19. RW_SET;
  20. _nop_();
  21. EN_SET;
  22. return (bit)(DataPort&0x80);
  23. EN_CLR;
  24. }

  25. void LCD1602_WriteByte(UINT8 byte)
  26. {
  27. //UINT8 i;
  28. while(LCD1602_CheckBusy())
  29. ;
  30. EN_SET;
  31. RS_SET;
  32. RW_CLR;
  33. DataPort=byte;
  34. _nop_();
  35. EN_CLR;
  36. }

  37. void LCD1602_WriteCommand(UINT8 command)
  38. {
  39. while(LCD1602_CheckBusy())
  40. ;
  41. EN_SET;
  42. RS_CLR;
  43. RW_CLR;
  44. DataPort=command;
  45. _nop_();
  46. EN_CLR;
  47. }

  48. void LCD1602_ClearScreen()
  49. {
  50. LCD1602_WriteCommand(0x01);
  51. DelayMs(10);
  52. }

  53. void LCD1602_SetXY(UINT8 x,UINT8 y)
  54. {
  55. if(y==0)
  56. LCD1602_WriteCommand(0x80+x);
  57. if(y==1)
  58. LCD1602_WriteCommand(0xc0+x);
  59. }

  60. void LCD1602_WriteString(UINT8 x,UINT8 y,UINT8 *s)
  61. {

  62.         while(*s)
  63.         {
  64.         LCD1602_SetXY(x,y);
  65.         LCD1602_WriteByte(*s);
  66.         s++;
  67.         x++;
  68.         }
  69. }
  70. void LCD1602_WriteChar(UINT8 x,UINT8 y,UINT8 ch)
  71. {
  72. LCD1602_SetXY(x,y);
  73. LCD1602_WriteByte(ch);
  74. }

  75. void LCD1602_Init(void)
  76. {
  77. LCD1602_WriteCommand(0x38);
  78. DelayMs(5);
  79. LCD1602_WriteCommand(0x0f);
  80. //LCD1602_WriteCommand(0x06);
  81. //LCD1602_WriteCommand(0x09);
  82. LCD1602_WriteCommand(0x0c);
  83. }

复制代码这是我1602的驱动,你看下,那个Cheack_Busy()是判忙函数,可以不用,我用164转并口驱动1602的时候没写这个函数,没关系,其他的都是必要的。

评分

参与人数 1积分 +5 收起 理由 zhihuizhou + 5 您的付出是论坛的动力,感谢您一直支持!.

查看全部评分

一周热门 更多>