<noscript id="iwesy"><optgroup id="iwesy"></optgroup></noscript>
<ul id="iwesy"><pre id="iwesy"></pre></ul>
<samp id="iwesy"><tbody id="iwesy"></tbody></samp>
    • <samp id="iwesy"><pre id="iwesy"></pre></samp>
    • 人妻大战黑人白浆狂泄,一区二区日韩国产精久久,日本不卡一区二区三区,久久亚洲日本免费高清一区,精品国产一区二区三区香蕉 ,日韩视频一区二区三区视频 ,69久久国产露脸精品国产,日本伦理在线一区二区
      文章詳情

      ST7920反白程序

      日期:2025-12-18 14:21
      瀏覽次數:2444
      摘要:

      ST7920反白程序

      /*ST7920驅動的12864液晶,3線模式,帶任意位置漢字反白程序AVR單片機
       //ST7920驅動的帶字庫的液晶雖然有反白指令,但是不能單行反白,單字反白,它只能1、3兩行或2、4兩行同時
      //反白。本程序克服了這個缺點,可以設置任意位置的文字反白與取消反白。希望對有需要的朋友有用*/

      /***********************************************************************
      工    程:ST7920驅動的12864液晶的3線串行驅動模式    
      引腳定義:RS(CS)=====>PB5
          RW(SID)====>PB6
                EN(SCLK)===>PB7
          PSB為硬件控制,接高電平為8位或4位的并行模式,接低電平為串行模式
          本例程使用3線串行模式
      ************************************************************************/
      #include <iom128v.h>
      #include <macros.h>

      #define uchar unsigned char
      #define uint unsigned int
      #define nop()  NOP()
      #define xtal 8
      #define CS  PB5
      #define SID  PB6
      #define SCLK PB7

      #define Set_CS() DDRB |= (1<<CS);PORTB |= (1<<CS)
      #define Set_SID() DDRB |= (1<<SID);PORTB |= (1<<SID)
      #define Set_SCLK() DDRB |= (1<<SCLK);PORTB |= (1<<SCLK)

      #define Clr_CS() DDRB |= (1<<CS);PORTB &=~(1<<CS)
      #define Clr_SID() DDRB |= (1<<SID);PORTB &=~(1<<SID)
      #define Clr_SCLK() DDRB |= (1<<SCLK);PORTB &=~(1<<SCLK)


       
      //====================================================================
      //函數聲明
      void Delay(uint ms);      //延時子程序
      void W_1byte(uchar RW, uchar RS, uchar W_data);
      void Write_8bits(uint W_bits);
      void LCD_Init(void);
      void Char_Set_XY(uchar x, uchar y, uchar *p);
      void Set_Draw(void);
      //設定哪一行,從那一個位置開始到那一個位置結束使用反白
      //x=液晶屏上漢字的位置(1~8);end_x=漢字結束的地址(1~8);y=1~4行
      //clear=1:**反白;clear=0:設置反白;
      void Set_White(uchar x,uchar y,uchar end_x,uchar clear);  
      void Draw_Pic(uchar x, uchar y, const uchar *Draw);
      /********************************************************************/

      void main()
      {
       uchar i = 0;
       PORTB = 0XFF;   //
       DDRB = 0XFF;   //PB口全部設為輸出模式
       Clr_CS();
       Clr_SID();
       Clr_SCLK();
       LCD_Init();
       Delay(50);
       LCD_Init();     //初始化兩邊是關鍵,否則液晶上電重起將不能顯示
       while(1)
       {
        nop();
        nop();
        Delay(500);
        Char_Set_XY(0,0,"ST7920_3_wires");
        Char_Set_XY(2,1,"反白練習");
        Char_Set_XY(0,2,"可以單字反白或不");
        Char_Set_XY(3,3,"反白");
        Delay(2000);
        Delay(2000);
        Set_Draw();
        Delay(100);
        Set_White(1,1,7,0);   //第1行,第1個漢字位置到第8漢字位置反白
        Set_White(3,2,6,0);   //第2行,第3個漢字位置到第6漢字位置反白
        Set_White(1,3,8,0);   //第3行,第1個漢字位置到第8漢字位置反白
        Set_White(4,4,5,0);   //第4行,第4個漢字位置到第5漢字位置反白
        Delay(2000);
        Delay(2000);
        Set_White(4,1,4,1);   //第1行,第4個漢字位置等取消反白
        Set_White(5,2,5,1);   //第2行,第5個漢字位置等取消反白
        Set_White(6,3,6,1);   //第3行,第6個漢字位置等取消反白
        Set_White(4,4,4,1);   //第4行,第4個漢字位置等取消反白
        Delay(2000);
        Delay(2000);
        Set_White(1,1,1,1);   //
        Set_White(3,2,3,1);   //
        Set_White(2,3,2,1);   //
        Set_White(5,4,5,1);   //
        Delay(2000);
        Delay(2000);
        Set_White(1,1,8,1);   //第1行,第1個漢字位置到第8漢字位置取消反白
        Set_White(1,2,8,1);   //第2行,第1個漢字位置到第8漢字位置取消反白
        Set_White(1,3,8,1);   //第3行,第1個漢字位置到第8漢字位置取消反白
        Set_White(1,4,8,1);   //第4行,第1個漢字位置到第8漢字位置取消反白
       
        Delay(2000);
        Delay(2000);
         
       }
      }
      /******************************************************************/
      void LCD_Init(void)
      {
        uchar cmd;
        cmd=0x30;   //功能設置 8位數據,基本指令
       W_1byte(0,0,cmd);
       Delay(2);
       cmd=0x0C;   //顯示狀態 ON,游標OFF,反白OFF
       W_1byte(0,0,cmd); //寫指令
       Delay(2);
       cmd=0x01;   //**顯示
       W_1byte(0,0,cmd); //寫指令
       Delay(2);
       cmd=0x02;   //地址歸位
       W_1byte(0,0,cmd); //寫指令
       Delay(2);
       cmd=0x80;   //設置DDRAM地址
       W_1byte(0,0,cmd); //寫指令
       Delay(2);   //延時
      }
      /*******************************************************************
      函 數 名:W_1byte
      入口參數:RW、RS、W_data
      出口參數:無
      建立日期:2007年3月3日
      修改日期:
      函數作用:寫一個字節的數據到12864液晶,包括指令和數據
      說    明:RW=1,從液晶讀數據到MCU;RW=0,寫一個數據到液晶;
         (一般RW都設為0,即只向液晶寫數據,不讀數據)
                RS=1,寫入的是數據;RS=0,寫入的是指令;
          一般模式:RW=0,RS=1;寫數據
             RW=0,RS=0;寫指令
      ********************************************************************/
      void W_1byte(uchar RW, uchar RS, uchar W_data)
      {
       uint H_data,L_data,S_ID = 0xf8;  //11111RWRS0
       if(RW == 0)
       {
         S_ID &=~ 0x04;
       }
       else     //if(RW==1)
       {
         S_ID |= 0X04;
       }
       if(RS == 0)
       {
         S_ID &=~ 0x02;
       }
       else     //if(RS==1)
       {
         S_ID |= 0X02;
       }
       H_data = W_data;
       H_data &= 0xf0;   //屏蔽低4位的數據
       L_data = W_data;     //xxxx0000格式
       L_data &= 0x0f;   //屏蔽高4位的數據
       L_data <<= 4;   //xxxx0000格式
       Set_CS();
       Write_8bits(S_ID);   //發送S_ID
       Write_8bits(H_data); //發送H_data
       Write_8bits(L_data); //發送L_data
       Clr_CS();
      }
      /********************************************************************
      函 數 名:Write_8bits
      入口參數:W_bits
      出口參數:無
      建立日期:2007年3月3日
      修改日期:
      函數作用:負責串行輸出8個bit位
      說    明:
      ********************************************************************/
      void Write_8bits(uint W_bits)
      {
       uint i,Temp_data;
       for(i=0; i<8; i++)
       {
        Temp_data = W_bits;
        Temp_data <<= i;
        if((Temp_data&0x80)==0)
        {
          Clr_SID();
        }
        else
        {
          Set_SID();
        }
        nop();
        Set_SCLK();
        nop();
        nop();
        Clr_SCLK();
        nop();
        Clr_SID();
       }
      }
      /********************************************************************
      函 數 名:Delay
      入口參數:ms
      出口參數:無
      建立日期:2007年3月3日
      修改日期:
      函數作用:毫秒級的延時程序,當晶振為12Mhz時,xtal=12;
      說    明:
      ********************************************************************/
      void Delay(uint ms)
      {
          uint i;
          while(ms--)   
         {
           for(i=1;i<(uint)(xtal*143-2);i++)
               ;
         }  
      }
      //===================================================================*/
      /********************************************************************
      函 數 名:Char_Set_XY
      入口參數:x,y,*p
      出口參數:無
      建立日期:2007年8月26日
      修改日期:
      函數作用:
      說    明:
      ********************************************************************/
      void Char_Set_XY(uchar x, uchar y, uchar *p)
      {
           if(y == 0)
       {
         W_1byte(0,0,(0x80+x));
       }
       if(y == 1)
       {
        W_1byte(0,0,(0x90+x));
       }
       if(y == 2)
       {
        W_1byte(0,0,(0x88+x));
       }
       if(y == 3)
       {
        W_1byte(0,0,(0x98+x));
       }
       while(*p != 0)
       {
        W_1byte(0,1,*p++);
       }
      }
      //===================================================================*/

      /********************************************************************
      函 數 名:Set_Draw(
      入口參數:無
      出口參數:無
      建立日期:2007年8月26日
      修改日期:
      函數作用:
      說    明:
      ********************************************************************/
      void Set_Draw(void)
      {
       //W_1byte(0,0,0x01);   //清屏
       Delay(20);     //延時
       //W_1byte(0,0,0x34);   //8BIT控制界面,擴充指令集,,繪圖顯示OFF
       W_1byte(0,0,0x36);
       Delay(20);     //延時
      }
      //===================================================================*/
      /********************************************************************
      函 數 名:Draw_Pic  128*64
      入口參數:x,y,*Draw
      出口參數:無
      建立日期:2007年8月26日
      修改日期:
      函數作用:
      說    明:
      ********************************************************************/
      /*************************************************/

      void Draw_Pic(uchar x, uchar y, const uchar *Draw)
      {
       uchar i, j, temp_x, temp_y;  //
       temp_x = x;      //
       temp_y = y;      //
       temp_x |= 0x80;     //
       temp_y |= 0x80;     //
       for(i=0;i<32;i++ )    //上半屏32行
       {
        W_1byte(0,0,temp_y++);  //設置繪圖區的Y地址坐標0
        W_1byte(0,0,temp_x);  //設置繪圖區的X地址坐標0
        for(j=0;j<16;j++)   //
        {
          W_1byte(0,1,*Draw++); //
        }
       }
       
       temp_x = 0x88;     //
       temp_y = 0x80;     //
       j = 0;         //
       for(;i<64;i++ )
       {
        W_1byte(0,0,temp_y++);  //設置繪圖區的Y地址坐標
        W_1byte(0,0,temp_x);   //設置繪圖區的X地址坐標
        for(j=0;j<16;j++)
        {
          W_1byte(0,1,*Draw++); //
        }
       }
        
      }
      /**************************************************/
      /**************************************************/
      void Set_White(uchar x,uchar y,uchar end_x,uchar clear)
      {
        uchar i, j, white_x, white_y,white_end_x,clr_x,clr_y;  //
       white_end_x = (end_x-x+1);
       white_end_x <<= 1;
       if(y==1)
       {
         white_x = (0x80+x-1);
        white_y = 0x80;
        clr_x = 0x80;
        clr_y = 0x80;
       }
       else if(y==2)
       {
         white_x = (0x80+x-1);
        white_y = 0x90;
        clr_x = 0x80;
        clr_y = 0x90;
       }
       else if(y==3)
       {
         white_x = (0x88+x-1);
        white_y = 0x80;
        clr_x = 0x88;
        clr_y = 0x80;
       }
       else if(y==4)
       {
         white_x = (0x88+x-1);
        white_y = 0x90;
        clr_x = 0x88;
        clr_y = 0x90;
       }
       if(clear==0)//要反白時,先將整行的液晶全部清成不反白(此處行指y)
       {
         for(i=0;i<16;i++ )   //16行
        {
          W_1byte(0,0,clr_y++); //設置繪圖區的Y地址坐標0
         W_1byte(0,0,clr_x);  //設置繪圖區的X地址坐標0
         for(j=0;j<16;j++)  //
         {
           W_1byte(0,1,0x00); //清成不反白
           nop();
         }
        }
       }
       nop();
       for(i=0;i<16;i++ )    //16行,因為是16*16漢字
       {
        W_1byte(0,0,white_y++);  //設置繪圖區的Y地址坐標0
        W_1byte(0,0,white_x);  //設置繪圖區的X地址坐標0
        for(j=0;j<white_end_x;j++) //
        {
          if(clear==1)
          {
            W_1byte(0,1,0x00); //取消這一行的8個點的反白,液晶地址自動加1
                 //(此處行指一個一個液晶點所組成的行)
          }
          else
          {
          W_1byte(0,1,0xff); //反白這一行的8個點,液晶地址自動加1
                 //(此處行指一個一個液晶點所組成的行)
          }
          nop();
        }
       }
      }
      /*************************************************/
       

      主站蜘蛛池模板: 国产精品视频免费的| 国模偷拍视频一区二区| WWW拍拍拍| 台湾佬中文偷拍亚洲综合| 中文字幕无码免费久久| 在线观看免费a∨网站| 久久亚洲av成人一二三区| 天堂最新在线官网av| 国产精品久久久一本精品| 久久亚洲精品成人综合| 少妇爽到呻吟的视频| 国产成人亚洲综合无码dvd| 亚洲AV秘 无码一区二区三区| 99久久久精品国产性黑人| 国产午夜福利视频在线| 精品久久综合一区二区| 久久夜色精品国产亚洲av动态图 | 精品亚洲人伦一区二区三区| 久久久亚洲精品蜜桃臀| 亚洲乱码精品久久久久..| 国产91精品一区二区蜜臀| 阿勒泰市| 四虎影视国产884a精品亚洲| 国产精品白浆无码流出在线看| 国产精品小仙女自拍视频| 精品人妻av区乱码| 国产午夜精品理论片| 精品天海翼一区二区| 色哟哟中文字幕在线| 欧美综合自拍亚洲综合百度| 国产一区二区亚洲av| 强开少妇嫩苞又嫩又紧九色| 国产偷v国产偷v亚洲高清| 国产亚洲三级在线视频| 91色婷婷成人精品亚洲| 国产高清国内精品福利99久久| 激情综合网五月激情五月| 欧美黑人xxxx性高清版| 婷婷精品国产亚洲av| 97成人碰碰久久人人超级碰oo| 国产成人一区二区视频免费|