先来串口:
/**************端口设置*************************/
sbit CS= P0^0; // 定义LCD的RS控制线 RS
sbit SID = P0^1; // 定义LCD的RW控制线
sbit SCLK = P0^2; // 定义LCD的E控制线
uchar LcdReadData=0;
/*************delay_ms************************/
/*========================延时子程序========================*/
void delay(uint k) //w=1时,100us
{
uchar a;
for(k;k>0;k--)
for(a=47;a>0;a--);
}
/**************************************************/
uchar ReadLcdData(void) // RS RW D7 D6 D5 D4 D3 D2 D1 D0
// 0 1 BF AC6 AC5 AC4 AC3 AC2 AC1 AC0
// BF忙标志 AC6~AC0 地址计数器AC的值
{
uchar i,ReadData=0;
/*******************开启串行协议************************/
CS=1;
Nop();
SID=0;
Nop();
/*******************同步开始信号,写5个1,即持续5个时钟周期************************/
SID=1;//先往总线送数据 1
Nop();
for(i=0;i<5;i++)
{
SCLK=0;
Nop();
SCLK=1;//上升沿把总线数据写入LCD相关寄存器
Nop();
}
/*******************RW=1************************/
SCLK=0;
Nop();
SID=1;//先往总线送数据 RW=1
Nop();
SCLK=1;//上升沿把总线数据写入LCD相关寄存器
Nop();
/*******************RS=0************************/
SCLK=0;
Nop();
SID=0;//先往总线送数据 RS=0
Nop();
SCLK=1;//上升沿把总线数据写入LCD相关寄存器
Nop();
/*******************写一个0************************/
SCLK=0;
Nop();
SID=0;//先往总线送数据0
Nop();
SCLK=1;//上升沿把总线数据写入LCD相关寄存器
Nop();
/*******************读取高四位************************/
for(i=0;i<4;i++)
{
SCLK=0;
Nop();
ReadData=ReadData<<1;//移位
SCLK=1;//上升沿把LCD相关寄存器数据读出到总线
if(SID==1)//读总线数据
ReadData=ReadData+1;//移位之后,如果总线上数据数据是1,则加1,否则不变
Nop();
}
/*******************写四个0************************/
SID=0;//先往总线送数据0
Nop();
for(i=0;i<4;i++)
{
SCLK=0;
Nop();
SCLK=1;//上升沿把总线数据写入LCD相关寄存器
Nop();
} /*******************读取低四位************************/
for(i=0;i<4;i++)
{
SCLK=0;
Nop();
ReadData=ReadData<<1;//移位
SCLK=1;//上升沿把LCD相关寄存器数据读出到总线
Nop();
if(SID==1)//读总线数据
ReadData=ReadData+1;//移位之后,如果总线上数据数据是1,则加1,否则不变
Nop();
} /*******************写四个0************************/
SID=0;//先往总线送数据0
Nop();
for(i=0;i<4;i++)
{
SCLK=0;
Nop();
SCLK=1;//上升沿把总线数据写入LCD相关寄存器
Nop();
}
//结束总线
SCLK=0;
Nop();
//返回数据
return ReadData;
} void TestLcdBusy(void){
LcdReadData=0;
while(1){
LcdReadData=ReadLcdData();
if(!(LcdReadData&0x80))break;//不忙就退出
}
} void LCDWriteCMD(uchar CMD){// RS RW D7 D6 D5 D4 D3 D2 D1 D0
// 0 0 CMD7 CMD6 CMD5 CMD4 CMD3 CMD2 CMD1 CMD0
// CMD7~CMD0指令
uchar i;
TestLcdBusy();
/*******************开启串行协议************************/
CS=1;
Nop();
SID=0;
Nop();
/*******************同步开始信号,写5个1************************/
SID=1;//先往总线送数据 1
Nop();
for(i=0;i<5;i++)
{
SCLK=0;
Nop();
SCLK=1;//上升沿把总线数据写入LCD相关寄存器
Nop();
}
/*******************RW=0************************/
SCLK=0;
Nop();
SID=0;//先往总线送数据 RW=1
Nop();
SCLK=1;//上升沿把总线数据写入LCD相关寄存器
Nop();
/*******************RS=0************************/
SCLK=0;
Nop();
SID=0;//先往总线送数据 RS=0
Nop();
SCLK=1;//上升沿把总线数据写入LCD相关寄存器
Nop();
/*******************写一个0************************/
SCLK=0;
Nop();
SID=0;//先往总线送数据0
Nop();
SCLK=1;//上升沿把总线数据写入LCD相关寄存器
Nop();
/*******************写高四位************************/
for(i=0;i<4;i++)
{
SCLK=0;
Nop();
if(CMD&0x80)//获取最高位
SID=1;//高位为1发送1
else
SID=0;//高位为0发送0
CMD<<=1;
Nop();
SCLK=1;//上升沿把总线数据写入LCD相关寄存器
Nop();
}
/*******************写四个0************************/
SID=0;//先往总线送数据0
Nop();
for(i=0;i<4;i++)
{
SCLK=0;
Nop();
SCLK=1;//上升沿把总线数据写入LCD相关寄存器
Nop();
}
/**************端口设置*************************/
sbit CS= P0^0; // 定义LCD的RS控制线 RS
sbit SID = P0^1; // 定义LCD的RW控制线
sbit SCLK = P0^2; // 定义LCD的E控制线
uchar LcdReadData=0;
/*************delay_ms************************/
/*========================延时子程序========================*/
void delay(uint k) //w=1时,100us
{
uchar a;
for(k;k>0;k--)
for(a=47;a>0;a--);
}
/**************************************************/
uchar ReadLcdData(void) // RS RW D7 D6 D5 D4 D3 D2 D1 D0
// 0 1 BF AC6 AC5 AC4 AC3 AC2 AC1 AC0
// BF忙标志 AC6~AC0 地址计数器AC的值
{
uchar i,ReadData=0;
/*******************开启串行协议************************/
CS=1;
Nop();
SID=0;
Nop();
/*******************同步开始信号,写5个1,即持续5个时钟周期************************/
SID=1;//先往总线送数据 1
Nop();
for(i=0;i<5;i++)
{
SCLK=0;
Nop();
SCLK=1;//上升沿把总线数据写入LCD相关寄存器
Nop();
}
/*******************RW=1************************/
SCLK=0;
Nop();
SID=1;//先往总线送数据 RW=1
Nop();
SCLK=1;//上升沿把总线数据写入LCD相关寄存器
Nop();
/*******************RS=0************************/
SCLK=0;
Nop();
SID=0;//先往总线送数据 RS=0
Nop();
SCLK=1;//上升沿把总线数据写入LCD相关寄存器
Nop();
/*******************写一个0************************/
SCLK=0;
Nop();
SID=0;//先往总线送数据0
Nop();
SCLK=1;//上升沿把总线数据写入LCD相关寄存器
Nop();
/*******************读取高四位************************/
for(i=0;i<4;i++)
{
SCLK=0;
Nop();
ReadData=ReadData<<1;//移位
SCLK=1;//上升沿把LCD相关寄存器数据读出到总线
if(SID==1)//读总线数据
ReadData=ReadData+1;//移位之后,如果总线上数据数据是1,则加1,否则不变
Nop();
}
/*******************写四个0************************/
SID=0;//先往总线送数据0
Nop();
for(i=0;i<4;i++)
{
SCLK=0;
Nop();
SCLK=1;//上升沿把总线数据写入LCD相关寄存器
Nop();
} /*******************读取低四位************************/
for(i=0;i<4;i++)
{
SCLK=0;
Nop();
ReadData=ReadData<<1;//移位
SCLK=1;//上升沿把LCD相关寄存器数据读出到总线
Nop();
if(SID==1)//读总线数据
ReadData=ReadData+1;//移位之后,如果总线上数据数据是1,则加1,否则不变
Nop();
} /*******************写四个0************************/
SID=0;//先往总线送数据0
Nop();
for(i=0;i<4;i++)
{
SCLK=0;
Nop();
SCLK=1;//上升沿把总线数据写入LCD相关寄存器
Nop();
}
//结束总线
SCLK=0;
Nop();
//返回数据
return ReadData;
} void TestLcdBusy(void){
LcdReadData=0;
while(1){
LcdReadData=ReadLcdData();
if(!(LcdReadData&0x80))break;//不忙就退出
}
} void LCDWriteCMD(uchar CMD){// RS RW D7 D6 D5 D4 D3 D2 D1 D0
// 0 0 CMD7 CMD6 CMD5 CMD4 CMD3 CMD2 CMD1 CMD0
// CMD7~CMD0指令
uchar i;
TestLcdBusy();
/*******************开启串行协议************************/
CS=1;
Nop();
SID=0;
Nop();
/*******************同步开始信号,写5个1************************/
SID=1;//先往总线送数据 1
Nop();
for(i=0;i<5;i++)
{
SCLK=0;
Nop();
SCLK=1;//上升沿把总线数据写入LCD相关寄存器
Nop();
}
/*******************RW=0************************/
SCLK=0;
Nop();
SID=0;//先往总线送数据 RW=1
Nop();
SCLK=1;//上升沿把总线数据写入LCD相关寄存器
Nop();
/*******************RS=0************************/
SCLK=0;
Nop();
SID=0;//先往总线送数据 RS=0
Nop();
SCLK=1;//上升沿把总线数据写入LCD相关寄存器
Nop();
/*******************写一个0************************/
SCLK=0;
Nop();
SID=0;//先往总线送数据0
Nop();
SCLK=1;//上升沿把总线数据写入LCD相关寄存器
Nop();
/*******************写高四位************************/
for(i=0;i<4;i++)
{
SCLK=0;
Nop();
if(CMD&0x80)//获取最高位
SID=1;//高位为1发送1
else
SID=0;//高位为0发送0
CMD<<=1;
Nop();
SCLK=1;//上升沿把总线数据写入LCD相关寄存器
Nop();
}
/*******************写四个0************************/
SID=0;//先往总线送数据0
Nop();
for(i=0;i<4;i++)
{
SCLK=0;
Nop();
SCLK=1;//上升沿把总线数据写入LCD相关寄存器
Nop();
}