新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > LCD12864(ST7920)的C8051驅動(并行)

        LCD12864(ST7920)的C8051驅動(并行)

        作者: 時間:2016-11-23 來源:網(wǎng)絡 收藏
        //--------------------st_12864.h------------------------

        #ifndef _LCD12864_ST7920
        #define _LCD12864_ST7920
        #ifndef uint8
        #define uint8 unsigned char
        #endif
        #ifndef uint16
        #define uint16 unsigned int
        #endif
        extern void st_writeCmd(uint8 CMD);
        extern void st_writeDat(uint8 DAT);
        //extern void Delay(uint16 ms);
        extern uint8 st_checkBusy(void);
        extern void st_drawFull(uint8 x, uint8 y, const uint8 *Draw);
        //extern void Picture_Set_XY(uint8 x, uint8 y);
        extern void st_sendstr(uint8 x, uint8 y, uint8 *p);
        extern void st_init(void);
        extern void st_setDraw(void);
        extern void st_flash(uint16 delay_t,uint8 times);
        extern void st_moveChar(uint8 step,uint8 dirction,uint16 time);
        extern void st_drawFree(uint8 x1,uint8 y1,uint8 x2,uint8 y2,const uint8 *dat);
        extern void st_readRam(uint8 x,uint8 y);
        extern void st_drawPixel(uint8 x,uint8 y,uint8 color);
        extern void st_clr(void);
        extern void st_drawRectangle(uint8, uint8, uint8, uint8, uint8, uint8);
        extern void st_drawVerticalLine(uint8 x1, uint8 y1, uint8 y2, uint8 color);
        extern void st_drawLevelLine(uint8 x1, uint8 y1, uint8 x2, uint8 color);
        extern void st_setChar(void);
        #endif

        //---------------------------------------------
        //--------------------st_12864.c-------------------------
        /
        //12864接口
        #define ST_DATA P1
        #define DATA_PORT P1
        //st7920指令
        #define ST_CLEAR 0x01
        #define ST_HOME 0x02
        #define ST_ENTRY_MODE 0x06
        #define ST_DISPLAY_OFF 0x08
        #define ST_DISPLAY_ON 0x0c
        #define ST_FUN_8 0x30
        #define ST_FUN_8_BAS 0x30
        #define ST_FUN_8_EXT 0x34

        #define ST_FUN_8_G 0x36
        #define ST_BUSY P1&0x80
        sbit st_rs=P0^1;
        sbit st_rw=P0^2;
        sbit st_e=P0^3;
        void st_writeCmd(uint8 CMD);
        void st_writeDat(uint8 DAT);
        void Delay(uint16 ms);
        uint8 st_checkBusy(void);
        void st_drawFull(uint8 x,uint8 y,const uint8*Draw);
        //void Picture_Set_XY(uint8 x,uint8 y);
        void st_sendstr(uint8 x,uint8 y,uint8*p);
        void st_init(void);
        void st_setDraw(void);
        void st_flash(uint16 delay_t,uint8 times);
        void st_moveChar(uint8 step,uint8 dirction,uint16 time);
        void st_drawFree(uint8 x1,uint8 y1,uint8 x2,uint8 y2, const uint8 *dat);
        void st_readRam(uint8 x,uint8 y);
        void st_drawPixel(uint8 x,uint8 y,uint8 color);
        void st_clr(void);
        void st_drawRectangle(uint8,uint8,uint8,uint8,uint8,uint8);
        void st_drawVerticalLine(uint8 x1,uint8 y1,uint8 y2,uint8 color);
        void st_drawLevelLine(uint8 x1,uint8 y1,uint8 x2,uint8 color);
        void st_setChar(void);
        uint8 readdispdata[2];

        void st_init(void)
        {
        EA=0;
        delay_ms(50);
        //功能設置 8位數(shù)據(jù),基本指令
        st_writeCmd(ST_FUN_8);
        //delay_us(120);
        st_writeCmd(ST_FUN_8_BAS);
        //st_writeCmd(ST_FUN_8_G);
        //delay_us(50);
        //顯示狀態(tài)ON,游標OFF,反白OFF
        st_writeCmd(ST_DISPLAY_ON);
        //delay_us(120);
        //清屏
        st_writeCmd(ST_CLEAR);
        //delay_ms(12);
        //地址歸位
        //st_writeCmd(ST_HOME);
        //delay_us(120);
        //設置進入地址
        st_writeCmd(ST_ENTRY_MODE);
        delay_us(1);
        EA=1;
        }
        void st_flash(uint16 delay_t,uint8 times)
        {
        uint8 j ;
        for(j=0;j{
        //st_writeCmd(0x08);//關閉顯示
        st_writeCmd(ST_FUN_8_EXT); //關圖形模式
        delay_ms(delay_t); //軟件延時
        //st_writeCmd(0x0c);//開顯示
        st_writeCmd(ST_FUN_8_G); //開圖形模式
        delay_ms(delay_t);//軟件延時
        }
        }

        void st_moveChar(uint8 step,uint8 dirction,uint16 time)
        {
        uint8 i ;
        //移動的步數(shù)
        for(i=0;i{
        st_writeCmd(dirction);
        //文字移動方向
        delay_ms(time);
        //控制移動時間
        }
        }

        //寫控制命令函數(shù)
        void st_writeCmd(uint8 CMD)
        {
        while(st_checkBusy());
        //檢測液晶內部是否忙
        st_rs=0;
        st_rw=0;
        DATA_PORT=CMD ;
        st_e=1;
        delay_us(2);
        st_e=0;
        delay_us(2);
        }

        //寫數(shù)據(jù)函數(shù)
        void st_writeDat(uint8 DAT)
        {
        while(st_checkBusy());
        //檢測液晶內部是否忙
        st_rs=1;
        delay_us(2);
        st_rw=0;
        DATA_PORT=DAT ;
        st_e=1;
        delay_us(2);
        st_e=0;
        delay_us(2);
        }

        uint8 st_checkBusy(void)
        {
        uint8 temp ;
        //st_e=0;
        //delay_us(1);
        DATA_PORT=0xff;
        st_rs=0;
        delay_us(1);//nop();
        st_rw=1;
        delay_us(2);//nop();
        st_e=1;
        delay_us(2);//nop();
        temp=DATA_PORT;
        delay_us(1);//nop();
        st_e=0;
        delay_us(1);//nop();
        temp&=0x80 ;
        //st_e=1;
        //delay_us(1);
        return(temp);
        }

        void st_sendstr(uint8 x,uint8 y,uint8*p)
        {
        EA=0;
        if(y==0)
        {
        st_writeCmd((0x80+x));
        }
        if(y==1)
        {
        st_writeCmd((0x90+x));
        }
        if(y==2)
        {
        st_writeCmd((0x88+x));
        }
        if(y==3)
        {
        st_writeCmd((0x98+x));
        }
        while(*p!=0)
        {
        st_writeDat(*p++);
        }
        EA=1;
        }

        void st_setDraw(void)
        {
        EA=0;
        st_writeCmd(ST_CLEAR);
        //清屏
        delay_ms(2);//Delay(20);
        //延時
        st_writeCmd(ST_FUN_8_G);
        //8BIT控制界面,擴充指令集,,繪圖顯示ON
        delay_us(1);//Delay(20);
        //延時
        //st_drawRectangle(0,0,127,63,32,0);
        //add by july
        EA=1;
        }
        void st_setChar(void)
        {
        EA=0;
        st_writeCmd(ST_FUN_8_BAS);
        //8BIT控制界面,擴充指令集,,繪圖顯示ON
        st_writeCmd(ST_CLEAR);
        //清屏
        delay_ms(2);//Delay(20);
        //延時
        EA=1;
        }

        void st_drawFull(uint8 x,uint8 y,const uint8*Draw)
        {
        uint8 i,j,temp_x,temp_y ;
        EA=0;
        temp_x=x ;
        temp_y=y ;
        temp_x|=0x80 ;
        temp_y|=0x80 ;
        for(i=0;i<32;i++)
        {
        st_writeCmd(temp_y++);
        //設置繪圖區(qū)的Y地址坐標
        //if(temp_y>0x87)temp_y=0x90;
        st_writeCmd(temp_x);
        //設置繪圖區(qū)的X地址坐標
        for(j=0;j<16;j++)
        {
        st_writeDat(*Draw);
        Draw++;
        }
        }
        temp_x=x ;
        temp_y=y ;
        temp_x|=0x88 ;
        temp_y|=0x80 ;
        j=0 ;
        for(i=32;i<64;i++)
        {
        st_writeCmd(temp_y++);
        //設置繪圖區(qū)的Y地址坐標
        st_writeCmd(temp_x);
        //設置繪圖區(qū)的X地址坐標
        for(j=0;j<16;j++)
        {
        st_writeDat(*Draw);
        Draw++;
        }
        }
        EA=1;
        }

        //----------------------------------------------------add by july
        void st_drawFree(uint8 x1,uint8 y1,uint8 x2,uint8 y2,const uint8 *dat)
        {
        uint8 i,j,xx1,yy1,y1y2,x1x2 ;
        EA=0;
        y1y2=y2-y1 ;
        x1x2=x2-x1 ;
        xx1=x1|0x80 ;
        yy1=y1|0x80 ;
        //xx20x80;
        //yy20x80;
        for(i=0;i{
        //sendchar(i);
        if(y1++<32)
        {
        st_writeCmd(yy1++);
        st_writeCmd(xx1);
        for(j=0;j{
        st_writeDat(*dat);
        dat++;
        }
        }
        else
        {
        st_writeCmd(yy1++-32);
        st_writeCmd(xx1+8);
        for(j=0;j{
        st_writeDat(*dat);
        dat++;
        }
        }
        }
        EA=1;
        }
        //--------------讀顯示數(shù)據(jù)-----------add by july
        void st_readRam(uint8 x,uint8 y)
        {
        //uint8 temp;
        EA=0;
        if(y>31)
        {
        y-=32 ;
        x+=8 ;
        }

        st_writeCmd(y|0x80);
        st_writeCmd(x|0x80);

        while(st_checkBusy());
        //檢測液晶內部是否忙
        DATA_PORT=0XFF ;
        st_rs=1;
        delay_us(2);//nop();
        st_rw=1;
        delay_us(2);//nop();
        //Set_input();
        //nop();
        st_e=1;
        delay_us(20);//Delay_us(20);
        //sendchar(PINA);
        st_e=0;
        delay_us(1);//nop();
        st_e=1;
        delay_us(20);//Delay_us(20);
        //sendchar(PINA);
        readdispdata[0]=ST_DATA ;
        st_e=0;
        delay_us(1);//nop();
        st_e=1;
        delay_us(20);//Delay_us(20);
        //sendchar(PINA);
        readdispdata[1]=ST_DATA ;
        st_e=0;
        delay_us(1);//nop();
        //Set_output();
        EA=1;
        }
        //----------------寫一個像素------------------------add by july
        void st_drawPixel(uint8 x,uint8 y,uint8 color)
        {
        uint8 realx,modx1=8,modx2=8 ;
        EA=0;
        realx=x/16 ;
        //sendchar(realx);
        modx1=x%16 ;
        if(modx1>7)
        {
        modx2=modx1%8 ;
        modx1=8 ;
        }
        st_readRam(realx,y);
        if(color)
        {

        readdispdata[0]|=0x80>>modx1 ;
        readdispdata[1]|=0x80>>modx2 ;

        }
        else
        {
        readdispdata[0]&=~(0x80>>modx1);
        readdispdata[1]&=~(0x80>>modx2);

        }
        if(y>31)
        {
        y-=32 ;
        realx+=8 ;
        }

        st_writeCmd(y|0x80);
        st_writeCmd(realx|0x80);
        //sendchar(realx);
        st_writeDat(readdispdata[0]);
        st_writeDat(readdispdata[1]);
        EA=1;
        }
        //--------------lcd clear----------------add by july
        void st_clr(void)
        {
        st_writeCmd(0x01);
        //清屏
        //Delay(20);//延時
        //st_writeCmd(0x36); //8BIT控制界面,擴充指令集,,繪圖顯示ON
        }
        //---------draw line--------------------add by july
        void st_drawLevelLine(unsigned char x1,unsigned char y1,unsigned char x2,unsigned char color)
        {
        unsigned char i ;
        for(i=x1;i<=x2;i++)
        {
        st_drawPixel(i,y1,color);

        }
        }
        void st_drawVerticalLine(unsigned char x1,unsigned char y1,unsigned char y2,unsigned char color)
        {
        unsigned char i ;
        for(i=y1;i<=y2;i++)
        {
        st_drawPixel(x1,i,color);

        }
        }
        //-----------------draw rectangle------------------add by july
        void st_drawRectangle(unsigned char lf,unsigned char tp,unsigned char rt,unsigned char bt,unsigned char w,unsigned char cl)
        {
        unsigned char i ;
        for(i=0;i{
        st_drawLevelLine(lf,tp,rt,cl);
        st_drawVerticalLine(rt,tp,bt,cl);
        st_drawLevelLine(lf,bt,rt,cl);
        st_drawVerticalLine(lf,tp,bt,cl);

        }
        }
        //---------------------------------------------

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

        //--------------------pic.h-------------------------
        code const uint8 PIC1[][16]=// 數(shù)據(jù)表
        {
        0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
        0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
        0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
        0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
        0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X60,0X00,
        0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X01,0X98,0X00,
        0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X02,0X04,0X00,
        0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X02,0XF4,0X00,
        0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X04,0XB2,0X00,
        0X00,0X00,0X00,0X00,0X00,0X00,0X0C,0X00,0X00,0X00,0X00,0X00,0X18,0X04,0XE2,0X00,
        0X00,0X00,0X00,0X00,0X00,0X01,0XE0,0X00,0X1F,0XFF,0X80,0X00,0X06,0X04,0XA2,0X00,
        0X00,0X00,0X00,0X00,0X00,0X0E,0X00,0X03,0XFF,0XFF,0XF8,0X00,0X07,0X82,0X94,0X00,
        0X00,0X00,0X00,0X00,0X00,0XF8,0X00,0X0F,0XFF,0XFF,0XFE,0X00,0X03,0XC2,0X04,0X00,
        0X00,0X00,0X00,0X00,0X07,0XC0,0X00,0X7F,0XFF,0XFF,0XFF,0X00,0X03,0XE1,0X98,0X00,
        0X00,0X00,0X00,0X00,0X3F,0X00,0X01,0XFF,0XFF,0XFF,0XFF,0X00,0X07,0XF0,0X60,0X00,
        0X00,0X00,0X00,0X00,0XFC,0X00,0X03,0XFF,0XFF,0XFF,0XFE,0X00,0X0F,0XF8,0X00,0X00,
        0X00,0X00,0X00,0X03,0XF0,0X00,0X0F,0XFF,0XFF,0XFF,0XF8,0X00,0X3F,0XF8,0X00,0X00,
        0X00,0X00,0X00,0X0F,0XE0,0X00,0X1F,0XFF,0XFF,0XFF,0XFC,0X00,0XFF,0XF8,0X00,0X00,
        0X00,0X00,0X00,0X3F,0XC0,0X00,0X1F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0X00,0X00,
        0X00,0X00,0X00,0XFF,0X80,0X00,0X3F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0X00,0X00,
        0X00,0X00,0X01,0XFF,0X00,0X00,0X3F,0XF8,0X00,0X00,0X03,0XFF,0XFF,0XF0,0X00,0X00,
        0X00,0X00,0X03,0XFF,0X00,0X00,0X1E,0X00,0X00,0X00,0X00,0X3F,0XFF,0XF0,0X00,0X00,
        0X00,0X00,0X0F,0XFF,0X00,0X00,0X0E,0X00,0X00,0X00,0X00,0X07,0XFF,0XE0,0X00,0X00,
        0X00,0X00,0X1F,0XFF,0X00,0X00,0X03,0XF0,0XE0,0X00,0X00,0X03,0XFF,0XE0,0X00,0X00,
        0X00,0X00,0X3F,0XFF,0X80,0X00,0X00,0X3F,0XFF,0X00,0X00,0X01,0XFF,0X80,0X00,0X00,
        0X00,0X00,0X7F,0XFF,0XC0,0X00,0X00,0X00,0X01,0XC0,0X00,0X01,0XFF,0X00,0X00,0X00,
        0X00,0X00,0X7F,0XFF,0XF0,0X00,0X00,0X00,0X00,0XF0,0X00,0X00,0XFE,0X00,0X00,0X00,
        0X00,0X00,0XFF,0XFF,0XFE,0X00,0X00,0X00,0X0F,0XF8,0X00,0X01,0XFC,0X00,0X00,0X00,
        0X00,0X00,0XFF,0XFF,0XFF,0XFB,0X00,0X0F,0XFF,0XF8,0X00,0X01,0XF0,0X00,0X00,0X00,
        0X00,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0X00,0X03,0XC0,0X00,0X00,0X00,
        0X00,0X00,0XFF,0XFF,0X03,0XFF,0XFF,0XFF,0XFF,0XF0,0X00,0X07,0X80,0X00,0X00,0X00,
        0X00,0X00,0XFF,0XFC,0X00,0X7F,0XFF,0XFF,0XFF,0XE0,0X00,0X1C,0X00,0X00,0X00,0X00,
        0X00,0X00,0X7F,0XF8,0X00,0XFF,0XFF,0XFF,0XFF,0XC0,0X00,0X30,0X00,0X00,0X00,0X00,
        0X00,0X00,0X7F,0XE0,0X00,0XFF,0XFF,0XFF,0XFF,0X00,0X00,0XC0,0X00,0X00,0X00,0X00,
        0X00,0X00,0X3F,0XC0,0X00,0XFF,0XFF,0XFF,0XFC,0X00,0X03,0X00,0X00,0X00,0X00,0X00,
        0X00,0X00,0X1F,0XC0,0X00,0X7F,0XFF,0XFF,0XF0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
        0X00,0X00,0X0F,0XC0,0X00,0X1F,0XFF,0XFF,0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
        0X00,0X00,0X07,0XC0,0X00,0X00,0XFF,0XF0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
        0X00,0X00,0X00,0XE0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
        0X00,0X00,0X00,0X30,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
        0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
        0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
        0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
        0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
        0X00,0X1E,0X06,0X04,0X02,0X03,0XC1,0XC0,0X48,0X00,0X20,0X0C,0X07,0X83,0XC0,0X00,
        0X00,0X1A,0X06,0X04,0X02,0X06,0XC3,0X40,0X48,0X00,0X20,0X0C,0X04,0X86,0XC0,0X00,
        0X00,0X18,0X02,0X04,0X02,0X06,0X03,0X40,0X68,0X00,0X20,0X0C,0X04,0X86,0X00,0X00,
        0X00,0X18,0X02,0X04,0X02,0X02,0X01,0X40,0X68,0X00,0X20,0X0C,0X04,0X82,0X00,0X00,
        0X00,0X08,0X02,0X04,0X02,0X06,0X03,0X40,0X68,0X00,0X20,0X0C,0X04,0X83,0X00,0X00,
        0X00,0X04,0X02,0X04,0X02,0X02,0X03,0X40,0X78,0X00,0X20,0X14,0X07,0X01,0X80,0X00,
        0X00,0X02,0X02,0X04,0X02,0X02,0X01,0X40,0X58,0X00,0X20,0X14,0X04,0X80,0X80,0X00,
        0X00,0X02,0X02,0X04,0X02,0X06,0X01,0X40,0X58,0X00,0X20,0X16,0X04,0X80,0XC0,0X00,
        0X00,0X02,0X02,0X04,0X02,0X02,0X03,0X40,0X58,0X00,0X20,0X1E,0X04,0X80,0XC0,0X00,
        0X00,0X1A,0X02,0X04,0X02,0X06,0XC3,0X40,0X58,0X00,0X20,0X12,0X04,0X86,0XC0,0X00,
        0X00,0X1A,0X02,0X06,0X02,0X02,0XC1,0X40,0X58,0X00,0X30,0X12,0X05,0X82,0XC0,0X00,
        0X00,0X0E,0X02,0X07,0X02,0X03,0X81,0XC0,0X48,0X00,0X38,0X32,0X07,0X83,0X80,0X00,
        0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
        0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
        0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
        0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
        0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
        0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
        0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
        0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
        };
        //---------------------------------------------



        關鍵詞: LCD12864ST7920C805

        評論


        技術專區(qū)

        關閉
        主站蜘蛛池模板: 涟源市| 庆云县| 达日县| 台南县| 安宁市| 琼海市| 长春市| 汝州市| 萨迦县| 正蓝旗| 威信县| 额济纳旗| 得荣县| 波密县| 常州市| 永安市| 封丘县| 巴南区| 得荣县| 宁陵县| 长岛县| 东源县| 瑞昌市| 额济纳旗| 精河县| 临沧市| 永春县| 五台县| 安龙县| 汉寿县| 南丰县| 阿克陶县| 北辰区| 中牟县| 新野县| 高要市| 温泉县| 博乐市| 泗阳县| 商河县| 新干县|