新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > AVR六個IO口驅動液晶LCD1602

        AVR六個IO口驅動液晶LCD1602

        作者: 時間:2016-11-10 來源:網絡 收藏
        液晶LCD1602比中文大液晶12864較容易驅動,這個驅動程序只用六個單片機IO口驅動,可以減少四個IO口,套用也方便...

        //LCD1602.h

        本文引用地址:http://www.104case.com/article/201611/317336.htm

        /*---------------------------------------------------------------
        要使用本驅動,改變下面配置信息即可

        注意:RW要接地
        -----------------------------------------------------------------*/
        #define LCD_EN_PORT PORTD//以下2個要設為同一個口
        #define LCD_EN_DDR DDRD
        #define LCD_RS_PORT PORTD//以下2個要設為同一個口
        #define LCD_RS_DDR DDRD
        #define LCD_DATA_PORT PORTD//以下3個要設為同一個口
        #define LCD_DATA_DDR DDRD//一定要用高4位
        #define LCD_DATA_PIN PIND
        #define LCD_RS (1<<0)//0x04 portd2 out
        #define LCD_EN (1<<2)//0x08 portd3 out
        #define LCD_DATA ((1<<4)|(1<<5)|(1<<6)|(1<<7))//0xf0 portd4/5/6/7 out
        /*-------------------------------------------------------------------------------
        函數說明
        ------------------------------------------------------------------------------*/
        void LCD_init(void);
        void LCD_en_write(void);
        void LCD_write_command(unsigned char command) ;
        void LCD_write_data(unsigned char data);
        void LCD_set_xy (unsigned char x, unsigned char y);
        void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s);
        void LCD_write_char(unsigned char X,unsigned char Y,unsigned char data);
        void delay_nus(unsigned int n);
        void delay_nms(unsigned int n);

        //LCD1602.c

        #include
        #include
        #include"LCD1602.h"


        void delay_1us(void)//1us延時函數
        {
        asm("nop");
        }

        void delay_nus(unsigned int n)//N us延時函數
        {
        unsigned int i=0;
        for (i=0;i delay_1us();
        }

        void delay_1ms(void)//1ms延時函數
        {
        unsigned int i;
        for (i=0;i<1140;i++);
        }

        void delay_nms(unsigned int n)//N ms延時函數
        {
        unsigned int i=0;
        for (i=0;i delay_1ms();
        }


        /*----------------------------------------------------------------------------*/
        void LCD_init(void)//液晶初始化
        {
        LCD_DATA_DDR|=LCD_DATA;//數據口方向為輸出
        LCD_EN_DDR|=LCD_EN;//設置EN方向為輸出
        LCD_RS_DDR|=LCD_RS;//設置RS方向為輸出
        LCD_write_command(0x28);
        LCD_en_write();
        delay_nus(40);
        LCD_write_command(0x28);//4位顯示
        LCD_write_command(0x0c);//顯示開
        LCD_write_command(0x01);//清屏
        delay_nms(2);
        }

        /*----------------------------------------------------------------------------*/
        void LCD_en_write(void)//液晶使能
        {
        LCD_EN_PORT|=LCD_EN;
        delay_nus(1);
        LCD_EN_PORT&=~LCD_EN;
        }

        /*----------------------------------------------------------------------------*/
        void LCD_write_command(unsigned char command)//寫指令
        {
        delay_nus(16);
        LCD_RS_PORT&=~LCD_RS;//RS=0
        LCD_DATA_PORT&=0X0f;//清高四位
        LCD_DATA_PORT|=command&0xf0;//寫高四位
        LCD_en_write();
        command=command<<4;//低四位移到高四位
        LCD_DATA_PORT&=0x0f;//清高四位
        LCD_DATA_PORT|=command&0xf0;//寫低四位
        LCD_en_write();

        }
        /*----------------------------------------------------------------------------*/
        void LCD_write_data(unsigned char data)//寫數據
        {
        delay_nus(16);
        LCD_RS_PORT|=LCD_RS;//RS=1
        LCD_DATA_PORT&=0X0f;//清高四位
        LCD_DATA_PORT|=data&0xf0;//寫高四位
        LCD_en_write();
        data=data<<4;//低四位移到高四位
        LCD_DATA_PORT&=0X0f;//清高四位
        LCD_DATA_PORT|=data&0xf0;//寫低四位
        LCD_en_write();
        }
        /*----------------------------------------------------------------------------*/
        void LCD_set_xy( unsigned char x, unsigned char y )//寫地址函數
        {
        unsigned char address;
        if (y == 0) address = 0x80 + x;
        else address = 0xc0 + x;
        LCD_write_command( address);
        }
        /*----------------------------------------------------------------------------*/

        //列x=0~15,行y=0,1
        void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s)

        {
        LCD_set_xy( X, Y );//寫地址
        while (*s)// 寫顯示字符
        {
        LCD_write_data( *s );
        s ++;
        }

        }

        /*----------------------------------------------------------------------------*/

        //列x=0~15,行y=0,1
        void LCD_write_char(unsigned char X,unsigned char Y,unsigned char data)

        {
        LCD_set_xy( X, Y );//寫地址
        LCD_write_data( data);

        }

        //main.c

        #include
        #include
        #include"LCD1602.h"

        void main(void)
        {
        LCD_init();
        // X Y *s
        LCD_write_string(2, 0, "hello!!");
        while(1)
        {
        // X Y *s
        LCD_write_string(2, 1,"1234567890");
        // X Y data
        LCD_write_char(12, 0, 8);
        LCD_write_char(13, 0, 8);
        }

        }



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 博湖县| 红原县| 隆子县| 四子王旗| 怀宁县| 延边| 大同县| 从化市| 吴堡县| 涟源市| 重庆市| 郎溪县| 安庆市| 濉溪县| 辽宁省| 泰兴市| 交口县| 博乐市| 五家渠市| 政和县| 永济市| 高尔夫| 兰州市| 烟台市| 柘荣县| 墨竹工卡县| 澜沧| 恩施市| 南郑县| 德兴市| 神木县| 义乌市| 镇安县| 藁城市| 綦江县| 临洮县| 奇台县| 闽清县| 宿迁市| 克山县| 南城县|