新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > LCD1602的C8051驅動

        LCD1602的C8051驅動

        作者: 時間:2016-11-23 來源:網絡 收藏
        //--------------------lcd1602.c------------------------------
        //**********************************************
        // 功能:C8051F(330) LCD1602(4線驅動
        //**********************************************
        #include
        #include "delay.h"
        //
        //12 345678910 11 12 13 1415 16
        // |||||||
        //|---| |||||---------------------| |--|
        //VSS VDD VL RS RW ED0 D1 D2 D3 D4 D5 D6 D7 B+ B-

        //
        //連接:
        //RS->P0.1
        //RW->P0.2
        //E->P0.3
        //D4~D7->P1.4~P1.7
        //VL根據不同型號,可能要接VSS或VDD
        //B+/B-->+5/GND
        //VSS/VDD->GND/+3.3

        sbit lcd_rs=P0^1;
        sbit lcd_rw=P0^2;
        sbit lcd_e=P0^3;
        #define LCD_DAT P1
        //HD44780指令
        #define LCD_CLEAR 0x01
        //清屏
        #define LCD_HOME 0x02
        //光標復位
        #define LCD_SET_INPUT 0x06
        //輸入模式:AC+1,顯示不移
        #define LCD_DISPLAY_OFF 0x80
        #define LCD_DISPLAY_ON 0x0c
        #define LCD_SHIFT 0x14
        //顯示屏和光標移動:AC+1,光標右移1格
        #define LCD_MODE_8 0x38
        #define LCD_MODE_4 0x28
        //unsigned char lcd_add=0x00;
        void lcd_write_cmd(unsigned char dat)
        {
        lcd_rs=0;
        lcd_rw=0;
        lcd_e=1;
        LCD_DAT=dat;
        delay_us(1);
        lcd_e=0;
        //delay_us(50);
        delay_us(1);
        lcd_e=1;
        LCD_DAT=dat<<4;
        delay_us(1);
        lcd_e=0;
        delay_us(50);
        }
        void lcd_sendchar(unsigned char dat)
        {
        lcd_rs=1;
        lcd_rw=0;
        lcd_e=1;
        LCD_DAT=dat;
        delay_us(1);
        lcd_e=0;
        //delay_us(50);
        delay_us(1);
        lcd_e=1;
        LCD_DAT=dat<<4;
        delay_us(1);
        lcd_e=0;
        delay_us(50);
        }
        //
        //void lcd_wait_busy(void)
        //{
        //lcd_rs=0;
        //lcd_rw=1;
        //lcd_e=1;
        //while(LCD_DAT&0x80);
        //lcd_e=0;
        //delay_us(50);
        //}

        void lcd_init(void)
        {
        lcd_e=0;
        delay_ms(15);
        lcd_write_cmd(LCD_MODE_8);
        delay_ms(5);
        lcd_write_cmd(LCD_MODE_8);
        delay_ms(5);
        lcd_write_cmd(LCD_MODE_8);
        lcd_write_cmd(LCD_MODE_4);
        //delay_us(50);
        lcd_write_cmd(LCD_DISPLAY_ON);
        //delay_us(50);
        lcd_write_cmd(LCD_CLEAR);
        delay_ms(2);
        lcd_write_cmd(LCD_SET_INPUT);
        //delay_us(50);
        }
        void lcd_reset(void)
        {
        lcd_write_cmd(LCD_CLEAR);
        delay_ms(2);
        lcd_write_cmd(LCD_HOME);
        delay_ms(2);
        }
        void lcd_setadd(unsigned char add)
        {
        if(add>0x0f)add+=0x30;
        lcd_write_cmd(add|0x80);
        }
        void lcd_sendstr(unsigned char add,unsigned char *dat)
        {
        lcd_setadd(add);
        while(*dat)
        {
        lcd_sendchar(*dat++);
        }
        }
        //-----------------------------------------------------------------
        //----------------------lcd1602.h---------------------------------
        #ifndef _LCD_1602
        #define _LCD_1602
        extern void lcd_write_cmd(unsigned char dat);
        extern void lcd_sendchar(unsigned char dat);
        extern void lcd_wait_busy(void);
        extern void lcd_init(void);
        extern void lcd_sendstr(unsigned char add,unsigned char *dat);
        extern void lcd_setadd(unsigned char add);
        extern void lcd_reset(void);
        #endif
        //-------------------------------------------------------------------
        //----------------delay.c-------------------------------------------
        //**********************************************
        // 功能:C8051F(330)精確延時 24.5M
        // 作者:July
        // Blog: http://blog.sina.com.cn/mcuworld
        // 最后更新:2008-12-31
        // 尊重勞動成果,引用請勿刪除本信息謝謝!
        //**********************************************
        #include
        #include
        //----------------------------------------------
        //----------------------------
        // 微秒級精確延時
        // 仿真:(24.5M)
        // delay_us(1); //1.72us
        // delay_us(10);//10.89us
        // delay_us(100); //102.74us
        //----------------------------
        void delay_us(unsigned char k)
        {
        while(k--)
        {
        _nop_();_nop_();_nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();
        }
        }
        //----------------------------------------------
        // 毫秒級精確延時
        // 仿真:(24.5M)
        // delay_ms(1); //1001.75us
        // delay_ms(10);//10.008ms
        // delay_ms(100); //老機太慢出不來鳥~自己測吧:)
        //----------------------------------------------
        void delay_1ms()
        {
        unsigned int j ;
        for(j=3060;j>0;j--);
        }
        void delay_ms(unsigned int i)
        {
        for(;i>0;i--)delay_1ms();
        }
        //------------------------------------------
        //----------------delay.h-----------------
        #ifndef _DELAY_H
        #define _DELAY_H
        extern void delay_us(unsigned char k);
        extern void delay_ms(unsigned int i);
        #endif
        //---------------------------------------
        //---------------------main.c--------------
        //**********************************************
        // 功能:C8051F(330)精確延時+UART0+LCD1602(4線)
        // 作者:July
        // Blog: http://blog.sina.com.cn/mcuworld
        // 最后更新:2009-5-12
        // 尊重勞動成果,引用請勿刪除本信息謝謝!
        //**********************************************
        //
        //AVR/AVR32群:78613373
        //C8051F/STC/MPC群:78614293
        //Cortex-M3/M0(STM32)群:78612895
        //PIC/PIC32群:78614030
        //LabWindows/CVI群:20328398
        //WinCE/C#群:74373749
        //
        //使用F330,串口為P0.4(TX0),P0.5(RX0);
        #include
        //#include
        #include "uart0.h"
        #include "delay.h"
        #include "lcd1602.h"
        void SYSCLK_Init(void);
        void PORT_Init(void);

        void main(void)
        {
        unsigned char dat=0x20;
        unsigned char address=0;
        PCA0MD&=~0x40 ;
        // 禁止看門狗
        PORT_Init();
        // 初始化端口I/O
        SYSCLK_Init();
        // 初始化系統時鐘
        UART0_Init();
        // 串口初始化

        EA=1 ;
        ES0=1 ;
        P0|=0x01;
        lcd_init();
        lcd_reset();
        lcd_sendstr(0,"1234567890abcdef");
        lcd_sendstr(16,"ghijklmnopqrstuv");
        sendstr("Welcome to Julys Hut!");
        while(1)
        {
        delay_ms(200);
        P0^=0x01;
        Uart0_Transmit(dat);
        lcd_setadd(address++);
        if(address>31)address=0;
        lcd_sendchar(dat++);
        if(dat>=0x7f)dat=0x20;
        //Uart0_Transmit(0x00);
        }
        }
        //-----------------------------------------------------------------------------
        // 端口初始化
        //-----------------------------------------------------------------------------
        //
        // 配置交叉開關和通用IO
        //
        // P0.4 - UART TX0
        // P0.5 - UART RX0
        void PORT_Init(void)
        {
        P0MDOUT|=0x10 ;
        // 使能 UTX 為推挽輸出
        P0MDOUT|=0x01;
        XBR0=0x01 ;
        // 使能 UART0 占用 P0.4(TXD) 和 P0.5(RXD)
        XBR1=0x40 ;
        //使能交叉開關
        }
        //-----------------------------------------------------------------------------
        // 系統時鐘初始化
        //-----------------------------------------------------------------------------
        void SYSCLK_Init(void)
        {
        OSCICN|=0x03 ;
        // 配置內部振蕩器的的最大頻率
        RSTSRC=0x04 ;
        // 使能始終丟失檢測寄存器
        }
        //----------------------------------------------------
        //-------------main.h----------------------
        #ifndef _MAIN_H
        #define _MAIN_H
        // 系統工作頻率
        #define SYSCLK 24500000
        // 串口工作波特率
        #define BAUDRATE 9600
        #endif
        //----------------------------------------
        //----------uart0.c-----------------------
        //**********************************************
        // 功能:C8051F(330) UART0
        // 作者:July
        // Blog: http://blog.sina.com.cn/mcuworld
        // 最后更新:2009-5-12
        // 尊重勞動成果,引用請勿刪除本信息謝謝!
        //**********************************************
        #include
        #include "main.h"
        unsigned char temp ;
        void UART0_Init(void);
        void Uart0_Transmit(unsigned char tmp);
        void sendstr(unsigned char*tmp);
        //-----------------------------------------------------------------------------
        // 串口UART0初始化
        //-----------------------------------------------------------------------------
        void UART0_Init(void)
        {
        SCON0=0x10 ;
        if(SYSCLK/BAUDRATE/2/256<1)
        {
        TH1=-(SYSCLK/BAUDRATE/2);
        CKCON&=~0x0B ;
        CKCON|=0x08 ;
        }
        else if(SYSCLK/BAUDRATE/2/256<4)
        {
        TH1=-(SYSCLK/BAUDRATE/2/4);
        CKCON&=~0x0B ;
        CKCON|=0x09 ;
        }
        else if(SYSCLK/BAUDRATE/2/256<12)
        {
        TH1=-(SYSCLK/BAUDRATE/2/12);
        CKCON&=~0x0B ;
        }
        else
        {
        TH1=-(SYSCLK/BAUDRATE/2/48);
        CKCON&=~0x0B ;
        CKCON|=0x02 ;
        }

        TL1=TH1 ;
        TMOD&=~0xf0 ;
        TMOD|=0x20 ;
        TR1=1 ;
        // TI0 = 1;
        }
        //-----------------------------------------------------------
        // 串口UART0中斷
        //-----------------------------------------------------------
        //中斷向量0x0023
        void UATR0_ISR(void)interrupt 4
        {
        //Rx、Tx共用中斷
        //接收中斷
        if(!TI0)
        {
        RI0=0 ;
        temp=SBUF0 ;
        Uart0_Transmit(temp);
        }
        //發送中斷
        else TI0=0 ;
        }
        //-----------------------------------------------------------
        // 串口UART0發送
        //-----------------------------------------------------------
        void Uart0_Transmit(unsigned char tmp)
        {
        ES0=0 ;
        //關UART0中斷
        EA=0 ;
        //關全局中斷
        SBUF0=tmp ;
        while(TI0==0);
        //TI0=0 ;
        ES0=1 ;
        //開UART0中斷
        EA=1 ;
        //開全局中斷

        }
        //-----------------------------------------------------------
        // 發送字符串
        //-----------------------------------------------------------
        void sendstr(unsigned char*tmp)
        {
        while(*tmp)
        {
        Uart0_Transmit(*tmp++);
        }
        }

        //-----------------------------------
        //-----------------------uart0.h-------------------
        #ifndef _UART0_H
        #define _UART0_H
        extern void UART0_Init(void);
        extern void Uart0_Transmit(unsigned char tmp);
        extern void sendstr(unsigned char*tmp);
        #endif

        //-------------------------------------


        關鍵詞: LCD1602C8051驅

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 固始县| 黔西县| 奉化市| 望谟县| 宁南县| 临泉县| 伊宁县| 忻州市| 集贤县| 连江县| 汕尾市| 洪雅县| 佛坪县| 道真| 棋牌| 四平市| 油尖旺区| 新竹市| 富民县| 札达县| 道孚县| 海南省| 舒城县| 都安| 资溪县| 铁力市| 石泉县| 安远县| 五家渠市| 封开县| 阜新| 潢川县| 保山市| 翼城县| 万盛区| 定西市| 肥乡县| 珲春市| 义马市| 德阳市| 青海省|