在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

  • <dfn id="79stg"></dfn>
    <object id="79stg"><div id="79stg"><label id="79stg"></label></div></object>
    <ruby id="79stg"><dl id="79stg"><noscript id="79stg"></noscript></dl></ruby>

      新聞中心

      EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > PIC16F877驅(qū)動KS0066U液晶程序

      PIC16F877驅(qū)動KS0066U液晶程序

      作者: 時間:2016-11-09 來源:網(wǎng)絡(luò) 收藏
      為了電子設(shè)計(jì)大賽,我又要重新學(xué)習(xí)單片機(jī)了!

      現(xiàn)在來總結(jié)總結(jié)以前學(xué)習(xí)單片機(jī)的經(jīng)驗(yàn)和體會:

      本文引用地址:http://www.biyoush.com/article/201611/317652.htm

      1、單片機(jī)其實(shí)并不難,無非就是那幾個模塊,而真正難的是:一個外圍芯片(比如下面將要驅(qū)動的液晶芯片)的工作時序以及準(zhǔn)確的延時;然后利用單片機(jī)的資源去按照時序編程就得了,所以說了只要把一種單片機(jī)的常用模塊搞通了,其它也就一樣簡單,很容易就OK了!

      2、單片機(jī)編程的框架:模塊的初始化,然后死循環(huán)和中斷,很簡單吧!

      3、單片機(jī)編程應(yīng)該注意的問題,一是要按照說明書給出的時序來編程,不要自己想當(dāng)然了;二是要控制好延時,大部分單片機(jī)系統(tǒng)的不穩(wěn)定,有很多是因?yàn)檠訒r不到位引起的;而對PIC等單片機(jī)來說,還得注意使用時一定得注意單片機(jī)的端口的方向(輸入還是輸出)!

      本驅(qū)動采用4bit,2-line模式電路圖如下:

      液晶驅(qū)動程序頭文件

      #ifndef LCD_H
      #define LCD_H
      #include ”main.h“
      #define uchar unsigned char
      //define port function
      #defineLCD_DB7 RB5 //;//占用的I/O口定義
      #defineLCD_DB6 RB4 //;//該行硬件連接:LCD的DB6與RB4連接,其它類推
      #defineLCD_DB5 RB3 //;
      #defineLCD_DB4 RB2 //;
      #defineLCD_E RA3 //;
      #defineLCD_RS RB1 //;
      #defineLCD_DB7_DIRTRISB5 //;//對應(yīng)的方向寄存器定義
      #defineLCD_DB6_DIRTRISB4 //;
      #defineLCD_DB5_DIRTRISB3 //;
      #defineLCD_DB4_DIRTRISB2 //;
      #defineLCD_E_DIRTRISA3 //;
      #defineLCD_RS_DIRTRISB1 //;
      //define commad
      #define LCD_FUNC_MODE 0x28 //4bit 2-line 5*8dots
      #define LCD_CURSE_MODE0 0x0c //display :on ,curse :off,blink :offf
      #define LCD_CURSE_MODE1 0x0e //lcd display curse display
      #define LCD_CURSE_MODE2 0x0f //lcd display curse display curse blink
      #define LCD_CLR_DISP 0x01 //clear display
      #define LCD_BEGIN_ADD 0x80 //set begin address
      #define LCD_SHIFT_RIGHT_ALL 0x05 //shift entire display in rightt direction
      #define LCD_SHIFT_LEFT_ALL 0x07 //shirft left entire
      #define LCD_CURSE_RIGHT 0x14//curse shift right
      #define LCD_CURSE_LEFT 0x10 //curse shift left ;
      #define LCD_DISP_LEFT 0x18//shift display in left direction
      #define LCD_DISP_RIGHT 0x1C//shift display in right direction
      #define LCD_SECOND_LINE 0xc0 //change line

      void init_lcd() ;
      void write_in() ;
      void sendcmd(char cddata);
      void putclcd(char data) ;
      void printlcd(const char *data) ;
      void write(char data) ;
      void delay(unsigned int count) ;
      void lcd_shift(uchar flag,uchar count) ;
      void curse_shift(uchar flag,uchar count) ;
      void delay_long() ;
      #endif
      液晶驅(qū)動程序

      #include "lcd.h"
      void init_lcd()
      {
      //設(shè)置端口輸出模式
      LCD_DB7_DIR=0;
      LCD_DB6_DIR=0;
      LCD_DB5_DIR=0;
      LCD_DB4_DIR=0;
      LCD_E_DIR=0;
      LCD_RS_DIR=0;

      //清除數(shù)據(jù)線
      LCD_DB7=0;
      asm("nop");
      LCD_DB6=0;
      asm("nop");
      LCD_DB5=0;
      asm("nop");
      LCD_DB4=0;
      asm("nop");
      LCD_RS=0;
      asm("nop");

      LCD_E=0;
      asm("nop");
      //將上述命令設(shè)置生效
      write_in() ;
      delay(0xffff) ;
      delay(0xffff) ;
      //設(shè)置功能模式,4bit,2-line.5*8dots
      sendcmd(0x28) ;
      sendcmd(0x0c) ;//啟動顯示,光標(biāo)不顯示,光標(biāo)不閃爍
      sendcmd(0x80) ;//設(shè)置起始地址
      sendcmd(0x01) ;//清屏

      }
      /*********************8
      10us級延時
      ***********************/
      void delay(unsigned int count)
      {
      while(count)
      count-=1;
      }
      /*************************************
      使寫入生效
      ****************************************/
      void write_in()
      {
      asm("nop") ;
      LCD_E=1 ;
      asm("nop") ;
      LCD_E=0 ;
      asm("nop") ;
      }
      /***********************************
      發(fā)送指令
      *************************************/
      void sendcmd(char cmdata)
      {
      LCD_RS=0; //設(shè)置為送命令模式,與PUTCLCD僅相差此行
      write(cmdata); //寫入全字節(jié)
      //delay(255);
      }
      /********************************************
      顯示單個字符
      ********************************************/
      void putclcd(char lcdbyte)
      {
      LCD_RS=1;//設(shè)置為發(fā)送數(shù)據(jù)模式
      write(lcdbyte);
      // delay(255);
      }
      /**************************************
      *顯示字符串
      *************************************/
      void printlcd(const char *lcdata)
      {
      while((*lcdata)!=/0)
      {
      putclcd(*lcdata++);
      }
      }
      /**********************************************
      *寫入單個字節(jié)
      **********************************************/
      void write(char wdata)
      {
      char temp=wdata;
      LCD_DB7=0;
      LCD_DB6=0;
      LCD_DB5=0;
      LCD_DB4=0;
      if(temp&0X80)
      LCD_DB7=1;
      if(temp&0X40)
      LCD_DB6=1;
      if(temp&0X20)
      LCD_DB5=1;
      if(temp&0X10)
      LCD_DB4=1;
      write_in() ;

      temp=wdata<<4;
      LCD_DB7=0;
      LCD_DB6=0;
      LCD_DB5=0;
      LCD_DB4=0;
      if(temp&0X80)
      LCD_DB7=1;
      if(temp&0X40)
      LCD_DB6=1;
      if(temp&0X20)
      LCD_DB5=1;
      if(temp&0X10)
      LCD_DB4=1;
      write_in() ;
      delay(160);
      }

      /*************************************
      *功能:移動顯示:如果把延時改動一下可以改變顯示移動的速凍
      *輸入?yún)?shù):flag=0 shift left ;flag=1 shift right ;count :the bit og shift
      ******************************/
      void lcd_shift(uchar flag,uchar count)
      {
      uchar i ;
      if(flag==0)
      {
      for(i=0;i{
      //delay(0xfff) ;
      delay_long() ;
      sendcmd(LCD_DISP_LEFT) ;
      }
      }
      else
      {
      for(i=0;i{
      delay_long() ;
      sendcmd(LCD_DISP_RIGHT) ;
      }
      }
      }


      /*****************************
      *功能:光標(biāo)移動
      *輸入?yún)?shù):flag=0 shift left ;flag=1 shift right ;count :the bit og shift
      **************************/
      void curse_shift(uchar flag,uchar count)
      {
      uchar i ;
      if(flag==0)
      {
      for(i=0;i{
      //delay_long() ;
      sendcmd(LCD_CURSE_LEFT) ;
      }
      }
      else
      {
      for(i=0;i{
      //delay_long() ;
      sendcmd(LCD_CURSE_RIGHT) ;
      }
      }
      }
      void delay_long()
      {
      unsigned char i ;
      for(i=0;i<2;i++)
      delay(0x4ff1) ;
      }



      評論


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

      關(guān)閉