[51单片机] 仿真LCD1602

[复制链接]
1646|4
 楼主| caoye87 发表于 2014-6-25 22:54 | 显示全部楼层 |阅读模式
大家好,本来刚开始学习LCD1602,按照资料上的程序用Proteus仿真1602,想显示一个字符“A”,结果不显示,程序和仿真电路如下,请高手指教。
程序如下:
#include <reg52.h>
#include "lcd.h"

void main(void)
{
        LCD1602();
        Init_Lcd();
        Write_Lcd(0x80,0);
        Write_Lcd('A',1);
        while(1);
}

/******************/
#ifndef _LCD_H_
#define _LCD_H_

#include <reg52.h>

#define LCD_DATA P1

sbit RS=P3^0;
sbit RW=P3^1;
sbit EN=P3^2;

void LCD1602(void);
void Read_Busy(void);
void Write_Lcd(unsigned char Value,bit i);
void Init_Lcd(void);
void Delay(unsigned int i);

#endif
/*********************/
#include "lcd.h"

void LCD1602(void)
{
        EN=0;
        RS=1;
        RW=1;
        LCD_DATA=0xFF;
}

void Read_Busy(void)
{
    LCD_DATA=0xFF;
        RS=0;
        RW=1;
        EN=1;
    while(LCD_DATA & 0x80);
        EN=0;
}

void Write_Lcd(unsigned char Value,bit i)
{
    Read_Busy();
        LCD_DATA=Value;
        RS=i;
        RW=0;
        EN=1;
        EN=0;
}

void Init_Lcd(void)
{
        Delay(15000);
        Write_Lcd(0x38,0);
        Delay(5000);
        Write_Lcd(0x38,0);
        Delay(5000);
        Write_Lcd(0x38,0);
        Write_Lcd(0x08,0);
        Write_Lcd(0x01,0);
        Write_Lcd(0x06,0);
        Write_Lcd(0x0c,0);

}

void Delay(unsigned int i)
{
        while(--i);
}

/******************/
电路图




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
ningling_21 发表于 2014-6-26 08:12 | 显示全部楼层
第三脚直接接地是错的,用电位器调节此脚电压才能显示
 楼主| caoye87 发表于 2014-6-26 20:02 | 显示全部楼层
ningling_21 发表于 2014-6-26 08:12
第三脚直接接地是错的,用电位器调节此脚电压才能显示

谢谢你的回复,接了电位器也没有显示,不知道是不是程序出了问题
ningling_21 发表于 2014-6-26 20:11 | 显示全部楼层
caoye87 发表于 2014-6-26 20:02
谢谢你的回复,接了电位器也没有显示,不知道是不是程序出了问题

