陈军单片机例程LCD.docx
《陈军单片机例程LCD.docx》由会员分享,可在线阅读,更多相关《陈军单片机例程LCD.docx(25页珍藏版)》请在冰豆网上搜索。
陈军单片机例程LCD
/****************************************************
归梦桃花源
说明:
0---9循环
于西安邮电大学陈军
****************************************************/
#include
#defineuintunsignedint
#defineucharunsignedchar
ucharnum;
uchard1[]="welcometovisit";
uchard2[]="beginning";
sbiten=P2^7;
sbitrs=P2^6;
sbitrw=P2^5;
/****************************************************
延时子函数
****************************************************/
voiddelay(uintz)
{
uintx,y;
for(x=z;x>0;x--)
for(y=0;y<110;y++);
}
/****************************************************
LCD驱动子函数
****************************************************/
voidwrite_com(ucharcom)
{
rs=0;
rw=0;
P0=com;
delay(5);
en=1;
delay(5);
en=0;
}
voidwrite_date(uchardatt)
{
rs=1;
rw=0;
P0=datt;
delay(5);
en=1;
delay(5);
en=0;
}
voidlcd_init()
{
en=0;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
}
/********************************************************
指定地址显示子函数
注意:
数字在LCD上显示必须指定显示位置和分离数字
*******************************************************/
voiddisp(ucharadd,uchardate)
{
ucharge;
ge=date%10;
write_com(0x80+add);
write_date(0x30+ge);
}
/****************************************************
主函数
****************************************************/
voidmain()
{
uchari,a;
lcd_init();
write_com(0x80+0x10);
for(i=0;i<16;i++)
{
write_date(d1[i]);
delay(20);
}
write_com(0x80+0x50);
for(i=0;i<11;i++)
{
write_date(d2[i]);
delay(20);
}
for(a=0;a<16;a++)
{
write_com(0x18);//向左移动
delay(700);
}
while
(1)
{
disp(7,num);
switch(num)
{
case0:
write_com(0x80+0x40+5);
write_date('z');
write_date('e');
write_date('r');
write_date('o');
write_com(0x80);
write_date(0x29);
write_com(0x80+15);
write_date(0x28);
delay(1000);
write_com(0x01);
break;
case1:
write_com(0x80+0x40+6);
write_date('o');
write_date('n');
write_date('e');
write_com(0x80+1);
write_date(0x29);
write_com(0x80+14);
write_date(0x28);
delay(1000);
write_com(0x01);
break;
case2:
write_com(0x80+0x40+6);
write_date('t');
write_date('w');
write_date('o');
write_com(0x80+2);
write_date(0x29);
write_com(0x80+13);
write_date(0x28);
delay(1000);
write_com(0x01);
break;
case3:
write_com(0x80+0x40+5);
write_date('t');
write_date('h');
write_date('r');
write_date('e');
write_date('e');
write_com(0x80+3);
write_date(0x29);
write_com(0x80+12);
write_date(0x28);
delay(1000);
write_com(0x01);
break;
case4:
write_com(0x80+0x40+5);
write_date('f');
write_date('o');
write_date('u');
write_date('r');
write_com(0x80+4);
write_date(0x29);
write_com(0x80+11);
write_date(0x28);
delay(1000);
write_com(0x01);
break;
case5:
write_com(0x80+0x40+5);
write_date('f');
write_date('i');
write_date('v');
write_date('e');
write_com(0x80+5);
write_date(0x29);
write_com(0x80+10);
write_date(0x28);
delay(1000);
write_com(0x01);
break;
case6:
write_com(0x80+0x40+6);
write_date('s');
write_date('i');
write_date('x');
write_com(0x80+6);
write_date(0x29);
write_com(0x80+9);
write_date(0x28);
delay(1000);
write_com(0x01);
break;
case7:
write_com(0x80+0x40+5);
write_date('s');
write_date('e');
write_date('v');
write_date('e');
write_date('n');
write_com(0x80+6);
write_date(0x29);
write_com(0x80+8);
write_date(0x28);
delay(1000);
write_com(0x01);
break;
case8:
write_com(0x80+0x40+5);
write_date('e');
write_date('i');
write_date('g');
write_date('h');
write_date('t');
write_com(0x80+6);
write_date(0xff);
write_com(0x80+8);
write_date(0xff);
delay(400);
write_com(0x80+6);
write_date(0xfe);
write_com(0x80+8);
write_date(0xfe);
delay(400);
write_com(0x80+6);
write_date(0xff);
write_com(0x80+8);
write_date(0xff);
delay(1000);
write_com(0x01);
break;
case9:
write_com(0x80+0x40+5);
write_date('n');
write_date('i');
write_date('n');
write_date('e');
write_com(0x80+6);
write_date(0xff);
write_com(0x80+8);
write_date(0xff);
delay(400);
write_com(0x80+6);
write_date(0xfe);
write_com(0x80+8);
write_date(0xfe);
delay(400);
write_com(0x80+6);
write_date(0xff);
write_com(0x80+8);
write_date(0xff);
delay(1000);
write_com(0x01);
break;
}
num++;
if(num==10)
num=0;
}
}
/**********************************************
归梦桃花源
程序说明:
1*可定时的时钟(LCD显示屏和独立键盘实现)
2*if循环嵌套可以用switch替换
3*具有整点报时,掉电自动保存功能2010.8.13
于西安邮电大学陈军
***********************************************/
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitsda=P2^1;
sbitscl=P2^0;
sbitrs=P2^6;
sbitwr=P2^5;
sbiten=P2^7;
sbits1=P3^0;
sbits2=P3^1;
sbits3=P3^2;
sbitfmm=P1^5;
ucharaa,i,s1num,v;
charshi,fen,miao;//很重要,体会啊!
ucharcoded1[]="2010-11-20-sun";
ucharcoded2[]="00:
00:
00";
/*********************************************************
延迟子函数
**********************************************************/
voiddelays(uintz)
{
uintx,y;
for(x=z;x>0;x--)
for(y=0;y<110;y++);
}
voiddelay()//该延迟函数是微秒级的,延迟4-5us
{;;}
/********************************************************
蜂鸣器子函数
*******************************************************/
voiddia()
{
fmm=0;
delays(150);
fmm=1;
}
/*********************************************************
开始子函数
*********************************************************/
voidstart()
{
sda=1;
delay();
scl=1;
delay();
sda=0;
delay();
}
/*********************************************************
停止子函数
*********************************************************/
voidstop()
{
sda=0;
delay();
scl=1;
delay();
sda=1;
delay();
}
/*********************************************************
应答子函数
*********************************************************/
voidack()
{
uchari;
scl=1;
delay();
while((sda==1)&&(i<255))//重点理解
i++;
scl=0;
delay();
}
/*********************************************************
非应答子函数
*********************************************************/
voidnoack()
{
ucharj;
scl=1;
delay();
while((sda==0)&&(j<255))
j++;
scl=0;
delay();
}
/*********************************************************
写字节子函数
*********************************************************/
voidwrite_byte(uchardate)
{
uchari,temp;
temp=date;
for(i=0;i<8;i++)
{
temp=temp<<1;
scl=0;//只有为底时才可改变数据
delay();
sda=CY;//把temp的最高位移入PSW寄存器的CY位
delay();
scl=1;
}
scl=0;
delay();
sda=1;
delay();
}
/*********************************************************
读字节子函数
*********************************************************/
ucharread_byte()
{
uchari,k;
scl=0;
delay();
sda=1;
for(i=0;i<8;i++)
{
scl=1;//开始读数据
delay();
k=(k<<1)|sda;//重要
scl=0;//停止读数据
delay();
}
delay();
returnk;
}
/*********************************************************
指定位置写数据子函数
*********************************************************/
voidwrite_add(ucharaddress,uchardate)
{
start();
write_byte(0xa0);
ack();
write_byte(address);
ack();
write_byte(date);
ack();
stop();
}
/*********************************************************
指定位置读数据子函数
*********************************************************/
ucharread_add(ucharaddress)//此处函数返回char型
{
uchardate;
start();
write_byte(0xa0);//此时方向为写
ack();
write_byte(address);
ack();
start();
write_byte(0xa1);//此时为方向为读
ack();
date=read_byte();
noack();//读的最后不做应答
stop();
returndate;
}
/********************************************************
写命令子函数
*******************************************************/
voidwrite_com(ucharcom)
{
rs=0;
delays
(1);
wr=0;
P0=com;
delays
(1);
en=1;
delays
(1);
en=0;
}
/********************************************************
写数据子函数
*******************************************************/
voidwrite_date(uchardate)
{
rs=1;
delays
(1);
wr=0;
P0=date;
delays
(1);
en=1;
delays
(1);
en=0;
}
/********************************************************
指定地址显示子函数
注意:
数字在LCD上显示必须指定显示位置和分离数字
*******************************************************/
voidsfm(ucharadd,uchardate)
{
ucharshi,ge;
shi=date/10;
ge=date%10;
write_com(0x80+0x40+add);//指定显示到LCD第二行
write_date(0x30+shi);//看LCD提供的字符集,0x30为0的16进制地址
write_date(0x30+ge);
}
/********************************************************
初始化子函数
*******************************************************/
voidinit()
{
sda=1;
delay();
scl=1;
delay();
en=0;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_com(0x80);
for(i=0;i<15;i++)
{
write_date(d1[i]);
delays(5);
}
write_com(0x80+0x40);
for(i=0;i<12;i++)
{
write_date(d2[i]);
delays(5);
}
miao=read_add
(1);
fen=read_add
(2);
shi=read_add(3);
sfm(10,miao);
sfm(7,fen);
sfm(4,shi);
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;//开启总中断
ET0=1;//开启定时器0中断
TR0=1;//开启定时器0
}
/********************************************