?? 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 + -