📄 main.c
字号:
/******************************************************
带红外控制的LCD时间控制器
zhaojun 2007/12/20
******************************************************/
#include"config.h" // 系统设置
main()
{
LCMInit();//初始化LCD
Clearmen();//初始化系统
Mychar();//写入自定义字符
while(1)
{
if(CLED==0)// 有闹铃标志
{
Display(2);
Display(6);
Ctrlaction();//到点比较函数
}
else // 无闹铃标志
{
Display(1);
Display(6);
}
if(DLED==0)Integral_point_time();//整点报时
//
Keyscan(); // 手动按键扫描
Telecontrol(); // 遥控按键扫描
}
}
/****************************** 遥控部分 ***********************************************/
/*****************************************************
函 数 名:void Telecontrol(void)
功 能:遥控按键扫描
说 明:
入口参数:
返 回 值:无
*****************************************************/
void Telecontrol(void)
{
if(IRCOM[2]==0x15)//TIME:当前时间设置
{
IRCOM[2]=0xff;
Tp_set_time();
}
if(IRCOM[2]==0x1c)//R/L:整点报时
{
IRCOM[2]=0xff;
DLED=~DLED;
}
if(IRCOM[2]==0x0c)//P/N:闹铃控制开关
{
IRCOM[2]=0xff;
CLED=~CLED;
}
if(IRCOM[2]==0x16)//RETURN:闹铃设置
{
IRCOM[2]=0xff;
Tp_set_ctrltime();
}
if(IRCOM[2]==0x16)//||:继电器
{
IRCOM[2]=0xff;
RELAY=~RELAY;// 继电器取反
YLED=~YLED; // 指示灯指示
}
}
/*****************************************************
函 数 名:void Tp_set_time(void)
功 能:遥控设置时间
说 明:
入口参数:
返 回 值:无
*****************************************************/
void Tp_set_time(void)
{
bit mark=1;
ET0=0;TR0=0; // 关定时器0
do
{
NewTime[2]=0x3a;NewTime[5]=0x3a;//写入冒号
sec=0;NewTime[6]=0x30;NewTime[7]=0x30;//秒钟值放入显示缓冲
Display(3);Display(6);
if(IRCOM[2]==0x0e)//小时加1
{
IRCOM[2]=0xff;
hour++;NewTime[0]=hour/10+0x30;NewTime[1]=hour%10+0x30;//小时值放入显示缓冲
Display(3);Display(6);
if(hour>=24)
{
hour=0;NewTime[0]=0x30;NewTime[1]=0x30;
Display(3);Display(6);
}
}
if(IRCOM[2]==0x1a)// 分钟加1
{
IRCOM[2]=0xff;
min++;NewTime[3]=min/10+0x30;NewTime[4]=min%10+0x30;//小时值放入显示缓冲
Display(3);Display(6);
if(min>=60)//分钟加
{
min=0;NewTime[3]=0x30;NewTime[4]=0x30;//分钟值放入显示缓冲
Display(3);Display(6);
}
}
if(IRCOM[2]==0x0f)//结束设置
{
IRCOM[2]=0xff;
ET0=1;TR0=1;mark=0;//调时结束,开定时器0
}
}while(mark);
}
/*****************************************************
函 数 名:void Tp_set_ctrltime(void)
功 能:设置闹铃时间
说 明:
入口参数:无
返 回 值:无
*****************************************************/
void Tp_set_ctrltime(void)
{
bit mark=1;
do
{
Display(4);Display(7);
if(IRCOM[2]==0x0A) // 小时加
{
IRCOM[2]=0xff;
DelayMs(5);while(K2==0);//消抖,等按键K2释放
armhour++;CtrlTime[0]=armhour/10+0x30;CtrlTime[1]=armhour%10+0x30;//小时清零
Display(4);Display(7);
if(armhour>=24)
{
armhour=0;CtrlTime[0]=0x30;CtrlTime[1]=0x30;
Display(4);Display(7);
}
}
if(IRCOM[2]==0x1E) // 分钟加
{
IRCOM[2]=0xff;
DelayMs(5);while(K3==0);//消抖,等按键K3释放
armmin++;CtrlTime[3]=armmin/10+0x30;CtrlTime[4]=armmin%10+0x30;
Display(4);Display(7);
if(armmin>=60)//分钟加
{
armmin=0;CtrlTime[3]=0x30;CtrlTime[4]=0x30;//分钟清零
Display(4);Display(7);
}
}
if(IRCOM[2]==0x0F) // 调时结束
{
IRCOM[2]=0xff;
mark=0; // 调时结束,开定时器0
}
}while(mark);
}
/*****************************************************
函 数 名:void Ctrlaction(void)
功 能:闹铃时间比较函数
说 明:
入口参数:
返 回 值:无
*****************************************************/
void Ctrlaction(void)
{
if(armhour==hour) //如果小时相等,则比较分钟
{
if(armmin==min) // 如果分钟相等
{
CLED=1;
RELAY=~RELAY;// 继电器去取反
YLED=~YLED; // 继电器工作指示灯取反
Display(5);Display(7);//显示闹铃时间
Led_hint(); // LED闪烁
Buzzer();Buzzer();// 蜂鸣器报警
Delay400Ms();Delay400Ms();
Buzzer();// 蜂鸣器报警
Delay400Ms();Delay400Ms();
}
}
}
/****************** 手动控制部分 ************************************/
/*****************************************************
函 数 名:void Keyscan(void)
功 能:按键扫描
说 明:不同的按键进入不同的项目
入口参数:
返 回 值:无
*****************************************************/
void Keyscan(void)
{
/* ******** 当前时间设置 *******************/
if(K1==0)
{
DelayMs(5);while(K1==0);//消抖
Set_time(); //调用设置当前时间函数
}
/********** 整点报时控制开关 ******************/
if(K2==0)
{
DelayMs(5);while(K2==0);//消抖
DLED=~DLED;//整点报时标志取反
}
/******* 闹铃控制开关 *********************/
if(K3==0)
{
DelayMs(5);while(K3==0);//消抖
Ctrl_on_or_off();//闹铃控制开关
}
/******* 闹铃时间设置 ***********************/
if(K4==0)
{
DelayMs(5);while(K4==0);//消抖
Set_ctrltime();//设置闹铃时间函数
}
/******** 手动开关 ********************/
/* if(K5==0)
{
DelayMs(5);while(K5==0);//消抖
Manual();
} */
}
/*****************************************************
函 数 名:void Set_time(void)
功 能:设置当前时间:K2-小时加1;K3-分钟加1;K1-推出
说 明:在正常工作情况下按K1键,进入此函数
入口参数:无
返 回 值:无
*****************************************************/
void Set_time(void)
{
bit mark=1;
ET0=0;TR0=0; // 关定时器0
do
{
NewTime[2]=0x3a;NewTime[5]=0x3a;//写入冒号
sec=0;NewTime[6]=0x30;NewTime[7]=0x30;//秒钟值放入显示缓冲
Display(3);Display(6);
if(K2==0) // 小时加
{
Buzzer();DelayMs(5);while(K2==0);//消抖,等按键K2释放
hour++;NewTime[0]=hour/10+0x30;NewTime[1]=hour%10+0x30;//小时值放入显示缓冲
Display(3);Display(6);
if(hour>=24)
{
hour=0;NewTime[0]=0x30;NewTime[1]=0x30;
Display(3);Display(6);
}
}
if(K3==0)// 分钟加
{
Buzzer();DelayMs(5);while(K3==0); //消抖,等按键K3释放
min++;NewTime[3]=min/10+0x30;NewTime[4]=min%10+0x30;//小时值放入显示缓冲
Display(3);Display(6);
if(min>=60)//分钟加
{
min=0;NewTime[3]=0x30;NewTime[4]=0x30;//分钟值放入显示缓冲
Display(3);Display(6);
}
}
if(K1==0) // 调时结束
{
Buzzer();Buzzer();DelayMs(5);while(K1==0);
ET0=0;TR0=0;mark=0;//调时结束,开定时器0
}
}while(mark);
}
/*****************************************************
函 数 名:void Integral_point_time(void)
功 能:整点报时:K2-进出
说 明:在正常工作情况下按K2键,进入此函数
入口参数:无
返 回 值:无
*****************************************************/
void Integral_point_time(void)
{
if(sec==0)
{
if(min==0)
{
Buzzer();
}
}
}
/*****************************************************
函 数 名:void Ctrl_on_or_off(void)
功 能:闹铃控制开关
说 明:在正常工作情况下按K3键,进入此函数
入口参数:
返 回 值:无
*****************************************************/
void Ctrl_on_or_off(void)
{
CLED=~CLED;
if(CLED==0){Buzzer();Buzzer();} //闹铃开响两声
else Buzzer();//闹铃关响一声
}
/*****************************************************
函 数 名:void Set_ctrltime(void)
功 能:设置闹铃时间:K2-小时加1;K3-分钟加1;K4-推出
说 明:在正常工作情况下按K4键,进入此函数
入口参数:无
返 回 值:无
*****************************************************/
void Set_ctrltime(void)
{
bit mark=1;
do
{
Display(4);Display(7);
if(K2==0) // 小时加
{
Buzzer();DelayMs(5);while(K2==0);//消抖,等按键K2释放
armhour++;CtrlTime[0]=armhour/10+0x30;CtrlTime[1]=armhour%10+0x30;//小时清零
Display(4);Display(7);
if(armhour>=24)
{
armhour=0;CtrlTime[0]=0x30;CtrlTime[1]=0x30;
Display(4);Display(7);
}
}
if(K3==0) // 分钟加
{
Buzzer();DelayMs(5);while(K3==0);//消抖,等按键K3释放
armmin++;CtrlTime[3]=armmin/10+0x30;CtrlTime[4]=armmin%10+0x30;
Display(4);Display(7);
if(armmin>=60)//分钟加
{
armmin=0;CtrlTime[3]=0x30;CtrlTime[4]=0x30;//分钟清零
Display(4);Display(7);
}
}
if(K4==0) // 调时结束
{
Buzzer();Buzzer();DelayMs(5);while(K4==0);// 消抖
mark=0; // 调时结束,开定时器0
CLED=0; // 控制指示灯亮
}
}while(mark);
}
/*****************************************************
函 数 名:void Manual(void)
功 能:手动控制继电器开关
说 明:在正常工作情况下按K5键,进入此函数
入口参数:
返 回 值:无
*****************************************************/
/*void Manual(void)
{
Buzzer();
RELAY=~RELAY;// 继电器取反
YLED=~YLED; // 指示灯指示
}*/
/****************** 手动控制部分结束 ************************************/
/*****************************************************
函 数 名:void Display(uchar num)
功 能:显示设置
说 明:对LCD要显示的数据进行选择
入口参数:num为对应显示数据
返 回 值:无
*****************************************************/
void Display(uchar num)
{
switch(num)
{
// 第一行要显示的数据
case 1: Tp[0]=0x02;Read_Temperature();Transport(0,Tp);break;// 显示温度数据,无闹铃
case 2: Tp[0]=0x00;Read_Temperature();Transport(0,Tp);break;// 显示温度数据,有闹铃
case 3: DisplayListChar(0,0,"SET_TIME");break; // 显示当前时间设置提示"SET_TIME"
case 4: DisplayListChar(0,0,"SET_CTRL");break; // 显示控制时间设置提示"SET_CTRL"
case 5: DisplayListChar(0,0,"CTRLTIME");break; // 查看控制时间提示"CTRLTIME"
// 第二行要显示的数据
case 6: Transport(1,NewTime);break; // 显示当前时间
case 7: Conversion();Transport(1,CtrlTime);break; // 显示控制时间
// 清零
default:break;
}
}
/*****************************************************
函 数 名:Transport(bit line,uchar arr[])
功 能:传送显示数据
说 明:项目需要显示的各种数据都是通过此函数传送的
入口参数:line为行选择;arr[]显示数据
返 回 值:无
*****************************************************/
void Transport(bit mark,uchar arr[])
{
uchar i;
for(i=0;i<8;i++)
{
DisplayOneChar(i,mark,arr[i]); // 写入数据
}
}
/*****************************************************
函 数 名:void Conversion(void)
功 能:将闹铃数据转换到显示数据中
说 明:
入口参数:
返 回 值:无
*****************************************************/
void Conversion(void)
{
CtrlTime[0]=armhour/10+0x30;CtrlTime[1]=armhour%10+0x30;
CtrlTime[3]=armmin/10+0x30;CtrlTime[4]=armmin%10+0x30;//小时值放入显示缓冲
}
/*****************************************************
函 数 名:void time_intt0(void) interrupt 1
功 能:T0时钟中断函数
说 明:秒计数0
入口参数:无
返 回 值:无
*****************************************************/
void time_intt0(void) interrupt 1 using 1
{
ET0=0;TR0=0; //关T0定时器
ET1=0;TR1=0; //关T1定时器,停止时间闪烁标志
TH0=0x3C;TL0=0xB7;//赋初值
TR0=1;TR1=1; //开T0定时器
con_1s++; //1s计数器计数
if(con_1s==20) //1s到,时间加1
{
con_1s=0; //1s计数器值0
sec++;
if(sec>=60)
{
sec=0;min++;
if(min>=60)
{
min=0;hour++;
if(hour>=24)
{
hour=0;
}
}
}
NewTime[0]=hour/10+0x30;NewTime[1]=hour%10+0x30;//小时值放入显示缓冲
NewTime[3]=min/10+0x30;NewTime[4]=min%10+0x30;//分钟值放入显示缓冲
NewTime[6]=sec/10+0x30;NewTime[7]=sec%10+0x30;//秒钟值放入显示缓冲
}
ET0=1; ET1=1;
}
/*****************************************************
函 数 名:void time_intt1(void) interrupt 3 using 2
功 能:T1时钟中断函数
说 明:秒计数闪烁
入口参数:无
返 回 值:无
*****************************************************/
void time_intt1(void) interrupt 3 using 2
{
ET1=0;TR1=0; //关T0定时器
TH1=0x3C;TL1=0xB7;//赋初值
TR1=1; //开T0定时器
con_500ms++; //1s计数器计数
if(con_500ms==10)
{
con_500ms=0;
flag=~flag;WLED=~WLED;
if(flag==0)//闪烁标志
{NewTime[2]=0x3a;NewTime[5]=0x3a;}
else
{NewTime[2]=0x20;NewTime[5]=0x20;}
}
ET1=1;
}
//======================================= 指示函数部分 ===============================================
/*****************************************************
函 数 名:void Led_hint(void)
功 能:LED工作指示程序
说 明:对按键及密码的输入结果进行指示
入口参数:无
返 回 值:无
*****************************************************/
void Led_hint(void)
{
WLED=0;
DelayMs(50);
WLED=1;
DelayMs(50);
}
/*****************************************************
函 数 名:void Delay400Ms()
功 能:400ms延时
说 明:对显示进行延时
入口参数:无
返 回 值:无
*****************************************************/
//400ms延时
void Delay400Ms(void)
{
uchar TempCycA = 5;
uint TempCycB;
while(TempCycA--)
{
TempCycB=7269;
while(TempCycB--);
};
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -