** 1602A液晶屏驱动程序** 晶 振 频 率:11.0592M*****************************************/#include
#include
#include
#include
sbit RS = P2^5;
sbit RW = P2^6;
sbit Enable = P2^7;
sbit cs =P1^0;
sbit sck =P1^1;
sbit si =P1^3;
sbit so =P1^2;
sbit clflag0 =ACC^0;
void CheckBF(void);
void LCD_WtoiR(char datas);
void LCD_WtData(char datas);
void LCD_Clr(void);
void LCD_Init(void);
void LCD_SFLine(void);
void LCD_SSLine(void);
void LCD_printf(char lines, char *p);
void ReadLine(char lines, char *p);
void outbyt(char k);
char inbyt(void);
void wren_cmd(char k);
char rdsr_cmd(void);
void wip_poll(void);
void wrsr_cmd(void);
void CheckBF() /* 检查忙碌状态 */
{
char flag;
flag=0xff;
while((flag & 0x80)!=0)
{
RS=0;
RW=1;
Enable=0;
Enable=1;
flag=P0;
Enable=0;
}
RW=0;
}
void LCD_WtoiR(char datas) /* 指令函数 */
{
CheckBF();
Enable=0;
RS=0;
Enable=1;
P0=datas;
Enable=0;
}
void LCD_WtData(char datas) /* 数据写入 */
{
CheckBF();
Enable=0;
RS=1;
RW=0;
Enable=1;
P0=datas;
Enable=0;
}
void LCD_Clr() /* 清零 */
{
LCD_WtoiR(1);
}
void LCD_Init() /* 初始化 */
{
LCD_WtoiR(0x38); /* (0x3c)? 第一行或第二行 */
LCD_WtoiR(0x0e); /* (0x0c)? 是否显示光标 */
LCD_WtoiR(0x06); /* (0x07)?光标左移或右移 */
}
void LCD_SFLine() /* 显示第一行 */
{
LCD_WtoiR(0x80);
}
void LCD_SSLine() /* 显示第二行 */
{
LCD_WtoiR(0xc0);
}
void LCD_printf(char lines, char *p) /* 数据输出 */
{
if (lines==1)
LCD_SFLine();
else
LCD_SSLine();
while(*p=='$')
{
while(*p!='\0')
{
LCD_WtData(*p);
p++;
}
}
}
void ReadLine(char lines, char *p) /* 读取数据 */
{
char number,i;
if(lines==1)
{
number=0x80;
LCD_SFLine();
}
else
{
number=0xc0;
LCD_SSLine();
}
for(i=0;i<=19;i++)
{
LCD_WtoiR(number);
CheckBF();
Enable=0;
RS=1;
RW=1;
Enable=1;
*p=P0;
number++;
p++;
CheckBF();
Enable=0;
}
*p='\0';
}
void outbyt(char k) /* sends byte to epprom */
{
char i;
for(i=0;i<8;i++) /* use i as bit counter to eight */
{
sck=0; /* bring sck low */
si=k&0x80; /* si is always equal to k's highest bit */
sck=1; /* bring sck high */
k<<=1; /* shift data k left 1 */
}
}
/******************************************************/
char inbyt(void) /* recieves byte from epprom */
{
char i,k;
for(i=0;i<8;i++) /* use i as bit counter to eight */
{
k<<=1;
sck=1; /* bring sck high */
sck=0; /* bring sck low */
k=k|so; /* k or so */
/* k shift left one bit */
}
return k; /* return k */
}
/******************************************************/
void wren_cmd(char k) /* set write enable or disable latch */
{
sck=0; /* bring sck low */
cs=0; /* bring cs low */
outbyt(k); /* set write enable latch 0x06 */
sck=0; /* set write disable latch 0x04 */
cs=1; /* bring cs high */
}
/******************************************************/
char rdsr_cmd(void) /* read status register command */
{
char k;
sck=0; /* bring sck low */
cs=0; /* bring cs low */
k=0x05; /* read status register command byte 0x05 */
outbyt(k); /* send k=0x05 to epprom */
k=inbyt(); /* receieve k from epprom */
sck=0; /* bring sck low */
cs=1; /* bring cs high */
return k; /* return k */
}
void wip_poll()
{
char i;
i=0;
clflag0=1;
while((clflag0!=0)&&(i!=80)) /* if WIP bit '1' or i not equal*/
{
i++;
ACC=rdsr_cmd(); /* read status register */
}
/* to 80 , continus polling */
}
void wrsr_cmd() /* write status register */
{ char k;
sck=0; /* bring sck low */
cs=0; /* bring cs low */
k=0x01; /* write status register instruction */
outbyt(k); /* send byte k=0x01 to epprom */
k=0x00; /* write command k to status register */
outbyt(k); /* send byte k=0x00 to epprom */
sck=0; /* bring sck low */
cs=1; /* bring cs high */
wip_poll(); /* poll for completion of a nonvolatile write cycle */
}
main()
{
char a[20];
LCD_Init();
LCD_Clr();
LCD_printf(1,"1234567"); /* 读取第一行数据,在第二行输出 */
ReadLine(1,a);
LCD_printf(2,a);
wrsr_cmd();
while(1)
{
cs=0;
cs=1;
}
}
这是我的 不知道对不对 还需要补充什么的
c
一楼的驱动不错...
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
PCON=0x00;
SCON=0x50;
TR1=1;
ES=0;