陈军单片机例程LCD.docx

上传人:b****5 文档编号:4610310 上传时间:2022-12-07 格式:DOCX 页数:25 大小:18.71KB
下载 相关 举报
陈军单片机例程LCD.docx_第1页
第1页 / 共25页
陈军单片机例程LCD.docx_第2页
第2页 / 共25页
陈军单片机例程LCD.docx_第3页
第3页 / 共25页
陈军单片机例程LCD.docx_第4页
第4页 / 共25页
陈军单片机例程LCD.docx_第5页
第5页 / 共25页
点击查看更多>>
下载资源
资源描述

陈军单片机例程LCD.docx

《陈军单片机例程LCD.docx》由会员分享,可在线阅读,更多相关《陈军单片机例程LCD.docx(25页珍藏版)》请在冰豆网上搜索。

陈军单片机例程LCD.docx

陈军单片机例程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

}

/********************************************

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 幼儿教育 > 育儿理论经验

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1