当前位置:首页 > 单片机课设报告(万年历的制作) - 图文
洛阳理工学院课程设计报告
3.2 源程序:
3.2.1 总体程序:
#include
#define uchar unsigned char #define uint unsigned int sbit lcdrs=P3^5; sbit lcden=P3^4;
sbit key1=P3^0; //时间功能键。 sbit key2=P3^2; //增大键。 sbit key3=P3^3; //减小键。 sbit key4=P3^1; //闹钟功能键。 sbit beep1=P2^3;
//标准音符频率对应的延时表。 uchar code High_LIST[]={0,226,229,232,233,236,238,240,241,242,244,245,246,247,248};
uchar code Low_LIST[]={0,4,13,10,20,3,8,6,2,23,5,26,1,4,3}; //待写入24C02的音符。
uchar code Song_24C02[]={1,2,3,1,1,2,3,1,3,4,5,3,4,5}; uchar index; //读取音符索引值。 uchar count,key1num,key4num,flag,soundflag; uchar
hour,min,sec,week,year,month,day,nz_hour,nz_min,nz_sec,nz_week,nz_year,nz_month,nz_day;
uchar code table[]=\定义初始上电时液晶默认的显示状态。 //延时。
void delayms(uint xms) {uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);}//蜂鸣器发声函数。 void beep() {beep1=0;
delayms(200);
beep1=1;}//1602液晶写命令函数。 void write_com(uchar com) {lcdrs=0;
12
洛阳理工学院课程设计报告
lcden=0; P0=com;
delayms(5); lcden=1; delayms(5);
lcden=0;}//1602液晶写数据函数。 void write_date(uchar date) {lcdrs=1; lcden=0; P0=date; delayms(5); lcden=1; delayms(5);
lcden=0;}//写时分秒函数。
void write_hms(uchar address,uchar date)
{uchar shi,ge; //1602液晶刷新时分秒函数,4为时,7为分,10为秒。
shi=date/10; ge=date;
write_com(0x80+0x40+address); write_date(0x30+shi);
write_date(0x30+ge); }//写年月日函数。 void write_ymd(uchar address,uchar date)
{uchar shi,ge; //1602液晶刷新年月日函数,2为年,5为月,8为日。
shi=date/10; ge=date;
write_com(0x80+address); write_date(0x30+shi);
write_date(0x30+ge);}//写液晶星期显示函数。 void write_week(uchar date)
{write_com(0x80+15); //1602液晶刷新星期函数,15为星期。 write_date(0x30+date);}//初始化函数。 void init() {uchar num; lcden=0; hour=0; min=0; sec=0; week=1; day=0; month=0; year=0; count=0;
13
洛阳理工学院课程设计报告
key1num=0; init_24c02();
write_com(0x38); //设置16*2显示,5*7点阵,8位并行数据接口。 write_com(0x0c); //设置开显示,不显示光标。 write_com(0x06); //写一个字符后地址指针加1。 write_com(0x01); //显示清0,数据指针清0。 write_com(0x80); //设置初始显示位置。 for(num=0;num<16;num++) {write_date(table[num]); delayms(5);}
write_com(0x80+0x40+6);
write_date(0x3a); //写出时间显示部分的两个冒号。 delayms(5);
write_com(0x80+0x40+9); write_date(0x3a); delayms(5);
sec=read_add(1); //首次上电时从24C02中读取出存储的数据。 min=read_add(2); hour=read_add(3); week=read_add(4); day=read_add(5); month=read_add(6); year=read_add(7);
write_hms(10,sec); //分别送去液晶显示。 write_hms(7,min); write_hms(4,hour); write_week(week); write_ymd(8,day); write_ymd(5,month); write_ymd(2,year); TMOD=0x01; //定时器T0工作方式1,定时器T1工作方式0。 TH0=(65536-50000)/256; //装初值,50ms。 TL0=(65536-50000)%6; EA=1; ET0=1; ET1=1; PT0=1;
TR0=1; //开始计时。}//按键扫描函数。 void keyscan()
{void shijiantiaojie(); //时间调节函数声明部分。 void naozhongtiaojie(); //闹钟调节函数声明部分。 if(key1==0) {delayms(10); if(key1==0)
14
洛阳理工学院课程设计报告
{key1num++; //按键值加1。
while(!key1); //等待按键释放。
beep(); //每当有按键释放蜂鸣器发出滴声。 if(key1num==1)
{TR0=0; //关闭定时器。
write_com(0x80+0x40+10); //光标定位到秒的位置。 write_com(0x0f); //光标开始闪烁。 }
if(key1num==2)
{write_com(0x80+0x40+7); //光标定位到分的位置。} if(key1num==3)
{write_com(0x80+0x40+4); //光标定位到时的位置。} if(key1num==4)
{write_com(0x80+15); //光标定位到星期的位置。} if(key1num==5)
{write_com(0x80+8); //光标定位到日的位置。} if(key1num==6)
{write_com(0x80+5); //光标定位到月的位置。} if(key1num==7)
{write_com(0x80+2); //光标定位到年的位置。} if(key1num==8)
{key1num=0; //记录按键数清0。 write_com(0x0c); //取消光标闪烁。
TR0=1; //启动定时器使时钟开始走。} } }
if(key4==0) {delayms(10); if(key4==0)
{key4num++; //按键值加1。
while(!key4); //等待按键释放。
beep(); //每当有按键释放蜂鸣器发出滴声。 flag=1; //标志进入了闹钟设置。 TR0=0; //关闭定时器 if((flag==1)&&(key4num==1))
{ write_com(0x80+0x40); //标志进入了闹钟设置模式。 write_date('R'); write_date('i');
nz_sec=read_add(8); //首次进入时从24C02中读取出存储的数据。 nz_min=read_add(9); nz_hour=read_add(10); nz_week=read_add(11); nz_day=read_add(12); nz_month=read_add(13);
15
共分享92篇相关文档