打印
[51单片机]

仿真LCD1602

[复制链接]
1274|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运行正常的,你要用可以改一下。
*************************************************/
void delay(uchar x)
{ uchar j;
    while((x--)!=0)
    {
     for(j=0;j<125;j++)            ;
    }
}
/*************************************************************/
/*                                                           */
/*检查LCD忙状态                                              */
/*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据 */
/*                                                           */
/*************************************************************/
static bit lcd_busy()
{                          
    bit result;     
    LCD_RS = 0;
    LCD_RW = 1;
    LCD_EN = 1;
    delayNOP();
    result = (bit)(LCD_DB_Port&0x80);
    LCD_EN = 0;
    return(result);
}
/*******************************************************************/
/*                                                                 */
/*写指令数据到LCD                                                  */
/*RS=L,RW=L,E=高脉冲,D0-D7=指令码。                             */
/*                                                                 */
/*******************************************************************/
void lcd_wcmd(uchar cmd)
{                          
   while(lcd_busy());
    LCD_RS = 0;
    LCD_RW = 0;
    LCD_EN = 0;
    _nop_();
    _nop_();
#ifdef LCD_8DB
    LCD_DB_Port = cmd;
#endif

delayNOP();
    LCD_EN = 1;         //上跳沿时输入数据
    delayNOP();
    LCD_EN = 0;
}
/*******************************************************************/
/*                                                                 */
/*写显示数据到LCD                                                  */
/*RS=H,RW=L,E=高脉冲,D0-D7=数据。                               */
/*                                                                 */
/*******************************************************************/
void lcd_wdat(uchar dat)
{                          
   while(lcd_busy());
    LCD_RS = 1;
    LCD_RW = 0;
    LCD_EN = 0;
#ifdef LCD_8DB
    LCD_DB_Port = dat;
#endif

delayNOP();
    LCD_EN = 1;
    delayNOP();         //上跳沿时输入数据
    LCD_EN = 0;
}
/*************************************************************/
/*                                                           */
/* LCD初始化设定                                             */
/*                                                           */
/*************************************************************/
void lcd_init()
{
    delay(15);                //等待电源稳定   
    lcd_wcmd(LCD_MODE);      //设置显示模式
    delay(5);
    lcd_wcmd(LCD_MODE);         
    delay(5);
    lcd_wcmd(LCD_MODE);         
    delay(5);
    lcd_wcmd(0x0c);      //显示开,关光标
    delay(5);
    lcd_wcmd(0x06);      //移动光标
    delay(5);
    lcd_wcmd(0x01);      //清除LCD的显示内容
    delay(5);
}
/*************************************************************/
/*                                                           */
/* 设定显示位置                                              */
/*                                                           */
/*************************************************************/
void lcd_PrPos(uchar row,uchar col)
{                          
if(row == 0)
       lcd_wcmd(col | 0x80);     //数据指针=80+地址变量
    if(row == 1)
       lcd_wcmd(col | 0x80 | 0x40);
}
/*************************************************************/
/*                                                           */
/* 显示字符串                                                */
/*                                                           */
/*************************************************************/
void lcd_PrString(uchar *prstring) //显示一个字符串的子程序
{
     while((*prstring) != '\0')
{
       lcd_wdat(*prstring);
    prstring++;
}
}

/*************************************************************/
/*                                                           */
/* 显示二进制字节                                            */
/*                                                           */
/*************************************************************/
void lcd_PrHexByte(uchar prbyte) //显示一个字符子程序
{
     ACC = prbyte;
ACC >>= 4;
     lcd_wdat(TAB_LCD_Hex[ACC]);   //显示高四位
     ACC = prbyte;
ACC &= 0x0F;
     lcd_wdat(TAB_LCD_Hex[ACC]);   //显示低四位
}
/*************************************************************/
/*                                                           */
/* 写入自定义字符                                           */
/*                                                           */
/*************************************************************/
void lcd_wCGRAM(uchar cg_pos,uchar *cg_arr)   //cg_pos 0-7 写入自定义cgram中的位置
{
uchar i;
cg_pos <<= 3;   // cg_pos = cg_pos * 8,转化成地址
cg_pos |= 0x40; // 转化成命令字
for(i = 0; i < 8; i++ )
{
     lcd_wcmd(cg_pos);
   lcd_wdat(*cg_arr);
   cg_pos++;
   cg_arr++;
}
}

使用特权

评论回复
5
caoye87|  楼主 | 2014-6-26 21:40 | 只看该作者
ningling_21 发表于 2014-6-26 20:11
这个程序你可以参考一下,STC89C52运行正常的,你要用可以改一下。

谢谢

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

20

帖子

0

粉丝