[大神】救救我吧~~~lcd1602A

2019-07-15 19:43发布

这是的AVR mega8 的程序

/*
* _1602_mega8.c
*
* Created: 2014-5-12 10:47:19
*  Author: Administrator



//这是LCD 1602 通用程序



#define F_CPU 3686400UL
#include <avr/io.h>
#include <avr/delay.h>
#include <string.h>



//LCD控制引脚定义
/***********************************/
#define RS  PB0      //寄存器控制端口   0为命令 1数据
#define RW  PB1      //读写操作端口
#define E   PB2                 //使能操作端口                         
/***********************************/


//LCD 控制端口定义
/***********************************/
#define LCD_CRTL_PORT PORTB
/***********************************/


//LCD 控制引脚操作定义

#define RS_1  LCD_CRTL_PORT|= (1<<RS)                //RS为1 进行数据传输                         
#define RS_0  LCD_CRTL_PORT&=~(1<<RS)       //RS为0 进行命令控制       
#define RW_1  LCD_CRTL_PORT|= (1<<RW)                //RW为1 进行读操作
#define RW_0  LCD_CRTL_PORT&=~(1<<RW)                //RW为0 进行写操作
#define EN_1  LCD_CRTL_PORT|= (1<<E)                //EN为1 使能1602
#define EN_0  LCD_CRTL_PORT&=~(1<<E)                //EN为0 不使能1602
/***********************************
#define RS_1  LCD_CRTL_PORT|=_BV(RS)                //RS为1 进行数据传输
#define RS_0  LCD_CRTL_PORT&=~_BV(RS)       //RS为0 进行命令控制
#define RW_1  LCD_CRTL_PORT|=_BV(RW)                //RW为1 进行读操作
#define RW_0  LCD_CRTL_PORT&=~_BV(RW)                //RW为0 进行写操作
#define EN_1  LCD_CRTL_PORT|=_BV(E)                    //EN为1 使能1602
#define EN_0  LCD_CRTL_PORT&=~_BV(E)                //EN为0 不使能1602
***********************************/


//LCD 数据端口定义
/***********************************/
#define LCD_PORT PORTD                        //发送LCD数据端口
#define LCD_PIN  PIND                        //读取LCD数据端口
#define LCD_DDR  DDRD                    //LCD数据端口方向

/***********************************/





//          LCD忙等待
/***********************************/
void LCD_BUSY_WAIT()
{            
        RS_0;   RW_1;                                      //读状态
       
    LCD_DDR=0x00;                                          //端口设为输入
        _delay_ms(10);
        EN_1;                                                            //使能1602 等待
                                  
        //loop_until_bit_is_clear(LCD_PIN,7);
                                                                  //空转直到端口的最高位7 为0
        while((LCD_PIN&0X80)!=0);                                                          
        EN_0;
        LCD_DDR=0XFF;                                  //还原LCD端口为输出       
        _delay_ms(5);                       
}

/***********************************/

//       写LCD命令寄存器
/***********************************/
void Write_LCD_Command(unsigned char cmd)
{   
        LCD_BUSY_WAIT();
        RS_0;        RW_0;                    //写状态寄存器
    _delay_ms(10);
        LCD_PORT=cmd;               //写入命令
        _delay_ms(15);
        EN_1;
        _delay_ms(5);
        EN_0;                                    //使能芯片执行
        LCD_CRTL_PORT=0X00;     //清除端口
}
/***********************************/


//       写LCD数据寄存器
/***********************************/
void Write_LCD_Data(unsigned char data)
{
        LCD_BUSY_WAIT();
        RS_1;        RW_0;                //写数据寄存器
        _delay_ms(10);
        LCD_PORT=data;                //写入数据
        _delay_ms(15);
        EN_1;
        _delay_ms(5);
        EN_0;               //使能
       
}

/***********************************/

//       LCD初始化
/***********************************/
void Initialize_LCD()
{
        Write_LCD_Command(0x01);        _delay_ms(15);                //清屏
        Write_LCD_Command(0x38);        _delay_ms(15);                //置功能,8位数据,双行显示,5*7字体
        Write_LCD_Command(0x06);        _delay_ms(15);                //字符进入模式,屏幕不移动,字符移动,数据时递增的
        Write_LCD_Command(0x0c);        _delay_ms(15);                //显示开,关闭光标
        Write_LCD_Command(0x01);        _delay_ms(15);                //清屏
}

/***********************************/


//       LCD字符串显示
/***********************************/
void LCD_ShowString(unsigned char x,unsigned char y,char *str) //表示要再显示屏上的第y行的第x个位置(从左往右)开始显示字符
{
        unsigned char i=0;
       
        if(y==0)Write_LCD_Command(0x80|x);                //假如第一行开始显示 从x位开始
        if(y==1)Write_LCD_Command(0xC0|x);                //假如第二行开始显示 从x位开始
       
        for (i=0;i<16 && str!='';i++)         //输出字符串
        {

                Write_LCD_Data(str);
        };
               
       
}

main()
{
        DDRB=0XFF;DDRC=0XFF;

        Initialize_LCD();

        LCD_ShowString(0,0,"U=");
       
        _delay_ms(10);
       
        LCD_ShowString(2,0,"10v");
       
        PORTC=(1<<PC0);
       
       
       
}


这是我的仿真截图
QQ截图20140515090951.jpg



但是我的实际图是这样的
QQ截图20140515091141.jpg




1.尝试过调解VL 对地的电阻,除了方块对比度变化 ,别的没反应

2.尝试过只接VSS VDD BLK BLA,只是亮起无显示,但是一接上VL就是这样块块了。。。(难道我这个液晶坏了?)

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
2条回答
fun_90
1楼-- · 2019-07-15 23:53
感谢冷漠的大家,,,,我已经找到问题。。。原来我的单片机坏了
依然落叶飘零
2楼-- · 2019-07-15 23:55
能显示方块一般都不是液晶的问题,都是时序不对,初始化不成功。

一周热门 更多>