乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

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

       共同成長888 2015-07-19

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

       聲明:本文是在網(wǎng)友追夢(mèng)的程序基本上修改而來。程序移植性強(qiáng),可讀性強(qiáng),特此感謝追夢(mèng)同學(xué)。

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

      #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開始工作
      }
      /*********************************************************************
      *名    稱:LCD_Writedata()
      *功    能:寫一字節(jié)數(shù)據(jù)到LCD1602
      *入口參數(shù):dat:無符號(hào)字節(jié)類型,0~255  包括各個(gè)ASCII碼字符
      *出口參數(shù):無
      *********************************************************************/
      void LCD_Writedata(uchar dat) 
      {                         
      while(LCD_busy());//等待LCD1602空閑
      LCD_RS_1;
      delay_nus(1);
      LCD_RW_0;
      delay_nus(1);
      DATAOUT = dat;
      LCD_EN_1;  //先拉高
      delay_nus(300); //很重要的延時(shí),經(jīng)調(diào)試,延時(shí)300us以上才可以
      LCD_EN_0;       //下降沿,開始寫入有效數(shù)據(jù)
      }
      /*********************************************************************
      *名    稱:LCD_pos()
      *功    能:設(shè)定顯示位置
      *入口參數(shù):pos:顯示位置,值的范圍如下:
      *    0x00----------------0x0f 0x10-------0x27 第一行(一次顯示16個(gè)字符)
      *    0x40----------------0x4f 0x50-------0x67 第二行
      *出口參數(shù):無
      *********************************************************************/
      void LCD_pos(uchar pos)
      {                         
      LCD_Writecmd(pos | 0x80);
      }
      /*********************************************************************
      *名    稱:LCD_Setpos()
      *功    能:根據(jù)習(xí)慣設(shè)定顯示位置
      *入口參數(shù):row:行,row=1表示第一行,row=2表示第二行
      *          col:列,0~15,用于指定顯示的列,范圍可以是0~40
      *出口參數(shù):無
      *********************************************************************/
      void LCD_Setpos(uchar row,uchar col)
      {
      if(row==1) LCD_Writecmd(col | 0x80);
      else LCD_Writecmd(col | 0xC0);
      }
      /*********************************************************************
      *功  能:顯示一個(gè)字符   
      *入  口:ch:待顯示的字符
      *********************************************************************/
      void LCD_DispChar(char ch)
      {
      LCD_Writedata(ch);
      }
      /*********************************************************************
      *功  能:在指定位置顯示一個(gè)字符   
      *入  口:row:行 1或2        col:列,0~15
      *        ch:待顯示的字符
      *********************************************************************/
      void LCD_Setpos_DispChar(uchar row,uchar col,char ch)
      {
      LCD_Setpos(row,col);
      LCD_Writedata(ch);
      }
      /*********************************************************************
      *名    稱:LCD_DispString()
      *功    能:使LCD1602顯示一個(gè)字符串,顯示位置需提前設(shè)定
      *入口參數(shù):str[]:待顯示的字符串
      *出口參數(shù):無
      *********************************************************************/
      void LCD_DispString(char str[])
      {
          uchar i=0;
      while(str[i] != '\0')
      {
          LCD_Writedata(str[i]);
          ++i;
      }
      }
      /*********************************************************************
      *名    稱:LCD_Setpos_DispString()
      *功    能:使LCD1602從指定位置開始顯示一個(gè)字符串
      *入口參數(shù):row:顯示行,1或2
      *          col:顯示列,0~15 (0~40) 
      *          str[]:待顯示的字符串
      *出口參數(shù):無
      *說    明:指定位置是顯示的初始位置,第一個(gè)字符顯示的位置
      *********************************************************************/
      void LCD_Setpos_DispString(uchar row,uchar col,char str[])
      {
      LCD_Setpos(row,col);
      LCD_DispString(str);
      }
      /*********************************************************************
      *名    稱:LCD_Dispnum()
      *功    能:顯示一個(gè)不超過8位的整數(shù),顯示位置需提前設(shè)置
      *入口參數(shù):num:待顯示的整數(shù),不超過8位
      *出口參數(shù):無
      *********************************************************************/
      void LCD_Dispnum(uint32_t num)
      {
         uint i=0,j,k=0,wei,q;
         char str[9];
         if(num>=10000000)wei=8;
         else if(num>=1000000)wei=7;
         else if(num>=100000)wei=6;
         else if(num>=10000)wei=5;
         else if(num>=1000) wei=4;
         else if(num>=100)wei=3;
         else if(num>=10) wei=2;
         else wei=1;
         for(i=wei;i>0;i--)
         {   q=1;
             j=1; //i=1時(shí),q=1,得到個(gè)位
          for(;j    str[k++]=num/q +'0';
          num %= q;
         }
         str[k] = '\0'; //添加字符串結(jié)束標(biāo)志
         LCD_DispString(str);//顯示字符串
      }
      /*********************************************************************
      *名    稱:LCD_Setpos_Dispnum()
      *功    能:在指定位置顯示一個(gè)不超過8位的整數(shù)
      *入口參數(shù):num:待顯示的整數(shù),不超過8位
      *出口參數(shù):無
      *********************************************************************/
      void LCD_Setpos_Dispnum(uchar row,uchar col,uint32_t num)
      {
         LCD_Setpos(row,col); 
         LCD_Dispnum(num);
      }
      /*********************************************************************
      *名    稱:LCD_DispDecimal()
      *功    能:顯示一個(gè)有效位不超過8位的浮點(diǎn)數(shù),顯示位置需要提前設(shè)定
      *入口參數(shù):num:待顯示的浮點(diǎn)數(shù)放大后得到的整數(shù),不超過8位
      *          dot:小數(shù)點(diǎn)的位數(shù)
      *出口參數(shù):無
      *********************************************************************/
      void LCD_DispDecimal(uint32_t num,uchar dot)
      {
         uint i=0,j,k=0,wei,q;
         char str[10];
         if(num>=10000000)wei=8;
         else if(num>=1000000)wei=7;
         else if(num>=100000)wei=6;
         else if(num>=10000)wei=5;
         else if(num>=1000) wei=4;
         else if(num>=100)wei=3;
         else if(num>=10) wei=2;
         else wei=1;
         for(i=wei;i>0;i--)
         {   q=1;
             j=1; //i=1時(shí),q=1,得到個(gè)位
          for(;j    str[k++]=num/q +'0';
          num %= q;
         }
         str[k] = '\0'; //添加字符串結(jié)束標(biāo)志
         for(i=8;i>0;i--)
         {   if((str[i]>='0')&&(str[i]<='9')) break;
         }
         str[i+2]='\0';   //添加字符串結(jié)束符
         for(j=0;j   {
           str[i+1]=str[i];
         }
         str[i+1]='.';       //插入小數(shù)點(diǎn)
         LCD_DispString(str);//顯示浮點(diǎn)小數(shù)
      }
      /*********************************************************************
      *名    稱:LCD_Setpos_DispDecimal()
      *功    能:在指定位置顯示一個(gè)有效位不超過8位的浮點(diǎn)數(shù)
      *入口參數(shù):row:待顯示的行 1,2
      *          col:待顯示的列 0~15
      *          num:待顯示的浮點(diǎn)數(shù)放大10的整數(shù)倍后得到的整數(shù),不超過8位
      *          dot:小數(shù)點(diǎn)的位數(shù)
      *出口參數(shù):無
      *********************************************************************/
      void LCD_Setpos_DispDecimal(uchar row,uchar col,uint32_t num,uchar dot)
      {
        LCD_Setpos(row,col);
        LCD_DispDecimal(num,dot);
      }
      /*********************************************************************
      *名    稱:LCD_DispDateTime()
      *功    能:顯示日歷,顯示日期與時(shí)間
      *入口參數(shù):year:年,可以是任意值
      *          month:月,1~12
      *          day:日,1~31
      *          hour:時(shí),1~24 或  1~12
      *          min:分,0~59
      *          sec:秒,0~59
      *出口參數(shù):無
      *說    明:使用前必須先宏定義USE_LCD_DISP_DATE,在包含文件之前定義有效
      *顯示格式:Date:yyyy-mm-dd  *
      *          Time:hh:mm:ss    *
      *********************************************************************/
      void LCD_DispDateTime(uint32_t year,uchar month,uchar day,uchar hour,uchar min,uchar sec)
      {
      LCD_Setpos(1,0);
      LCD_DispString("Date:");
      LCD_Dispnum((uint32_t)year);
      LCD_DispChar('-');
      LCD_Dispnum((uint32_t)month);
      LCD_DispChar('-');
      LCD_Dispnum((uint32_t)day);
      LCD_Setpos(1,15);
      LCD_DispChar('*'); //第一行結(jié)束符顯示
      LCD_Setpos(2,0);
      LCD_DispString("Time:");
      LCD_Dispnum((uint32_t)hour);
      LCD_DispChar(':');
      LCD_Dispnum((uint32_t)min);
      LCD_DispChar(':');
      LCD_Dispnum((uint32_t)sec);
      LCD_Setpos(2,15);
      LCD_DispChar('*'); //第二行結(jié)束符顯示
      }
      /*********************************************************************
      *名    稱:LCD_DispStopWatch()
      *功    能:顯示秒表,顯示時(shí),分,秒,10毫秒,精確到10ms
      *入口參數(shù):hour:時(shí),1~24 或  1~12
      *          min:分,0~59
      *          sec:秒,0~59
      *          tenms:10ms計(jì)數(shù)值,如3表示30ms
      *出口參數(shù):無
      *顯示格式:Current Time:   *
      *            hh:mm:ss:tt   *
      *********************************************************************/
      void LCD_DispStopWatch(uchar hour,uchar min,uchar sec,uchar tenms)
      {
      LCD_Setpos(1,0);
      LCD_DispString("Current Time:");
      LCD_Setpos(1,15);
      LCD_DispChar('*'); //第一行結(jié)束符顯示
      LCD_Setpos(2,2);
      LCD_Dispnum((uint32_t)hour);
      LCD_DispChar(':');
      LCD_Dispnum((uint32_t)min);
      LCD_DispChar(':');
      LCD_Dispnum((uint32_t)sec);
      LCD_DispChar(':');
      LCD_Dispnum((uint32_t)tenms);
      LCD_Setpos(2,15);
      LCD_DispChar('*'); //第二行結(jié)束符顯示
      }
      /*********************************************************************
      *名    稱:LCD_DispFreq()
      *功    能:顯示頻率計(jì),動(dòng)態(tài)自動(dòng)調(diào)整頻率顯示
      *入口參數(shù):freq:可以顯示8位整數(shù)表示的頻率值,頻率范圍1Hz~99MHz
      *出口參數(shù):無
      *說    明:入口的頻率值單位是Hz,顯示函數(shù)自動(dòng)選擇合適的顯示方式
      *          freq>=1000000顯示成6位小數(shù)的MHz
      *    else  freq>=1000   顯示成3位小數(shù)的KHz
      *    else  freq>=0      默認(rèn)顯示單位是Hz  (三個(gè)區(qū)間互斥)
      *********************************************************************/
      void LCD_DispFreq(uint32_t freq)
      {
      LCD_Setpos(1,0);
      LCD_DispString("Current Freq:");
      LCD_Setpos(2,1); //顯示位置
      if(freq>=1000000)
      {
        LCD_DispDecimal(freq,6);
        LCD_DispString("MHz");
      }
      else if(freq>=1000) 

        LCD_DispDecimal(freq,3);
        LCD_DispString("KHz");
      }
      else { LCD_Dispnum(freq);
           LCD_DispString("Hz");
      }
      LCD_Setpos(2,14);
      LCD_DispString("OK");
      }
      //屏幕整體左移一格,用于滾動(dòng)顯示
      void LCD_ShiftLeft()
      {
      LCD_Writecmd(0x18);
      }
      //屏幕整體右移一格,用于滾動(dòng)顯示
      void LCD_ShiftRight(void)
      {
      LCD_Writecmd(0x1C);
      }
      //清屏,清除顯示
      void LCD_Clear(void)
      {
      LCD_Writecmd(0x01);
      }
      //使光標(biāo)還回原點(diǎn)位置
      void LCD_Return(void)
      {
      LCD_Writecmd(0x02);
      }
      //關(guān)顯示
      void LCD_Close(void)
      {
      LCD_Writecmd(0x08);
      }
      //開顯示
      void LCD_Open(void)
      {
      LCD_Writecmd(0x0C);
      }
      /*********************************************************************
      *名    稱:LCD_FlickerChar()
      *功    能:使指定位置字符閃爍,不顯示光標(biāo)
      *入口參數(shù):row:行 1,2  
      *          col:列 0~15
      *出口參數(shù):無
      *說    明:寫命令0x0D不顯示光標(biāo)的閃爍,寫命令0x0F是顯示光標(biāo)的閃爍
      *          一旦設(shè)定閃爍后,會(huì)根據(jù)位置變化閃爍,關(guān)閃爍寫命令0x0C
      *********************************************************************/
      void LCD_FlickerChar(uchar row,uchar col)
      {
      LCD_Writecmd(0x0D);
      LCD_Setpos(row,col);
      }
      //關(guān)閉字符閃爍
      void LCD_CloseFlicker(void)
      {
      LCD_Writecmd(0x0C);
      }
      //屏幕秒閃爍一次
      void LCD_FlickerScreen(void)
      {
      LCD_Writecmd(0x08);//關(guān)顯示
      delay_nms(500);
      LCD_Writecmd(0x0C);//開顯示
      delay_nms(500);
      }
      /*********************************************************************
      *名    稱: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)
      {   
          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)顯示,后開顯示
      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);  //顯示開,關(guān)光標(biāo);0x08為關(guān)顯示
      delay_nms(5);
      }

      #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ù)說和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)顯示出來了。注:這里列舉的DDRAM的地址準(zhǔn)確來說應(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ù))過程中,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在使用的過程中,可以在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è)字符位。
      ④屏幕開關(guān)、光標(biāo)開關(guān)、閃爍開關(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)行寫入,屏幕上沒有任何內(nèi)容,但是接著執(zhí)行下面的某條指令,就能看到剛才屏幕關(guān)閉期間,對(duì)DDRAM操作的效果了。
      0cH:打開顯示屏,不顯示光標(biāo),光標(biāo)所在位置的字符不閃爍。
      0dH:打開顯示屏,不顯示光標(biāo),光標(biāo)所在位置的字符閃爍。
      0eH:打開顯示屏,顯示光標(biāo),光標(biāo)所在位置的字符不閃爍。
      0fH:打開顯示屏,顯示光標(biāo),光標(biāo)所在位置的字符閃爍。
      關(guān)于光標(biāo)的位置:光標(biāo)所在的位置指示了下一個(gè)被寫入的字符所處的位置,加入在寫入下一個(gè)字符前沒有通過指令設(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)的過程中,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)陣字符。


        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多