数码管时钟电路的设计
d add_data(void)
{
uchar i;
time_data[con]++; //时间数据加1
if(time_data[con]>=10) //个位数据等于10,则个位清零,十位加1
{
time_data[con]=0;time_data[con+1]++;
}
if(flag==0) //如果是分钟数据,判断十位是否到6时,清零
{
if(time_data[con+1]>=6)
{
time_data[con]=0;time_data[con+1]=0;
}
}
if(flag==1) //如果是小时数据,判断是否为24时,清零
{
if(time_data[con+1]==2)
{
if(time_data[con]>=4)
{
time_data[con]=0;time_data[con+1]=0;
}
}
}
for(i=0;i<8;i++) //把调节数据放入显示区
{
dis[i]=time_data[i];
}
dis[8]=0x0a;dis[9]=0x0a; //寄存器中存入熄灭符
}
/***************************************************
* 函 数 名:keyscan()
* 功能描述:对一个按键进行时间扫描
* 函数说明:对按键长短进行比较,从而进行不同的设置
* 调用函数:delay_1s(),scan(),delay_500ms()
* 全局变量:sign,flag
* 输 入 值:无
* 输 出 值:无
* 返 回 值:无
* 设 计 者:zhaojun 日期:2007-9-15
* 修 改 者:zhaojun 日期:2007-9-19
* 版 本:1.0
*****************************************************/
void keyscan(void)
{
if(set==0) //有键按下,判断按键时间
{
delay_1s(); //1s延时程序
if(set==0) //大于1s,进入时间设置
{
ET0=0; TR0=0; //关定时器0
while(set==0) scan(); //等键释放
ET1=1;TR1=1;con=3; //开定时器1,让调整位闪烁
do
{
while(set!=0) scan(); //等待按键
delay_500ms();
if(set!=0) //小于0.5s,进入分钟设置
{
while(set==0) scan(); //等待按键释放
sign=1;
flag=0;
add_data(); //分钟加1
scan();
}
else sign=0; //大于0.5s,进入小时设置
}while(sign);
while(set==0)scan(); //等待按键释放
con=6;
do
{
while(set!=0) scan(); //等待按键
delay_500ms();
if(set!=0) //小于0.5s,进入小时设置
{
while(set==0) scan(); //等待按键释放
sign=1;
flag=1;
add_data(); //小时加1
scan();
}
else sign=0; //大于0.5s,结束时间设置
}while(sign);
ET1=0;TR1=0; //关定时器1
ET0=1;TR0=1; //开定时器0
}
else //小于1s,进入省电模式
{
ET0=1; TR0=1; //开定时器0
while(set!=0); //等待按键
do
{
scan(); //有键按下,调显示程序消抖
}while(set!=0); //是干扰则继续循环
}
while(set==0) scan(); //等待按键释放
}
else ; //无键按下,跳出按键扫描程序
}
/***************************************************
* 函 数 名:clearmen()
* 功能描述:对主程序进行初始化设置
* 函数说明:对显示单元,定时器0、1进行赋初值
* 调用函数:无
* 全局变量:无
* 输 入 值:无
* 输 出 值:无
* 返 回 值:无
* 设 计 者:zhaojun 日期:2007-9-15
* 修 改 者:zhaojun 日期:2007-9-19
* 版 本:1.0
*****************************************************/
void clearmen(void)
{
uchar i;
for(i=0;i<8;i++)
{
dis[i]=time_data[i];
}
TH0=0x3C; TL0=0xB0; //定时器0赋初值
TH1=0x3C; TL1=0xB0; //定时器1赋初值
TMOD=0x11;ET0=1;ET1=1;TR0=1;TR1=0;EA=1;//设置定时器工作方式,开定时器
}
/***************************************************
* 函 数 名:main()
* 功能描述:主程序
* 函数说明:不断进行时间显示和按键扫描
* 调用函数:clearmen(),scan(),keyscan()
* 全局变量:无
* 输 入 值:无
* 输 出 值:无
* 返 回 值:无
* 设 计 者:zhaojun 日期:2007-9-15
* 修 改 者:zhaojun 日期:2007-9-19
* 版 本:1.0
*****************************************************/
void main( )
{
clearmen(); //初始化
while(1)
{
scan(); //时间显示
keyscan(); //按键扫描
}
}
/***************************************************
* 函 数 名:time_intt0()
* 功能描述:T0中断服务程序
* 函数说明:1s计数,并对时间值进行判断
* 调用函数:无
* 全局变量:无
* 输 入 值:无
* 输 出 值:无
* 返 回 值:无
* 设 计 者:zhaojun 日期:2007-9-15
* 修 改 者:zhaojun 日期:2007-9-19
* 版 本:1.0
*****************************************************/
void time_intt0(void) interrupt 1
{
uchar i;
ET0=0;TR0=0; //关T0定时器
TH0=0x3C;TL0=0xB7;//赋初值
TR0=1; //开T0定时器
con_1s++; //1s计数器计数
if(con_1s==20) //1s到,时间加1
{
con_1s=0; //1s计数器值0
time_data[0]++;//秒加1
if(time_data[0]>=10) //秒个位
{
time_data[0]=0;time_data[1]++;
if(time_data[1]>=6) //秒十位
{
time_data[1]=0;time_data[3]++;
if(time_data[3]>=10) //分个位
{
time_data[3]=0;time_data[4]++;
if(time_data[4]>=6) //分十位
{
time_data[4]=0;time_data[6]++;
if(time_data[6]>=10) //时个位
{
time_data[6]=0;time_data[7]++;
}
if(time_data[7]==2) //时十位
{
if(time_data[6]==4) //时个位
{
time_data[6]=0;time_data[7]=0;
}
}
}
}
}
}
for(i=0;i<8;i++) //计时数据放入显示单元
{
dis[i]=time_data[i];
}
dis[8]=0x0a;dis[9]=0x0a; //放入熄灭符
}
ET0=1; //开总中断
}
/***************************************************
* 函 数 名:time_intt1()
* 功能描述:T1中断服务程序
* 函数说明:用以调节时间是的闪烁
* 调用函数:无
* 全局变量:无
* 输 入 值:无
* 输 出 值:无
* 返 回 值:无
* 设 计 者:zhaojun 日期:2007-9-15
* 修 改 者:zhaojun 日期:2007-9-19
* 版 本:1.0
*****************************************************/
void time_intt1(void) interrupt 3
{
EA=0; TR1=0; //关闭定时器
TH1=0x3C; TL1=0xB0; //定时器1赋初值
TR1=1; //开定时器1
con_04s++; //0.4s计数器计数
if(con_04s==8) //到0.4s,赋闪烁值
{
con_04s=0; //0.4s计数器值0
dis[10]=dis[con];dis[con]=dis[8];dis[8]=dis[10];
dis[11]=dis[con+1];dis[con+1]=dis[9];dis[9]=dis[11];
}
EA = 1; //开总中断
}
数码管时钟电 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)