以下是我当年设计的希望能给你一些启发 << 电子闹钟程序 > >
// 程序作者:08级电气智能自动控制技术专业----赵永建 CYJMCU@HOTMAIL.COM
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
uchar code tablehige[]=" 2010-01-01";
uchar code tabledown[]=" 00:00:00";
sbit rs=P3^7;
sbit en=P3^6;
void delay(uint);
void keyscan();
void init();
void com(uchar);
void date(uchar date);
void autowritetime(uchar add,uchar time);
void autowritedate(uchar add,uchar date1);
char num,sec,min,hour,day,month,year;
uint count,key1num;
sbit key1=P0^7;
sbit key2=P0^6;
sbit key3=P0^5;
sbit keyrs=P0^4;
//======================================================================================================================
void main() //主程序
{
init();
while(1)
{
keyscan();
}
}
//===========================================================================================================================
void delay(uint x) //延时程序
{
uint i,j;
for(i=x;i>0;i--)
for(j=110;j>0;j--);
}
//-===================================================
void init() //上电初始化
{
en=0;
com(0x38);//设置16*2显示,5*7点阵,8位数据接口
com(0x0e);//设置 开显示 、显示光标
com(0x06);//设置 当读或写一个字符后地址指针加1,且光标加一 ;
//当写一个字符时,整屏显示左移(N=1)或右移(N=0),得到光标不动而屏幕移动的效果
com(0x01);//显示清0,数据指针清0
//--------------
com(0x80);//将数据指针定位到第一行第一个字处
for(num=0;num<13;num++) // 上半部分显示为 日期 年:月:日
{
date(tablehige[num]);
delay(50);
}
//-------------------------------
com(0x80+0x40);
for(num=0;num<12;num++)
{
date(tabledown[num]); //显示下半部分为 具体时间 时:分:秒
delay(50);
}
TMOD=0x01;
TL0=(65536-50000)/256; //定时器中断
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
}
//=============================================================
void com(uchar com) //控制初始化子程序
{
rs=0;
P2=com;
delay(5);
en=1;
delay(5);
en=0;
}
//========================================================
void date(uchar date) //数据初始化子程序
{
rs=1;
P2=date;
delay(5);
en=1;
delay(5);
en=0;
}
//===============================================================
void time() interrupt 1
{
TH0=(65536-50000)/256; //中断子程序
TL0=(65536-50000)/256;
count++;
if(count==18)//***************************** time min
{
sec++; //秒
count=0;
//----------------------------
if(sec==60)
{
sec=0;
min++; //分
//-----------------------
if(min==60)
{
min=0;
hour++; //时
if(hour==24)
{
hour=0;
day++; //日
if(day==31)
{
day=0;
month++; //月
if(month==12)
{
month=0;
year++; //年
autowritedate(5,year); // year auto write**
}
autowritedate(8,month); // month auto write **
}
autowritedate(11,day); // day auto write **
}
autowritetime(4,hour); // hour auto write
}
autowritetime(7,min); // min auto write
}
autowritetime(10,sec); // sec auto write
}
}
//=======================================================
void autowritetime(uchar add,uchar time)
{
uchar shi,ge; //下行时间 数据,地址自动写入程序
shi=time/10;
ge=time%10;
com(0x80+0x40+add);
date(0x30+shi);
date(0x30+ge);
}
//==================================================================
// 上行 月,日 数据地址自动写入程序 //
void autowritedate(uchar add,uchar date1)
{
uchar yue,ri;
yue=date1/10;
ri=date1%10;
com(0x80+add);
date(0x30+yue);
date(0x30+ri);
}
//======================================================
/*按键扫描程序段*/
void keyscan()
{
keyrs=0;
if(key1==0)
{
delay(5);
if(key1==0) //KEY1选定需要调节的时间
{
key1num++;
while(!key1);
TR0=0;
com(0x80+0x40+11); //当前光标闪烁位置为 秒 调节
com(0x0f); //主要是使光标闪烁
}
//-----------------------------------------------
if(key1num==2)
{
com(0x80+0x40+8); //当前光标闪烁位置为 分
}
//-----------------------------------------
if(key1num==3)
{
com(0x80+0x40+5); //当前光标闪烁位置为 时
}
//---------------------------------------------------
if(key1num==4)
{
com(0x80+12); //当前光标闪烁位置为 日
}
if(key1num==5)
{
com(0x80+9); //当前光标闪烁位置为 月
}
if(key1num==6)
{
com(0x80+6); //当前光标闪烁位置为 年
}
if(key1num==7)
{
key1num=0;
com(0x0c); //光标停止闪烁
TR0=1; //定时器启动
}
}
if(key1num!=0)
{
//数字递增按键 KEY2//
if(key2==0)
delay(5);
if(key2==0)
{
while(!key2);
if(key1num==1)
{
sec++;
if(sec==60)
sec=0;
autowritetime(10,sec); //秒 ++
com(0x80+0x40+10);
}
if(key1num==2)
{
min++;
if(min==60)
min=0;
autowritetime(7,min); //分 ++
com(0x80+0x40+7);
}
if(key1num==3)
{
hour++;
if(hour==24)
hour=0;
autowritetime(4,hour); //时 ++
com(0x80+0x40+4);
}
if(key1num==4)
{
day++;
if(day==31)
day=1;
autowritedate(11,day); // 日 ++
com(0x80+12);
}
if(key1num==5)
{
month++;
if(month==13)
month=1;
autowritedate(8,month); //月 ++
com(0x80+8);
}
if(key1num==6)
{
year++;
if(year==99)
year=00;
autowritedate(5,year); // 年 ++
com(0x80+5);
}
}
//---------------------------------------------
//递减功能按键 KEY3//
if(key3==0)
delay(5);
if(key3==0)
{
while(!key3);
if(key1num==1)
{
sec--;
if(sec==-1)
sec=59;
autowritetime(10,sec);
com(0x80+0x40+10);
}
if(key1num==2)
{
min--;
if(min==-1)
min=59;
autowritetime(7,min); //分 - -
com(0x80+0x40+7);
}
if(key1num==3)
{
hour--;
if(hour==-1) //时 - -
hour=23;
autowritetime(4,hour);
com(0x80+0x40+4);
}
if(key1num==4)
{
day--;
if(day==0)
day=31;
autowritedate(11,day); // 日 - -
com(0x80+11);
}
if(key1num==5)
{
month--;
if(month==0)
month=12;
autowritedate(8,month); // 月 - -
com(0x80+8);
}
if(key1num==6)
{
year--;
if(year==00)
year=99;
autowritedate(5,year); //年 - -
com(0x80+5);
}
}
}
}
//==========================================================================================================================
//程序说明:核心CPU选为STC89C52,控制1602液晶屏显示时间及其一些功能!!!
// key1:功能键 key2:增加 key3:减少
//
//
//
//
//
//程序作者 : 08级电气自动化专业 赵永建
// 年:year 月:month 日:day 时:hour 分:min 秒:sec
CYJMCU@HOTMAIL.COM
当年我设计的闹钟 利用1602液晶屏显示的闹钟 |