📄 source1.c
字号:
#include <hearder.h>
/*************
函数名称: void T2Init (void )
创建如期: 2008。6。8
功能描述: 定时器初始化
入口参数: uT2Reg: 定时器初始化
返回植: 无
修改日志:
********************/
void T2Init(uint uT2Reg)
{
TMOD = 0X11; //计数器T1, T0定时方式1
to_jishu_chuzhi = uT2Reg;
TL1 = (uT2Reg&0X00FF);
TH1 = (uT2Reg>>8);
TR1 = 1; //启动定时器
ET1 = 1; //T1开中断
EA = 1;
}
/****************************************************
* 入口参数:ucSL[],uint usST[]:音乐频率的数组
* 返回值: 无
* 修改日志:
*****************************************************/
void MusicPlay(uchar ucSL[],uint uST[])
{
uchar i=0;
while((ucSL[i]!=0)||(uST[i]!=0))
{
T2Init(0xffff-uST[i]*((float)11059/(float)12000)); //11。0592M的晶体
g_ucSoundLongCNT=(( MODERAT0*ucSL[i]*1000)/8)/uST[i];
while(g_ucSoundLongCNT!=0)//等待计数器为0
{;}
TR1=0; //暂时善意定时器
i++;
}
}
/***********************************************
* 函数名称:void T2Init(void)
* 创建日期:2005.7.11
* 功能描述:用于音乐的音调半周期定时
* 入口参数:无
* 返回值: 无
* 修改日志:
************************************************/
void TOISR(void)interrupt 3
{
//uchar i;
TL1=to_jishu_chuzhi&0x00ff;
TH1=to_jishu_chuzhi >> 8;
sound = ~sound;
if((g_ucSoundLongCNT)!=0)
{
g_ucSoundLongCNT--;
}
}
/***********************************************
* 函数名称:void sysinit()
* 创建日期:2008.6
* 功能描述:定时器1初始化
* 入口参数:无
* 返回值: 无
* 修改日志:
************************************************/
void sysinit()
{
TMOD = 0x01;//采用方式1
TH0 = -5000 / 256;
TL0 = -5000 % 256;
TR0 = 1;
ET0 = 1;
PT0 = 1; //设置定时器优先级T0>T1
PT1 = 0;
EA = 1;
}
/***********************************************
* 函数名称: void nowsbuf()
* 创建日期:2005.5
* 功能描述:刷新显示缓冲区
* 入口参数:无
* 返回值: 无
* 修改日志:
************************************************/
void nowsbuf()
{
sbuf[0] = minute % 10;
sbuf[1] = (minute / 10) % 6;
sbuf[2] = hour % 10;
sbuf[3] = (hour / 10) % 3;
}
/***********************************************
* 函数名称: void buttontest()
* 创建日期:2005.5
* 功能描述:按键检测
* 入口参数:无
* 返回值: 无
* 修改日志:
************************************************/
void buttontest()
{
if (nowyouxiaostatue < lastyouxiaostatue)
{
if (s1 == 0)
{
now = 1;
s1buttoncount = (s1buttoncount + 1) % 5;
switch (s1buttoncount)
{
case 0:
bitshangshuocontrol = 0xff;
if (timercontrolsbuf == 1)
{
timercontrolsbuf = 0; //取消恢复标志
timertime = hour*100 + minute; //设定定时
seconds = backseconds; //恢复正常时间
minute = backminute;
hour = backhour;
bellcontrol = 1;//设置定时
}
now = 0;
break;
case 1:
bitshangshuocontrol = 0xee; //第一位闪烁
break;
case 2:
bitshangshuocontrol = 0xde; //第二位闪烁
break;
case 3:
bitshangshuocontrol = 0xbe; //第三位闪烁
break;
case 4:
bitshangshuocontrol = 0x7e; //第四位闪烁
break;
}
while (s1 == 0)
{
if (timercontrol == 1) //进入定时
{
timercontrol = 0;
timercontrolsbuf = 1; //设置恢复标志
backhour = hour; //记录当前时间
backminute = minute;
backseconds = seconds;
hour = timertime / 100; //显示当前定时
minute = timertime % 100;
bellcontrol = 0; //取消响铃
s1buttoncount = 1; //从第一位改定时
// bitshangshuocontrol = 0xee;
}
}
}
if (s1buttoncount == 1)
{
bitshangshuocontrol = 0xee; //从第一位改定时
}
if (now == 1 && s2 == 0)
{
switch (s1buttoncount)
{
case 1:
minute = (minute + 1) % 60; //分加一
break;
case 2:
minute = (minute + 10) % 60; //分加十
break;
case 3:
hour = (hour + 1) % 24; //时加一
break;
case 4: //时加十的处理
if (hour > 13)
{
hour = hour - 10;
}
else
{
hour = (hour+ 10) % 24;
}
break;
}
while (s2 == 0) ;
}
if (now == 1 && s3 == 0)
{
switch (s1buttoncount)
{
case 1:
sbuf[0] = sbuf[0] == 0? 9 : sbuf[0] - 1 ; //第一位减1
break;
case 2:
sbuf[1] = sbuf[1] == 0? 5 : sbuf[1] - 1; //第二位减一
break;
case 3:
if (sbuf[2] == 0 && sbuf[3] < 2) //第三位减一
{
sbuf[2] = 9;
}
else
{
if (sbuf[2] == 0 && sbuf[3] == 2)
{
sbuf[2] = 3;
}
else
{
sbuf[2] = sbuf[2] - 1;
}
}
// sbuf[2] = sbuf[2] == 0? 9 : sbuf[2] - 1 ;
break;
case 4:
if (sbuf[3] == 0) //第四位减一
{
if (sbuf[2]<4)
{
sbuf[3] = 2;
}
else
{
sbuf[3] = 1;
}
}
else
{
sbuf[3] = sbuf[3] - 1;
}
// sbuf[3] = sbuf[3] == 0 && sbuf[2]<4? 2 : sbuf[3] - 1;
break;
}
minute = sbuf[0] + sbuf[1]*10; //刷新时间
hour = sbuf[2] + sbuf[3]*10;
while (s3 == 0) ;
}
}
}
/***********************************************
* 函数名称: void timer0() interrupt 1
* 创建日期:2005.5
* 功能描述: 定时器1处理
* 入口参数:无
* 返回值: 无
* 修改日志:
************************************************/
void timer0() interrupt 1
{
TH0 = -5000 / 256; //恢复定时
TL0 = -5000 % 256;
nowstatue = 0x0e & bit_control; //取得按键状态
if (nowstatue == laststatue) //成立时为有效状态
{
nowyouxiaostatue = nowstatue;
}
laststatue = nowstatue; //状态记录前移
count--;
timercount--;
if (timercount == 0) //成立时取按键1的状态
{
timercount = 400;
s1nowshow = s1;
if (s1lastshow == 0 && s1nowshow == 0) // 按键1两次状态为低
{
s1lastshow = 1; // 恢复初植
s1nowshow = 1;
timercontrol = 1; //允许进入定时
}
s1lastshow = s1nowshow; //状态前移
}
shangshuopinnv--;
if (shangshuopinnv == 0) //成立时修改shangshuocontrol实现闪烁
{
shangshuopinnv = 100;
shangshuocontrol = ~shangshuocontrol;
}
if (count == 0) //成立时一秒到达
{
count = 200;
if (now == 0)
{
seconds = (seconds + 1) % 60;
if (seconds == 0)
{
minute = (minute + 1) % 60;
if (minute == 0)
{
hour = (hour + 1) % 24;
}
}
}
}
seg_control = 0xff; //消除影印
/*
if (bitshangshuocontrol == bit_code[nowbitno]) //判断是否闪烁
{
bit_control = ((bit_code[nowbitno] | shangshuocontrol) | 0x0e) & 0xfe; //闪烁显示
}
else
{
bit_control = bit_code[nowbitno]; //位显示
}
*/
if (bellcontrol == 1 && timertime == hour * 100 + minute) //响铃时保证正常显示
{
nowsbuf();
}
bit_control = ((bit_code[nowbitno] | (shangshuocontrol & (~bitshangshuocontrol)))| 0x0e) & 0xfe; //一步到位
seg_control = seg_code[sbuf[nowbitno]];//段显示
nowbitno = (nowbitno + 1) % 4; //位移动
}
/***********************************************
* 函数名称: void belltest()
* 创建日期:2005.5
* 功能描述:定时判断
* 入口参数:无
* 返回值: 无
* 修改日志:
************************************************/
void belltest()
{
if (bellcontrol == 1 && timertime == hour * 100 + minute) //成立时响铃
{
MusicPlay(SOUNDLONG1, SOUNDTONE1);
bellcontrol = 0; //保证只响一次
}
}
/***********************************************
* 函数名称: void main()
* 创建日期:2005.5
* 功能描述:主程序
* 入口参数:无
* 返回值: 无
* 修改日志:
************************************************/
void main()
{
sysinit();
while (1)
{
nowsbuf();
buttontest();
belltest();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -