新聞中心

        EEPW首頁(yè) > 嵌入式系統(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 來(lái)源:網(wǎng)絡(luò) 收藏

        /*********************************************************************
        *名 稱:LCD_Init()
        *功 能:初始化LCD1602
        *入口參數(shù):無(wú)
        *出口參數(shù):無(wú)
        *常用命令:0x38:16*2顯示,5*&點(diǎn)陣顯示字符,8位數(shù)據(jù);指令執(zhí)行時(shí)間40us
        * 0x0C:開(kāi)顯示,關(guān)光標(biāo) 40us
        * 0x08:關(guān)顯示,關(guān)光標(biāo) 40us
        * 0x0D:字符閃爍,關(guān)光標(biāo),接著設(shè)定位置,閃爍周期0.4ms左右
        * 0x0F:字符閃爍,開(kāi)光標(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)
        {
        delay_nms(200); //延時(shí)20ms
        LCD_WriteInitcmd(0x38); //16*2顯示,5*7點(diǎn)陣,8位數(shù)據(jù)
        delay_nms(10);
        LCD_WriteInitcmd(0x38); //16*2顯示,5*7點(diǎn)陣,8位數(shù)據(jù)
        delay_nms(5);
        LCD_WriteInitcmd(0x38); //16*2顯示,5*7點(diǎn)陣,8位數(shù)據(jù)
        delay_nms(5);
        LCD_WriteInitcmd(0x08); //先關(guān)顯示,后開(kāi)顯示
        delay_nms(5);
        LCD_WriteInitcmd(0x06); //自動(dòng)右移光標(biāo),0x04為左移光標(biāo)
        delay_nms(5);
        LCD_WriteInitcmd(0x01); //清除LCD的顯示內(nèi)容
        delay_nms(6);
        LCD_WriteInitcmd(0x0c); //顯示開(kāi),關(guān)光標(biāo);0x08為關(guān)顯示
        delay_nms(5);
        }

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

        #endif //防止多次編譯

        /*************************************************************
        * LCD1602驅(qū)動(dòng)顯示實(shí)驗(yàn)
        *************************************************************/
        #include "stm32f10x.h"

        #include "LCD1602.h"


        #define PE00 (uint32_t *)0x40230180


        //時(shí)鐘配置函數(shù) 8MHz*9=72MHz
        void RCC_Configuration()
        {
        RCC_DeInit();
        RCC_HSEConfig(RCC_HSE_ON);//使能HSE
        if(RCC_WaitForHSEStartUp()==SUCCESS)
        {
        RCC_HCLKConfig(RCC_SYSCLK_Div1); //HCLK=SYSCLK
        RCC_PCLK2Config(RCC_HCLK_Div1);
        RCC_PCLK1Config(RCC_HCLK_Div2);
        RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);
        RCC_PLLCmd(ENABLE);
        while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET);
        RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
        while(RCC_GetSYSCLKSource()!=0x08);
        }
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC|
        RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE,ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
        }

        //延時(shí)n us
        void delay_nus(unsigned long n)
        {
        unsigned long j;
        while(n--)
        { j=8;
        while(j--);
        }
        }

        //延時(shí)n ms
        void delay_nms(unsigned long n)
        {
        while(n--)
        delay_nus(1100);
        }
        //GPIO配置函數(shù)
        void GPIO_Configuration(void)
        {
        GPIO_InitTypeDef GPIO_InitStructure;
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
        GPIO_Init(GPIOD, &GPIO_InitStructure); //PD口OD輸出
        GPIO_InitStructure.GPIO_Pin = (GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2);
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; //PE.0~2 OD輸出
        GPIO_Init(GPIOE, &GPIO_InitStructure);
        }
        ///////////////////////////////////////////
        int main()
        {
        //uint32_t i=0;
        char str[]={"happy!"};
        RCC_Configuration();
        GPIO_Configuration();
        LCD_Init();
        LCD_Setpos_DispString(1,3,str);
        LCD_DispFreq(123456);
        LCD_FlickerChar(2,3);
        LCD_FlickerScreen();
        LCD_FlickerScreen();
        LCD_FlickerScreen();
        delay_nms(2000);
        LCD_CloseFlicker();
        while(1)
        {
        };
        }

        LCD1602學(xué)習(xí)體會(huì)

        液晶顯示屏中,1602型算是比較簡(jiǎn)單的一種,據(jù)說(shuō)和12864還是全兼容的。這兩天學(xué)習(xí)的結(jié)果如下。

        一、1602里的存儲(chǔ)器有三種:CGROM、CGRAM、DDRAM。CGROM保存了廠家生產(chǎn)時(shí)固化在LCM中的點(diǎn)陣型顯示數(shù)據(jù),CGRAM是留給用戶自己定義點(diǎn)陣型顯示數(shù)據(jù)的,DDRAM則是和顯示屏的內(nèi)容對(duì)應(yīng)的。1602內(nèi)部的DDRAM有80字節(jié),而顯示屏上只有2行×16列,共32個(gè)字符,所以兩者不完全一一對(duì)應(yīng)。默認(rèn)情況下,顯示屏上第一行的內(nèi)容對(duì)應(yīng)DDRAM中80H到8FH的內(nèi)容,第二行的內(nèi)容對(duì)應(yīng)DDRAM中CH到CFH的內(nèi)容。DDRAM中90H到A7H、D0H到E7H的內(nèi)容是不顯示在顯示屏上的,但是在滾動(dòng)屏幕的情況下,這些內(nèi)容就可能被滾動(dòng)顯示出來(lái)了。注:這里列舉的DDRAM的地址準(zhǔn)確來(lái)說(shuō)應(yīng)該是DDRAM地址+80H之后的值,因?yàn)樵谙驍?shù)據(jù)總線寫數(shù)據(jù)的時(shí)候,命令字的最高位總是為1。

        二、1602使用三條控制線:EN、RW、RS。其中EN起到類似片選和時(shí)鐘線的作用,RW和RS指示了讀、寫的方向和內(nèi)容。在讀數(shù)據(jù)(或者Busy標(biāo)志)期間,EN線必須保持高電平;而在寫指令(或者數(shù)據(jù))過(guò)程中,EN線上必須送出一個(gè)正脈沖。RW、RS的組合一共有四種情況,分別對(duì)應(yīng)四種操作:

        RS=0、RW=0——表示向LCM寫入指令
        RS=0、RW=1——表示讀取Busy標(biāo)志
        RS=1、RW=0——表示向LCM寫入數(shù)據(jù)
        RS=1、RW=1——表示從LCM讀取數(shù)據(jù)

        三、LCD在使用的過(guò)程中,可以在RS=0、RW=0的情況下,向LCM寫入一個(gè)字節(jié)的控制指令。使用的控制指令一共八個(gè)類別。有的類別又有幾條不同的指令。具體的情況羅列在下:

        ①01H:清除DDRAM的所有單元,光標(biāo)被移動(dòng)到屏幕左上角。
        ②02H:DDRAM所有單元的內(nèi)容不變,光標(biāo)移至左上角。
        ③輸入方式設(shè)置(EnterModeSet),這些指令規(guī)定了兩個(gè)方面:一是寫入一個(gè)DDRAM單元后,地址指針如何改變(加一還是減一);二是屏幕上的內(nèi)容是否滾動(dòng)。
        04H:寫入DDRAM后,地址指針減一,比如第一個(gè)字符寫入8FH,則下一個(gè)字符會(huì)寫入8EH;屏幕上的內(nèi)容不滾動(dòng)。
        05H:寫入DDRAM后,地址指針減一,同上一種情況;每一個(gè)字符寫入以后,屏幕上的內(nèi)容向右滾動(dòng)一個(gè)字符位。
        06H:寫入DDRAM后,地址指針加一,比如第一個(gè)字符寫入80H,則下一個(gè)字符會(huì)寫入81H;屏幕上的內(nèi)容也是不滾動(dòng)。這應(yīng)該是最常用的一種顯示方式。
        07H:寫入DDRAM后,地址指針加一,同上一種情況;每一個(gè)字符寫入以后,屏幕上的內(nèi)容向左滾動(dòng)一個(gè)字符位。
        ④屏幕開(kāi)關(guān)、光標(biāo)開(kāi)關(guān)、閃爍開(kāi)關(guān)。
        08H、09H、0AH、0BH:關(guān)閉顯示屏,實(shí)質(zhì)上是不把DDRAM中的內(nèi)容對(duì)應(yīng)顯示在屏幕上,對(duì)DDRAM的操作還是在進(jìn)行的,執(zhí)行這條指令,接著對(duì)DDRAM進(jìn)行寫入,屏幕上沒(méi)有任何內(nèi)容,但是接著執(zhí)行下面的某條指令,就能看到剛才屏幕關(guān)閉期間,對(duì)DDRAM操作的效果了。
        0cH:打開(kāi)顯示屏,不顯示光標(biāo),光標(biāo)所在位置的字符不閃爍。
        0dH:打開(kāi)顯示屏,不顯示光標(biāo),光標(biāo)所在位置的字符閃爍。
        0eH:打開(kāi)顯示屏,顯示光標(biāo),光標(biāo)所在位置的字符不閃爍。
        0fH:打開(kāi)顯示屏,顯示光標(biāo),光標(biāo)所在位置的字符閃爍。
        關(guān)于光標(biāo)的位置:光標(biāo)所在的位置指示了下一個(gè)被寫入的字符所處的位置,加入在寫入下一個(gè)字符前沒(méi)有通過(guò)指令設(shè)置DDRAM的地址,那么這個(gè)字符就應(yīng)該顯示在光標(biāo)指定的地方。
        ⑤設(shè)置光標(biāo)移動(dòng)(本質(zhì)就是AC的增加還是減少)、整體畫面是否滾動(dòng)。
        10H:每輸入一次該指令,AC就減一,對(duì)應(yīng)了光標(biāo)向左移動(dòng)一格。整體的畫面不滾動(dòng)。
        14H:每輸入一次該指令,AC就加一,對(duì)應(yīng)了光標(biāo)向右移動(dòng)一格。整體的畫面不滾動(dòng)。
        18H:每輸入一次該指令,整體的畫面就向左滾動(dòng)一個(gè)字符位。
        1CH:每輸入一次該指令,整體的畫面就向右滾動(dòng)一個(gè)字符位。畫面在滾動(dòng)的時(shí)候,每行的首尾是連在一起的,也就是每行的第一個(gè)字符,若左移25次,就會(huì)顯示在該行的最后一格。在畫面滾動(dòng)的過(guò)程中,AC的值也是變化的。 ⑥顯示模式設(shè)定指令,設(shè)定了顯示幾行,顯示什么樣的點(diǎn)陣字符,數(shù)據(jù)總線占用幾位。
        20H:4位總線,單行顯示,顯示5×7的點(diǎn)陣字符。
        24H:4位總線,單行顯示,顯示5×10的點(diǎn)陣字符。
        28H:4位總線,雙行顯示,顯示5×7的點(diǎn)陣字符。
        2CH:4位總線,雙行顯示,顯示5×10的點(diǎn)陣字符。
        30H:8位總線,單行顯示,顯示5×7的點(diǎn)陣字符。
        34H:8位總線,單行顯示,顯示5×10的點(diǎn)陣字符。
        38H:8位總線,雙行顯示,顯示5×7的點(diǎn)陣字符。這是最常用的一種模式。3CH:8位總線,雙行顯示,顯示5×10的點(diǎn)陣字符。


        上一頁(yè) 1 2 3 4 下一頁(yè)

        評(píng)論


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

        關(guān)閉
        主站蜘蛛池模板: 唐海县| 定兴县| 江北区| 福安市| 平果县| 鲁山县| 阿坝| 酒泉市| 九龙坡区| 福州市| 罗甸县| 卓资县| 苏州市| 滁州市| 麻城市| 剑阁县| 惠来县| 南溪县| 襄樊市| 宁陵县| 宿迁市| 壶关县| 泾阳县| 衡东县| 丹江口市| 梁河县| 霞浦县| 台南市| 宜昌市| 拜泉县| 合作市| 新蔡县| 紫阳县| 宜黄县| 聂荣县| 石楼县| 老河口市| 新河县| 天等县| 涞水县| 盖州市|