这个程序你可以参考一下,STC89C52运行正常的,你要用可以改一下。
  1. *************************************************/
  2. void delay(uchar x)
  3. { uchar j;
  4.     while((x--)!=0)
  5.     {
  6.      for(j=0;j<125;j++)            ;
  7.     }
  8. }
  9. /*************************************************************/
  10. /*                                                           */
  11. /*检查LCD忙状态                                              */
  12. /*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据 */
  13. /*                                                           */
  14. /*************************************************************/
  15. static bit lcd_busy()
  16. {                          
  17.     bit result;     
  18.     LCD_RS = 0;
  19.     LCD_RW = 1;
  20.     LCD_EN = 1;
  21.     delayNOP();
  22.     result = (bit)(LCD_DB_Port&0x80);
  23.     LCD_EN = 0;
  24.     return(result);
  25. }
  26. /*******************************************************************/
  27. /*                                                                 */
  28. /*写指令数据到LCD                                                  */
  29. /*RS=L,RW=L,E=高脉冲,D0-D7=指令码。                             */
  30. /*                                                                 */
  31. /*******************************************************************/
  32. void lcd_wcmd(uchar cmd)
  33. {                          
  34.    while(lcd_busy());
  35.     LCD_RS = 0;
  36.     LCD_RW = 0;
  37.     LCD_EN = 0;
  38.     _nop_();
  39.     _nop_();
  40. #ifdef LCD_8DB
  41.     LCD_DB_Port = cmd;
  42. #endif

  43. delayNOP();
  44.     LCD_EN = 1;         //上跳沿时输入数据
  45.     delayNOP();
  46.     LCD_EN = 0;
  47. }
  48. /*******************************************************************/
  49. /*                                                                 */
  50. /*写显示数据到LCD                                                  */
  51. /*RS=H,RW=L,E=高脉冲,D0-D7=数据。                               */
  52. /*                                                                 */
  53. /*******************************************************************/
  54. void lcd_wdat(uchar dat)
  55. {                          
  56.    while(lcd_busy());
  57.     LCD_RS = 1;
  58.     LCD_RW = 0;
  59.     LCD_EN = 0;
  60. #ifdef LCD_8DB
  61.     LCD_DB_Port = dat;
  62. #endif

  63. delayNOP();
  64.     LCD_EN = 1;
  65.     delayNOP();         //上跳沿时输入数据
  66.     LCD_EN = 0;
  67. }
  68. /*************************************************************/
  69. /*                                                           */
  70. /* LCD初始化设定                                             */
  71. /*                                                           */
  72. /*************************************************************/
  73. void lcd_init()
  74. {
  75.     delay(15);                //等待电源稳定   
  76.     lcd_wcmd(LCD_MODE);      //设置显示模式
  77.     delay(5);
  78.     lcd_wcmd(LCD_MODE);         
  79.     delay(5);
  80.     lcd_wcmd(LCD_MODE);         
  81.     delay(5);
  82.     lcd_wcmd(0x0c);      //显示开,关光标
  83.     delay(5);
  84.     lcd_wcmd(0x06);      //移动光标
  85.     delay(5);
  86.     lcd_wcmd(0x01);      //清除LCD的显示内容
  87.     delay(5);
  88. }
  89. /*************************************************************/
  90. /*                                                           */
  91. /* 设定显示位置                                              */
  92. /*                                                           */
  93. /*************************************************************/
  94. void lcd_PrPos(uchar row,uchar col)
  95. {                          
  96. if(row == 0)
  97.        lcd_wcmd(col | 0x80);     //数据指针=80+地址变量
  98.     if(row == 1)
  99.        lcd_wcmd(col | 0x80 | 0x40);
  100. }
  101. /*************************************************************/
  102. /*                                                           */
  103. /* 显示字符串                                                */
  104. /*                                                           */
  105. /*************************************************************/
  106. void lcd_PrString(uchar *prstring) //显示一个字符串的子程序
  107. {
  108.      while((*prstring) != '\0')
  109. {
  110.        lcd_wdat(*prstring);
  111.     prstring++;
  112. }
  113. }

  114. /*************************************************************/
  115. /*                                                           */
  116. /* 显示二进制字节                                            */
  117. /*                                                           */
  118. /*************************************************************/
  119. void lcd_PrHexByte(uchar prbyte) //显示一个字符子程序
  120. {
  121.      ACC = prbyte;
  122. ACC >>= 4;
  123.      lcd_wdat(TAB_LCD_Hex[ACC]);   //显示高四位
  124.      ACC = prbyte;
  125. ACC &= 0x0F;
  126.      lcd_wdat(TAB_LCD_Hex[ACC]);   //显示低四位
  127. }
  128. /*************************************************************/
  129. /*                                                           */
  130. /* 写入自定义字符                                           */
  131. /*                                                           */
  132. /*************************************************************/
  133. void lcd_wCGRAM(uchar cg_pos,uchar *cg_arr)   //cg_pos 0-7 写入自定义cgram中的位置
  134. {
  135. uchar i;
  136. cg_pos <<= 3;   // cg_pos = cg_pos * 8,转化成地址
  137. cg_pos |= 0x40; // 转化成命令字
  138. for(i = 0; i < 8; i++ )
  139. {
  140.      lcd_wcmd(cg_pos);
  141.    lcd_wdat(*cg_arr);
  142.    cg_pos++;
  143.    cg_arr++;
  144. }
  145. }
 楼主| caoye87 发表于 2014-6-26 21:40 | 显示全部楼层
ningling_21 发表于 2014-6-26 20:11
这个程序你可以参考一下,STC89C52运行正常的,你要用可以改一下。

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

本版积分规则

6

主题

20

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部