×
单片机 > 单片机程序设计 > 详情

LCD12864(ST7920)的C8051驱动(并行)

发布时间:2020-09-02 发布时间:
|
//--------------------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位数据,基本指令
    st_writeCmd(ST_FUN_8);
//delay_us(120);
st_writeCmd(ST_FUN_8_BAS);
//st_writeCmd(ST_FUN_8_G);
//delay_us(50);
    //显示状态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 ;
    //移动的步数
    for(i=0;i     {
        st_writeCmd(dirction);
        //文字移动方向
        delay_ms(time);
        //控制移动时间
    }
}

//写控制命令函数
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);
}

//写数据函数
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++);
        //设置绘图区的Y地址坐标
        //if(temp_y>0x87)temp_y=0x90;
        st_writeCmd(temp_x);
        //设置绘图区的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++);
        //设置绘图区的Y地址坐标
        st_writeCmd(temp_x);
        //设置绘图区的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;
}
//--------------读显示数据-----------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);
        
    }
}
//---------------------------------------------

//--------------------pic.h-------------------------
code const uint8 PIC1[][16]=                  // 数据表
{
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,  
};
//---------------------------------------------



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
ARM基础知识八