微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > LCD12864(ST7920)的C8051驱动(并行)

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

时间:11-23 来源:互联网 点击:
//--------------------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);

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

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top