📄 2402test.c
字号:
//
print2(0x95,(read_clock(0x81)/16)+0x30);//秒
print2(0x96,(read_clock(0x81)%16)+0x30);
//
print(0x8a," ");//在主显示区空白处写入空格 防止乱码
print(0x8e," ");
print(0xc0," ");
}
/********************************************************************************************
//显示项目 定时时间部分 在第一行全行显示时间
*********************************************************************************************/
void alarm_Display(void){
print(0x80,"AL");
print2(0x82,(AT24C02_Read1Byte(0x05+(rom*10))/16)+0x30);
print2(0x83,(AT24C02_Read1Byte(0x05+(rom*10))%16)+0x30);
print(0x84,"/"); // 显示年
//
print2(0x85,(AT24C02_Read1Byte(0x06+(rom*10))/16)+0x30);
print2(0x86,(AT24C02_Read1Byte(0x06+(rom*10))%16)+0x30);
print(0x87,"/"); // 显示月
//
print2(0x88,(AT24C02_Read1Byte(0x07+(rom*10))/16)+0x30);
print2(0x89,(AT24C02_Read1Byte(0x07+(rom*10))%16)+0x30);
print(0x8b,"["); // 显示[
if(AT24C02_Read1Byte(0x08+(rom*10)) == 0xff){
print(0x8c,"?");
}
else{
print2(0x8c,AT24C02_Read1Byte(0x08+(rom*10))%16); //星期
}
print(0x8d,"]"); // 显示]
print2(0x8f,(AT24C02_Read1Byte(0x09+(rom*10))/16)+0x30);//小时
print2(0x90,(AT24C02_Read1Byte(0x09+(rom*10))%16)+0x30);
print(0x91,":"); // 显示cgram第一个字模":"
//
print2(0x92,(AT24C02_Read1Byte(0x0a+(rom*10))/16)+0x30);//分钟
print2(0x93,(AT24C02_Read1Byte(0x0a+(rom*10))%16)+0x30);
print(0x94,"."); // 显示cgram第一个字模"."
//
print2(0x95,(AT24C02_Read1Byte(0x0b+(rom*10))/16)+0x30);//秒
print2(0x96,(AT24C02_Read1Byte(0x0b+(rom*10))%16)+0x30);
//
print2(0xc0,AT24C02_Read1Byte(0x04+(rom*10))/16+0x30); //显示控制项值//控制项值
print2(0xc1,AT24C02_Read1Byte(0x04+(rom*10))%16+0x30); //
}
/********************************************************************************************
//清屏+刷新显示+延时+清空DT 一体函数
//LRDD()
*********************************************************************************************/
void LRDD (void){
LCM2402_Init();
RealTime_Display();
DelayS(500); DT = 0xff;
}
/********************************************************************************************
//清屏+刷新定时值显示+延时+清空DT 一体函数
//LADD()
*********************************************************************************************/
void LADD (void){
LCM2402_Init();
alarm_Display();
DT = 0xff;
}
/********************************************************************************************
//闹钟呜响查寻程序
//BEEPing();
*********************************************************************************************/
void BEEPing(void){//闹钟呜响查寻程序
uint8 a;
LADD();
print(0xc4,"{Time`s up} AV: OFF");
for(a=0;a<250 && DT == 0xff;a++){
beep_a();////
}
DT = 0xff;
}
/********************************************************************************************
//闹钟和无线遥控的键值处理
//ALARMing();
*********************************************************************************************/
void ALARMing(void){
uint8 alarm_bit;
alarm_bit = AT24C02_Read1Byte(0x03); // 从AT24C02的地址0x03读出定时报警设置数据
if(AT24C02_Read1Byte(0x04+(rom*10)) < 2 && alarm_bit == 1 || alarm_bit == 3){//键值值为0则是闹钟,不为0则是无线控制
if(AT24C02_Read1Byte(0x04+(rom*10)) == 0){
BEEPing();
}else{
beep_y();//
}
}
if(AT24C02_Read1Byte(0x04+(rom*10)) == 0 && alarm_bit == 2 || alarm_bit == 3){
//**这里将写入一个或是调用无线遥控键值处理程序**
}
}
/********************************************************************************************
//定时值校对&处理函数
//search_time()
*********************************************************************************************/
void search_time(void){//整个流程必须在1秒里完成,不然将有部分定时值不响应。
uint8 timeS,s,i;
static unsigned char data alarmS[25];
alarm_con = 0;
s = read_clock(0x81);//读取秒数据
for(i=0;i<25;i++){
alarmS[i] = AT24C02_Read1Byte(0x0B+i*10);//一次性将全部项目中的秒数据送入数组中
}
for(i=0;i<25;i++){
if(alarmS[i] != 0xff){//不为0xff则表示这项已经设置
alarm_con++;//定时项目个数寄存位
if(s == alarmS[i]){
timeS = AT24C02_Read1Byte(0x0a+(i*10));
if(timeS == read_clock(0x83) || timeS == 0xff){//校验 分钟
timeS = AT24C02_Read1Byte(0x09+(i*10));
if(timeS == read_clock(0x85) || timeS == 0xff){//校验 小时
timeS = AT24C02_Read1Byte(0x08+(i*10));
if(timeS == read_clock(0x8b) || timeS == 0xff){//校验 星期
timeS = AT24C02_Read1Byte(0x07+(i*10));
if(timeS == read_clock(0x87) || timeS == 0xff){//校验 日
timeS = AT24C02_Read1Byte(0x06+(i*10));
if(timeS == read_clock(0x89) || timeS == 0xff){//校验 月
timeS = AT24C02_Read1Byte(0x05+(i*10));
if(timeS == read_clock(0x8d) || timeS == 0xff){//校验 年
rom = i;//走到响应的位置
ALARMing();//** 闹钟和无线遥控的键值处理 **
//**这里将调用一个到时的响应程序alarming();
} } } } } } } } } }
/********************************************************************************************
//系统主程序 // 菜单切换
//main()
*********************************************************************************************/
void main (void){
beep_a();
keyboard_int ();
LCM2402_Init();//LCM2402初始化
Init_1302();//检测时钟芯片是否未被初始化
CgramWrite();
print(0x80,"Dy-2402C V1.0 (BETA)");
print(0xc2,"http://www.doyoung.net");
DelayS(5000);
LCM2402_Init();//LCM2402初始化
beep_y();
while(1){//主线程//
//-----------------------------------------------------------------------------0 主显示
if(menu == 0){
RealTime_Display(); //在第一行显示时间部分
print(0xc6," !AL");
print2(0xca,AT24C02_Read1Byte(0x03)+0x30);
print(0xcb," Used: ");
print2(0xd3,alarm_con/16+0x30);
print2(0xd4,alarm_con%16+0x30);
print(0xd5,"/25");
printTemperature();//显示温度
search_time();//定时值校对&处理函数
if (DT != 0xff){
if(DT>=0x00 && DT <0x0a){
uint16 i;
uint8 n=0,x=0xff,y=0xff;
LCM2402_Init();//LCM2402初始化
for(i=0;i<500;i++){
print(0x83,"{ Controller NO. }");
print(0xc3,"{------ ");
print(0xcd," ------}");
if(DT>=0x00 && DT <0x0a){
switch (n){
case 0: x = DT;n++;i=0;break;//
case 1: y = DT;n--;i=0;break;//
}
print2(0xcb,x%16+0x30);
print2(0xcc,y%16+0x30);
beep_k();
DelayS250();
DT = 0xff;
}
if(DT == 0x4C){
print(0xca,"{OK}");
//ALARMing(i);//** 闹钟和无线遥控的键值处理 **
DelayS250();beep_y();DT = 0xff;
}
}
}
if(DT>0x12 && DT <0x17){//当按定时加减查看的几个键时会进入定时查看菜单
beep_y();menu = 2;
}
switch (DT){
uint8 alarm_bit;
case 0x1c: beep_y();menu = 1;break;//
case 0x2F: beep_y();menu =99;break;//
case 0x19: {alarm_bit++;if(alarm_bit>3){alarm_bit=0;};
AT24C02_Write1Byte(0x03,alarm_bit);
DelayS(500);beep_y();break;
}//定时动作选择:0 全关 1 只开闹钟 2 只开控制动作 3 全开
default:DT = 0xff;break;
}
LCM2402_Init();//LCM2402初始化
DT = 0xff;
}
}
//-----------------------------------------------------------------------------1 是否调时?
if(menu == 1){
print(0x80,"Set The Real Time ?");
print(0xc5,"PP: OK AV: Esc");
if (DT != 0xff){
switch (DT){
case 0x1D: beep_n();menu = 0;break;//
case 0x1B: beep_y();menu = 11;break;//
default:DT = 0xff;break;
}
LCM2402_Init();//LCM2402初始化
DT = 0xff;
}
}
//-----------------------------------------------------------------------------2 定时查看
if(menu == 2){
alarm_Display(); //在第一行显示定时部分
print(0xc3,"] NO.");
print2(0xc8,0x30+rom/10);
print2(0xc9,0x30+rom%10);
print(0xce,"STORE: Set");
if (DT != 0xff){
switch (DT){
case 0x18: beep_y();menu = 12;break;//
case 0x13: beep_k();rom++;break;//
case 0x14: beep_k();rom--;break;//
case 0x15: beep_k();rom=rom+5;break;//
case 0x16: beep_k();rom=rom-5;break;//
case 0x1D: beep_n();menu = 0;break;//
default:DT = 0xff;break;
}
if(rom >24 && rom <100){ rom = 0;}//当
if(rom >200){ rom = 24;}
LCM2402_Init();//LCM2402初始化
DT = 0xff;
}
}
//-----------------------------------------------------------------------------99 帮助菜单
if(menu == 99){
uint8 i;
if (DT != 0xff){
if(DT == 0x2F){
i++;
if(i >9){i=0;}
DelayS(500);beep_k();
}
if(DT == 0x1D){
i = 0;
beep_n();menu = 0;
}
LCM2402_Init();//LCM2402初始化
DT = 0xff;
}
switch (i){
case 0: print(0x80,"AV: Esc Help");print(0xc0,"MUTE: Next Help Page");break;//
case 1: print(0x80,"SLEEP: Set The Real Time");print(0xc0,"00~99: Controller NO.");break;//
case 2: print(0x80,"POWER: Key ON/OFF");print(0xc0,"RECALL: Alarm ON/OFF");break;//
case 3: print(0x80,"VOL+/-: Up/Down");print(0xc0,"PR.+/-: Alarm +/-1");break;//
case 4: print(0x80,"F.T.+/-: Alarm +/-5");print(0xc0,"STORE: Set Alarm");break;//
case 5: print(0x80,"-/--: Jumping");print(0xc0,"SEARCH: Set to ??");break;//
case 6: print(0x80,"!AL0: BEEP & ALARM OFF");print(0xc0,"!AL1: Only BEEP ON");break;//
case 7: print(0x80,"!AL2: Only ALARM ON");print(0xc0,"!AL3: BEEP & ALARM ON");break;//
case 8: print(0x80,"PP: OK!");print(0xc0,"AV: Exit/Clean!");break;//
case 9: print(0x81,"DoYoung.net | Dy-2402C");print(0xc5,"V1.0 2007-5-10 ");break;//
default:break;
}
}
//-----------------------------------------------------------------------------11 调时输入
if(menu == 11){
static unsigned char i=0;
bit k;//定义静态
RealTime_Display(); //在第一行显示时间部分
for(i=1;i<8;){//8个时钟数据的循环加位
switch (i){//显示设置项的说明
case 7: print(0xc0,"AV:Esc (Second 00~59)^^");break;//
case 6: print(0xc4,"(Minute 00~59)^^");break;//
case 5: print(0xc3,"(Hour 00~23)^^");break;//
case 4: print(0xcc,"^(Week 1~7)");break;//
case 3: print(0xc8,"^^(Date 01~31)");break;//
case 2: print(0xc5,"^^(Month 01~12)");break;//
case 1: print(0xc2,"^^(Year 00~99) AV:Esc");break;//
}
print(0x97,"?");
if(DT>=0x00 && DT < 0x0a){//DT办数据键码时动作
if(i == 4){//如果是星期设置则不必输入“十位”数据
k = 1;
}
Set_time(i,k);//在这里调用写时间的程序项
if(k==0){//第一次按键输入到“十位”
k = 1;
}
else{//否则是第二次按键,输入到“个位”
k = 0;
i++;
}
LRDD();//清屏+刷新显示+延时+清空DT 一体函数
beep_k();
}
if(DT == 0x11 || DT == 0x17){
i++;
LRDD();
beep_y();
}
if(DT == 0x1A){
i--;if(i < 1){ i =7;};
LRDD();
beep_y();
}
if (DT == 0x1D){//按 AV 键退回到主界面
LRDD();
beep_n();menu = 0;
i = 9;//用于退出上一级的for循环
}
}
}
//-----------------------------------------------------------------------------12 定时值输入
if(menu == 12){
static unsigned char i=0;
bit k;//定义静态
alarm_Display(); //在第一行显示时间部分
for(i=1;i<9;){//8个时钟数据的循环加位
switch (i){//显示设置项的说明
case 8: print(0xc3,"< (Controller 00~99)");break;//
case 7: print(0xc7,"(Second 00~59)^^");break;//
case 6: print(0xc4,"(Minute 00~59)^^");break;//
case 5: print(0xc3,"(Hour 00~23)^^");break;//
case 4: print(0xcc,"^(Week 1~7)");break;//
case 3: print(0xc8,"^^(Date 01~31)");break;//
case 2: print(0xc5,"^^(Month 01~12)");break;//
case 1: print(0xc2,"^^(Year 00~99) AV:Esc");break;//
}
print(0x97,"!");
if(DT>=0x00 && DT < 0x0a || DT == 0x12){//DT办数据键码时动作
if(i == 4 || DT == 0x12){//如果是星期设置则不必输入“十位”数据
k = 1;
}
Set_alarm(rom,i,k);//在这里调用写时间的程序项
if(k==0){//第一次按键输入到“十位”
k = 1;
}
else{//否则是第二次按键,输入到“个位”
k = 0;
i++;
}
LADD();//清屏+刷新显示+延时+清空DT 一体函数
beep_k();
}
switch (DT){//显示设置项的说明
case 0x11: //i++;LADD();break;//// -/-- VOL+ SEARCH 则跳到下一项
case 0x12: //i++;LADD();break;//// -/-- VOL+ SEARCH 则跳到下一项
case 0x17: beep_y();i++;LADD();break;//// -/-- VOL+ SEARCH 则跳到下一项
case 0x1A: beep_y();i--;if(i < 1){ i =8;};LADD();break;////VOL- 跳回上一项 //循环设备
case 0x1D: beep_n();LADD();menu = 0;i = 19;break;////按 AV 键退回到主界面//i = 9;用于退出上一级的for循环
}
}
}
LED1 = 1;//关LED1
}
}
/********************************************************************************************
//日志//
//2007-5-8//这时已经基本完成了除24C02的IC驱动,完成主时间的显示和调整。
//2007-5-10//加入菜单帮助项目
//2007-5-11//加入了25路定时器设置(全部项目),红外遥控器上的所有按键定义完成。
//2007-5-13//V1.0版本完成,整理并存档。
/********************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -