终于把lcd1602搞定了,迈出了一小步,不容易啊

花费了10天,终于把lcd1602点亮了,中间遇到了一些问题,比如上电后只有一行黑块,后来仔细检查,不断尝试终于把问题解决了~过程曲折啊,不过还是怪自己太菜,以后要多多加油啊~O(∩_∩)O~下面把程序放上来与大家共享,共同进步~
主函数:
//包含所需头文件
#include <avr/io.h>
#include <avr/interrupt.h>
#include <abc_lcd.h>



/*------宏定义------*/
#define uchar        unsigned char
#define uint        unsigned int
#define BIT(x)        (1<<(x))
#define NOP()        asm("nop")
#define WDR()         asm("wdr")


//端口初始化
void port_init(void)
{
        PORTA = 0x00;
        DDRA  = 0x00;
        PORTB = 0x00;
        DDRB  = 0x00;
        PORTC = 0x00;
        DDRC  = 0x00;
        PORTD = 0x00;
        DDRD  = 0x00;
}


void init_devices(void)
{
        cli(); //禁止所有中断
        MCUCR  = 0x00;
        MCUCSR = 0x80;//禁止JTAG
        GICR   = 0x00;
        port_init();
        Delay_nms(500);
lcd_init();

        sei();//开全局中断
}

//主函数
int main(void)
{init_devices();
uint i,j;
        while(1)
        {lcd_locate(0,0);
        lcd_print_string("^^MyLCD1602@_@^^");
  lcd_locate(0,1);
lcd_print_string("^^Thanks m7w!!^^");
Delay_nms(5000);
lcd_cls();
        for(i=0x41,j=0;i<0x90;i++)
{lcd_write_char(j,0,i);
j++;
    Delay_nms(5000);}
        }
        return 0;
}


lcd1602驱动程序"abc_lcd.h":


/*
* ----------------------------------------------------------------------------
* Project Charger SE
*
* file: abc_lcd.h
*
* 创建者:  Trinove
* 创建日期: 2008-1-13
*
* 修改者:martin7wind
* 修改日期:2008-2-3
*
* 最后修改者:dxxlovewj
* 修改日期:2009.12.22
* qq:281564713  朋友们可以加我大家共同进步哈~我是新手~
* 当前版本: 0.01
*
* ----------------------------------------------------------------------------
*
*
*  液晶显示的基本支持函数
*
*/


#ifndef _LCD_H_
#define _LCD_H_ 1


// 位操作

#define BIT(x)        (1<<(x))

#define                BIT_SET(a,b)        a|=BIT(b)
#define                BIT_CLR(a,b)               a&=~BIT(b)
#define                BIT_INV(a,b)           a^=BIT(b)
#define                BIT_STATUS(a,b) a&BIT(b)
#define  xtal 1

//四线模式
/*----------------------------------------------------------------------------
LCD   1602
PIN0~7  RW E RS
连线如下:
PIN7 -->   PA7
PIN6 -->   PA6
PIN5 -->   PA5
PIN4 -->   PA4
RW   --> GND (R/W = 0 write)
E      --> PA6 (E = 1 enable )
RS    --> PA7 (RS = 0 CMD;RS = 1 DATA )

---------------------------------------------------------------------------*/
#define uint        unsigned int
#define LCD_DATA7_DDR DDRA
#define LCD_DATA6_DDR DDRA
#define LCD_DATA5_DDR DDRA
#define LCD_DATA4_DDR DDRA

#define LCD_DATA7_PIN PINA
#define LCD_DATA6_PIN PINA
#define LCD_DATA5_PIN PINA
#define LCD_DATA4_PIN PINA

#define LCD_DATA7_PORT PORTA
#define LCD_DATA6_PORT PORTA
#define LCD_DATA5_PORT PORTA
#define LCD_DATA4_PORT PORTA

#define LCD_DATA7 PA7
#define LCD_DATA6 PA6
#define LCD_DATA5 PA5
#define LCD_DATA4 PA4

#define LCD_E_DDR  DDRD
#define LCD_E_PORT  PORTD
#define LCD_E  PD7

#define LCD_E_HIGH BIT_SET(LCD_E_PORT, LCD_E)
#define LCD_E_LOW BIT_CLR(LCD_E_PORT, LCD_E)

#define LCD_RS_DDR DDRC
#define LCD_RS_PORT PORTC
#define LCD_RS PC6

#define LCD_DATA_MODE BIT_SET(LCD_RS_PORT, LCD_RS)
#define  LCD_CMD_MODE BIT_CLR(LCD_RS_PORT, LCD_RS)

#define CMD 0
#define DATA 1

#define BIT_POSITION7 (1<<7)
#define BIT_POSITION6 (1<<6)
#define BIT_POSITION5 (1<<5)
#define BIT_POSITION4 (1<<4)

#define LINE_1 0
#define LINE_2 1
void Delay_us(void)                 //1us延时函数
  {
   asm("nop");
  }

void Delay_nus(unsigned int n)       //N us延时函数
  {
   unsigned int i=0;
   for (i=0;i<n;i++)
   Delay_us();
  }
void Delay_1ms(void)
{uint j;
for (j=1;j<(uint)(xtal*143-2);j++)
;
}
void Delay_nms(unsigned int n)       //N ms延时函数
  {
   unsigned int j=0;
   for (j=0;j<n;j++)
   Delay_1ms();
  }


unsigned int temp;

//最初的初始化设置中,写入数据函数
void lcd_write_cmd(unsigned char cmd)
{

        LCD_CMD_MODE;

        if(cmd&BIT_POSITION7)
                {BIT_SET(LCD_DATA7_PORT,LCD_DATA7);}
        else
                {BIT_CLR(LCD_DATA7_PORT,LCD_DATA7);}

        if(cmd&BIT_POSITION6)
                {BIT_SET(LCD_DATA6_PORT,LCD_DATA6);}
        else
                {BIT_CLR(LCD_DATA6_PORT,LCD_DATA6);}

        if(cmd&BIT_POSITION5)
                {BIT_SET(LCD_DATA5_PORT,LCD_DATA5);}
        else
                {BIT_CLR(LCD_DATA5_PORT,LCD_DATA5);}

        if(cmd&BIT_POSITION4)
                {BIT_SET(LCD_DATA4_PORT,LCD_DATA4);}
        else
                {BIT_CLR(LCD_DATA4_PORT,LCD_DATA4);}

        //E 信号
        LCD_E_HIGH;

        Delay_nus(500);

        LCD_E_LOW;

}

// 向LCD写入数据
void lcd_write_byte(unsigned char byte, unsigned char type)
{
        if(type)
               
                {LCD_DATA_MODE;}
        else
                {LCD_CMD_MODE;}

        temp = byte;

        if(byte&BIT_POSITION7)
                {BIT_SET(LCD_DATA7_PORT,LCD_DATA7);}
        else
                {BIT_CLR(LCD_DATA7_PORT,LCD_DATA7);}

        if(byte&BIT_POSITION6)
                {BIT_SET(LCD_DATA6_PORT,LCD_DATA6);}
        else
                {BIT_CLR(LCD_DATA6_PORT,LCD_DATA6);}

        if(byte&BIT_POSITION5)
                {BIT_SET(LCD_DATA5_PORT,LCD_DATA5);}
        else
                {BIT_CLR(LCD_DATA5_PORT,LCD_DATA5);}

        if(byte&BIT_POSITION4)
                {BIT_SET(LCD_DATA4_PORT,LCD_DATA4);}
        else
                {BIT_CLR(LCD_DATA4_PORT,LCD_DATA4);}

                //E 信号
        LCD_E_HIGH;

        Delay_nus(500);

        LCD_E_LOW;

                Delay_nms(500);//39us!

        byte <<=4;

        if(byte&BIT_POSITION7)
                {BIT_SET(LCD_DATA7_PORT,LCD_DATA7);}
        else
                {BIT_CLR(LCD_DATA7_PORT,LCD_DATA7);}

        if(byte&BIT_POSITION6)
                {BIT_SET(LCD_DATA6_PORT,LCD_DATA6);}
        else
                {BIT_CLR(LCD_DATA6_PORT,LCD_DATA6);}

        if(byte&BIT_POSITION5)
                {BIT_SET(LCD_DATA5_PORT,LCD_DATA5);}
        else
                {BIT_CLR(LCD_DATA5_PORT,LCD_DATA5);}

        if(byte&BIT_POSITION4)
                {BIT_SET(LCD_DATA4_PORT,LCD_DATA4);}
        else
                {BIT_CLR(LCD_DATA4_PORT,LCD_DATA4);}

                        //E 信号
        LCD_E_HIGH;

        Delay_nms(500);

        LCD_E_LOW;

        Delay_nms(500);
       
}


// 向LCD写入指令
void lcd_write_order(unsigned char order)
{

}



// 从LCD读取标志
unsigned char lcd_read_status(void)
{
unsigned char result;


return result;
}

//清屏
void lcd_cls()
{
        lcd_write_byte(0x01,CMD);
}

/********************************************************
1602 液晶初始化函数
输入:无
输出:无
功能: 设置io状态,初始化1602
********************************************************/

