新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > LCD1602驅(qū)動(dòng)顯示實(shí)驗(yàn)STM32

        LCD1602驅(qū)動(dòng)顯示實(shí)驗(yàn)STM32

        作者: 時(shí)間:2016-12-01 來源:網(wǎng)絡(luò) 收藏
        聲明:本文是在網(wǎng)友追夢(mèng)的程序基本上修改而來。程序移植性強(qiáng),可讀性強(qiáng),特此感謝追夢(mèng)同學(xué)。

        /**************************************************************************
        **文件名稱:LCD1602.h for STM32
        **************************************************************************/
        #ifndef LCD1602_STM32_H
        #define LCD1602_STM32_H

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

        #define LCD_RS_1 GPIOE->BSRR=GPIO_Pin_0 //PE.0--(LCD)RS
        #define LCD_RS_0 GPIOE->BRR =GPIO_Pin_0
        #define LCD_RW_1 GPIOE->BSRR=GPIO_Pin_1 //PE.1--(LCD)RW
        #define LCD_RW_0 GPIOE->BRR =GPIO_Pin_1
        #define LCD_EN_1 GPIOE->BSRR=GPIO_Pin_2 //PE.2--(LCD)E
        #define LCD_EN_0 GPIOE->BRR =GPIO_Pin_2
        #define DATAOUT GPIOD->ODR //PD[0..7]--(LCD)D0~D7

        #ifndef uchar
        #define uchar unsigned char
        #endif
        #ifndef uint
        #define uint unsigned int
        #endif

        extern void delay_nms(unsigned long n);
        extern void delay_nus(unsigned long n);

        uint8_t LCD_busy(void); //讀LCD忙碌狀態(tài),直到LCD1602不忙為止
        void Wait_Leisure(void);//一直等待到LCD1602空閑
        void LCD_WriteInitcmd(uchar cmd);//寫入LCD初始化時(shí)的命令,不可以檢測(cè)忙狀態(tài)
        void LCD_Writecmd(uchar cmd);//寫指令到LCD1602,指令數(shù)據(jù)占一個(gè)字節(jié)
        void LCD_Writedata(uchar dat);//寫一字節(jié)數(shù)據(jù)到LCD1602
        void LCD_pos(uchar pos);//設(shè)定顯示位置 00h~27h,40h~47h
        void LCD_Setpos(uchar row,uchar col);//根據(jù)習(xí)慣設(shè)定顯示位置
        void LCD_DispChar(char ch);//顯示一個(gè)字符
        void LCD_Setpos_DispChar(uchar row,uchar col,char ch);//在指定位置顯示一個(gè)字符
        void LCD_DispString(char str[]);//使LCD1602顯示一個(gè)字符串,顯示位置需提前設(shè)定
        void LCD_Setpos_DispString(uchar row,uchar col,char str[]);//使LCD1602從指定位置開始顯示一個(gè)字符串
        void LCD_Dispnum(uint32_t num);//顯示一個(gè)不超過8位的整數(shù),顯示位置需提前設(shè)置
        void LCD_Setpos_Dispnum(uchar row,uchar col,uint32_t num);//在指定位置顯示一個(gè)不超過8位的整數(shù)
        void LCD_DispDecimal(uint32_t num,uchar dot);//顯示一個(gè)有效位不超過8位的浮點(diǎn)數(shù),顯示位置需要提前設(shè)定
        //在指定位置顯示一個(gè)有效位不超過8位的浮點(diǎn)數(shù)
        void LCD_Setpos_DispDecimal(uchar row,uchar col,uint32_t num,uchar dot);
        //顯示日歷,顯示日期與時(shí)間
        void LCD_DispDateTime(uint32_t year,uchar month,uchar day,uchar hour,uchar min,uchar sec);
        //顯示秒表,顯示時(shí),分,秒,10毫秒,精確到10ms
        void LCD_DispStopWatch(uchar hour,uchar min,uchar sec,uchar tenms);
        //顯示頻率計(jì),動(dòng)態(tài)自動(dòng)調(diào)整頻率顯示
        void LCD_DispFreq(uint32_t freq);
        void LCD_ShiftLeft(void);//屏幕整體左移一格,用于滾動(dòng)顯示
        void LCD_ShiftRight(void);//屏幕整體右移一格,用于滾動(dòng)顯示
        void LCD_Clear(void);//清屏,清除顯示
        void LCD_Return(void);//使光標(biāo)還回原點(diǎn)位置
        void LCD_Close(void);//關(guān)顯示
        void LCD_Open(void);//開顯示
        void LCD_FlickerChar(uchar row,uchar col);//使指定位置字符閃爍,不顯示光標(biāo)
        void LCD_CloseFlicker(void);//關(guān)閉字符閃爍
        void LCD_FlickerScreen(void);//屏幕秒閃爍一次
        /*********************************************************************
        *名 稱:LCD_Init()
        *功 能:初始化LCD1602
        *入口參數(shù):無
        *出口參數(shù):無
        *常用命令:0x38:16*2顯示,5*&點(diǎn)陣顯示字符,8位數(shù)據(jù);指令執(zhí)行時(shí)間40us
        * 0x0C:開顯示,關(guān)光標(biāo) 40us
        * 0x08:關(guān)顯示,關(guān)光標(biāo) 40us
        * 0x0D:字符閃爍,關(guān)光標(biāo),接著設(shè)定位置,閃爍周期0.4ms左右
        * 0x0F:字符閃爍,開光標(biāo)
        * 0x06:寫完數(shù)據(jù)自動(dòng)右移光標(biāo),普通情形,從左向右顯示 40us
        * 0x04:寫完數(shù)據(jù)自動(dòng)左移光標(biāo),可以從右向左顯示 40us
        * 0x01:清除顯示內(nèi)容,即清屏 1.64ms
        * 0x02:使光標(biāo)還回起始位置 1.64ms
        * 0x18:屏幕上所有字符同時(shí)左移一格,適合滾動(dòng)顯示 40us
        * 0x1C:屏幕上所有字符同時(shí)右移一格,適合滾動(dòng)顯示 40us
        *********************************************************************/
        void LCD_Init(void);

        #endif

        /*********************************************************************
        * 文件名稱:LCD1602.C
        * 功能:為51單片機(jī)提供LCD1602驅(qū)動(dòng)程序,解決LCD1602與上層軟件的隔離問題
        *********************************************************************/
        #include "stm32f10x.h"
        #include "LCD1602.h"
        #ifndef LCD1602_STM32_C
        #define LCD1602_STM32_C

        /*********************************************************************
        *名 稱:LCD_busy()
        *功 能:讀LCD忙碌狀態(tài),直到LCD1602不忙為止
        *入口參數(shù):無
        *出口參數(shù):無符號(hào)字節(jié)類型,返回0表示LCD已經(jīng)操作完畢,空閑。
        *說 明:一般在寫入新命令或數(shù)據(jù)之前用while(LCD_busy())語句等待LCD就緒
        *********************************************************************/
        uint8_t LCD_busy(void)
        {
        LCD_RS_0;
        delay_nus(1);
        LCD_RW_1;
        delay_nus(1);
        do
        {
        LCD_EN_0;
        delay_nus(200);
        LCD_EN_1;
        delay_nus(200);
        }
        while(GPIOD->IDR & 0x80);
        LCD_EN_0;
        return (uint8_t)0;
        }
        /*********************************************************************
        *功 能:一直等待到LCD1602空閑
        *********************************************************************/
        void Wait_Leisure(void)
        {
        LCD_busy();
        }
        /*********************************************************************
        *功 能:寫入LCD初始化時(shí)的命令,不可以檢測(cè)忙狀態(tài)
        *********************************************************************/
        void LCD_WriteInitcmd(uchar cmd)
        {
        LCD_RS_0;
        delay_nus(1);
        LCD_RW_0;
        delay_nus(1);
        DATAOUT = cmd;
        LCD_EN_0;
        delay_nus(300);
        LCD_EN_1;
        delay_nus(300);
        LCD_EN_0;
        delay_nms(2);
        }
        /*********************************************************************
        *名 稱:LCD_Writecmd()
        *功 能:寫指令到LCD1602,指令數(shù)據(jù)占一個(gè)字節(jié)
        *入口參數(shù):cmd:待寫入的指令
        *出口參數(shù):無
        *********************************************************************/
        void LCD_Writecmd(uchar cmd)
        {
        while(LCD_busy());
        LCD_RS_0; //對(duì)同一個(gè)寄存器的兩次寫入,中間延時(shí)一會(huì)
        delay_nus(1);
        LCD_RW_0;
        delay_nus(1);
        LCD_EN_0;
        delay_nus(300);//產(chǎn)生脈沖
        DATAOUT = cmd;
        LCD_EN_1;
        delay_nus(300);//必要的延時(shí)
        LCD_EN_0; //下降沿,LCD1602開始工作
        }


        上一頁 1 2 3 4 下一頁

        評(píng)論


        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 邢台县| 明溪县| 崇明县| 长宁区| 内江市| 武城县| 石河子市| 轮台县| 兴海县| 长宁区| 敖汉旗| 驻马店市| 余江县| 商洛市| 龙胜| 宁河县| 诸城市| 阳西县| 山阳县| 丰顺县| 麻栗坡县| 喀喇沁旗| 大余县| 鹤岗市| 体育| 隆林| 什邡市| 安丘市| 盘锦市| 井陉县| 西畴县| 济阳县| 巴林右旗| 海伦市| 子洲县| 武陟县| 兴安盟| 郧西县| 崇信县| 桦南县| 临颍县|