12864串行51程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include
#define uint unsigned int
#define uchar unsigned char
//sbit RS = P1^0; //片选信号 lcd的RS端 可以不接
sbit RW = P1^1; //串行数据
sbit E = P1^2; //串行同步时钟
//sbit PSB = P0^3; //串并口选择 1:并口模式; 0:串口模式;
uchar code table[]="天津农学院";
uchar code table1[]="机电系";
uchar code table2[]="创新";
uchar code table3[]="全国电子设计大赛";
uchar num;
void delayms(uint z); //不要忘了后面要加分号的!!!!
void SendByte(uchar Dbyte);
uchar ReceiveByte(void);
void Lcd_WriteCmd(uchar Cbyte );
void Lcd_WriteData(uchar Dbyte );
void Lcd_Init(void);
void lcd_display();
void main()
{
Lcd_Init();
lcd_display();
while(1);
}
void delayms(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void SendByte(uchar Dbyte)
{
uchar i;
for(i=0;i<8;i++)
{
E = 0;
Dbyte=Dbyte<<1; //左移一位
RW = CY; //移出的位给SID
E = 1;
E = 0;
}
}
/*****串行接收一个字节*****/
uchar ReceiveByte(void)
{
uchar i,temp1,temp2;
temp1 = 0;
temp2 = 0;
for(i=0;i<8;i++)
{
temp1=temp1<<1;
E = 0;
E = 1;
E = 0;
if(RW)
temp1++;
}
for(i=0;i<8;i++)
{
temp2=temp2<<1;
E = 0;
E = 1;
E = 0;
if(RW)
temp2++;
}
return ((0xf0&temp1)+(0x0f&temp2));
}
void CheckBusy( void ) //必须要检测LCD忙状态 这一步很重要
{
do SendByte(0xfc); //11111,RW(1),RS(0),0
while(0x80&ReceiveByte()); //BF(.7)=1 Busy
}
/*****写指令*****/
void Lcd_WriteCmd(uchar Cbyte )
{
//RS = 1;
CheckBusy();
SendByte(0xf8); //11111,RW(0),RS(0),0
SendByte(0xf0&Cbyte); //高四位
SendByte(0xf0&Cbyte<<4); //低四位(先执行<<)
//RS = 0;
}
/*****写数据*****/
void Lcd_WriteData(uchar Dbyte )
{
//RS = 1;
CheckBusy();
SendByte(0xfa); //11111,RW(0),RS(1),0
SendByte(0xf0&Dbyte); //高四位
SendByte(0xf0&Dbyte<<4); //低四位(先执行<<)
//RS = 0;
}
void Lcd_Init(void)
{
// PSB = 0;
// delayms(50);
Lcd_WriteCmd(0x30); //选择基本指令集
//delayms(1);
// Lcd_WriteCmd(0x30); //选择8bit数据流
delayms(1);
Lcd_WriteCmd(0x0c); //开显示(无游标、不反白)
delayms(1);
Lcd_WriteCmd(0x01); //清除显示,并且设定地址指针为00H
delayms(20);
}
void lcd_display()
{
Lcd_WriteCmd(0x80); //第一行显示
num=0;
while(table[num]!='\0')
{
Lcd_WriteData(table[num]);
num++;
delayms(100);
}
Lcd_WriteCmd(0x90); // 第二行显示
num=0;
while(table1[num]!='\0')
{
Lcd_WriteData(table1[
num]);
num++;
delayms(100);
}
Lcd_WriteCmd(0x88); // 第三行显示
num=0;
while(table2[num]!='\0')
{
Lcd_WriteData(table2[num]);
num++;
delayms(100);
}
Lcd_WriteCmd(0x98); // 第四行显示
num=0;
while(table3[num]!='\0')
{
Lcd_WriteData(table3[num]);
num++;
delayms(100);
}
}