void lcd_init()
{
        // 相关IO配置
         BIT_SET(LCD_DATA7_DDR, LCD_DATA7);

         BIT_SET(LCD_DATA6_DDR, LCD_DATA6);

         BIT_SET(LCD_DATA5_DDR, LCD_DATA5);

         BIT_SET(LCD_DATA4_DDR, LCD_DATA4);
         
        BIT_SET(LCD_E_DDR, LCD_E);

        BIT_SET(LCD_RS_DDR,LCD_RS);

                 Delay_nms(500);//上电延时15MS以上
         lcd_write_cmd(0x30);//上电初始化命令
         Delay_nms(500);//delay >5.1MS
         lcd_write_cmd(0x30);
         Delay_nms(500);//delay >100us
         lcd_write_cmd(0x30);
                Delay_nms(500);
          lcd_write_cmd(0x20);//四位数据模式
        Delay_nms(500);
         //功能设定
          lcd_write_byte(0x28,CMD);//0x28=4位数据线,双行显示,5*7字型
                Delay_nms(500);
           lcd_write_byte(0x28,CMD);//0x28=4位数据线,双行显示,5*7字型
            Delay_nms(500);
             lcd_write_byte(0x28,CMD);//0x28=4位数据线,双行显示,5*7字型
           Delay_nms(500);
           lcd_write_byte(0x28,CMD);//0x28=4位数据线,双行显示,5*7字型
            Delay_nms(500);

         //LCD_write_byte(0x0e,CMD);//0x0e=显示开,光标不闪烁
         lcd_write_byte(0x0c,CMD);//0x0c=显示开,光标不显示
   Delay_nms(500);
  lcd_write_byte(0x0c,CMD);//0x0c=显示开,光标不显示
  Delay_nms(500);
         lcd_write_byte(0x06,CMD);//0x06=每次输入后光标右移一格
         Delay_nms(500);

        lcd_cls();
Delay_nms(500);
}

void lcd_write_char(unsigned char lcd_x,unsigned char lcd_y,unsigned char data)
{
if(lcd_y) //第二行
  lcd_write_byte(0xc0+lcd_x,CMD);
else      //第一行
  lcd_write_byte(0x80+lcd_x,CMD);
  Delay_nms(5000);
lcd_write_byte(data,DATA);
}

// 从LCD读取数据
unsigned char lcd_read_data(void)
{
unsigned char result;


return result;
}


// 定位LCD行列位置
// 横坐标 lcd_x
//纵坐标 lcd_y
void lcd_locate(unsigned char lcd_x, unsigned char lcd_y)
{
        if(lcd_y) //第二行
          lcd_write_byte(0xc0+lcd_x,CMD);
         else      //第一行
          lcd_write_byte(0x80+lcd_x,CMD);
}

// 向LCD发送显示文字
//输入参数显示文字指针pstring
void lcd_print_string(unsigned char * pstring)
{
         while(*pstring)
                 {
                         lcd_write_byte(*pstring,DATA);
                         pstring++;
                 }
}

// 向LCD发送显示数据
// number表示数值,为有符号的整数,ca表示显示的位数(1-6),cb表示其中的小数位数,(类似定点的小数)
// 显示整数时,cb置0即可
void lcd_print_number(signed int number , unsigned char ca , unsigned char cb)
{
               
        unsigned char bit[4];   //uint,  最多5位

        unsigned char *pbit;

        unsigned char i;

        if(number>0)
                {
                        temp = number;
                }
        else
                {
                        temp =-number;
                }
//        temp = 12345;

//算出每一位057920


        bit[4] = temp/10000 ;

        bit[3] = temp/1000  - bit[4]*10;

        bit[2] = temp/100  - bit[4]*100 - bit[3]*10;

        bit[1] = temp/10  - bit[4]*1000 - bit[3]*100 - bit[2]*10;

        bit[0] = temp  - bit[4]*10000 - bit[3]*1000 - bit[2]*100 - bit[1]*10;

        if(number<0)     //负值
                {
                        lcd_write_byte('-', DATA);        //先显示负号

                        pbit = &(bit [4]);   //指向最高位

                        for(i=5-ca;i>0;i--)
                                pbit --;
                       
                        while(ca)
                                {
                                        if(ca==cb)
                                                lcd_write_byte('.', DATA);

                                        lcd_write_byte(*pbit+48,DATA);

                                        pbit --;

                                        ca--;
                                }
                }
        else  //正数
                {

                        pbit = &(bit [4]);   //指向最高位

                        for(i=5-ca;i>0;i--)
                                pbit --;

                        while(ca)
                                {
                                        if(ca==cb)
                                                lcd_write_byte('.', DATA);

                                        lcd_write_byte(*pbit+48,DATA);

                                        pbit --;

                                        ca--;
                                }
                }
}

#endif

有幸在文件头里面看到自己的名字,呵呵

论坛里面有STM32下的程序,下次升级到STM32可以直接照搬了
一点一滴,积沙成山

TOP

晕~~原作者来了~(*^__^*) 嘻嘻……得好好谢谢你啊~提前祝你圣诞快乐,元旦快乐啊~

TOP

呵呵 这个好  还有注释呢  。。。顶顶
深深的迷恋你ATM

TOP

坚持就能成功,楼主的精神可佳

TOP

Review opelc.org on alexa.com