?? lesson10.c
字號:
ET1 = 1;//使能T1
TR1 = 1;//啟動T1
EX0 = 1;//使能外部中斷0
break;
case 0xA3://顯示所有產量(記錄值)總和
beep = 0;//提示鍵盤按下
delay(50,100);
beep = 1;
uc_device_addr = 0xA0;//0xA0=1010 0000B, 1010is the device number,000 is the A2A1A0 hard wired, 0 write.
for(j = 1;j < 7;j++)
{
uc_device_sub_addr = 0x00 + ((j) << 3);//EEPROM 首地址
IRcvStr(uc_device_addr,uc_device_sub_addr,g_uc_data_receive,3);//以頁方式讀取//讀出的數據保存在數組g_uc_data_receive中
temp += g_uc_data_receive[2];
}
g_uc_hr_cnt = 0xFF;//不顯示
g_uc_min_cnt = temp >> 8;//顯示數據的高8位
g_uc_sec_cnt = temp & 0x00FF;//顯示數據的低8位
if((g_uc_sec_cnt&0x0F) > 9)//總和的結果應該以10進制的形式顯示給用戶
{
temp = (g_uc_sec_cnt&0xF0) + 1;
g_uc_sec_cnt = (temp << 4) + ((g_uc_sec_cnt&0x0F) - 10);
}
display_led(g_uc_hr_cnt ,g_uc_min_cnt ,g_uc_sec_cnt);
break;
case 0xA4://模擬斷電保存//斷電時保存地址:0x40
ET0 = 0;//禁止T0
ET1 = 0;
TR0 = 0;//停止T0
TR1 = 0;
EX0 = 0;//禁止外部中斷0
beep = 0;//提示鍵盤按下
delay(50,100);
beep = 1;
uc_device_addr = 0xA0;//0xA0=1010 0000B, 1010is the device number,000 is the A2A1A0 hard wired, 0 write.
uc_device_sub_addr = 0x40;//斷電保存數據的EEPROM地址
g_uc_data_send[0] = g_st_current_time.min;//斷電時間
g_uc_data_send[1] = g_st_current_time.sec;
g_uc_data_send[2] = g_uc_log_number;//斷電時刻的記錄
ISendStr(uc_device_addr,uc_device_sub_addr,g_uc_data_send,3);//以頁方式讀取//讀出的數據保存在數組g_uc_data_receive中
break;
case 0xA5:
ET0 = 0;//禁止T0
ET1 = 0;
TR0 = 0;//停止T0
TR1 = 0;
EX0 = 0;//禁止外部中斷0
time1_serial_init();
for(j = 0;j < 7;j++)
{
uc_device_addr = 0xA0;//0xA0=1010 0000B, 1010is the device number,000 is the A2A1A0 hard wired, 0 write.
uc_device_sub_addr = 0x00 + ((g_uc_recv_serial_cnt) << 3);
IRcvStr(uc_device_addr,uc_device_sub_addr,g_uc_data_receive,3);
memcpy(uc_temp_receive[j],g_uc_data_receive,3);
}
TR1 = 1;//start the timer1, not enable T1 interrupt
ES = 1;//enable serial interrupt
g_uc_sec_cnt = 0xAA;
g_uc_min_cnt = 0xAA;
g_uc_hr_cnt = 0xA2;
display_led(g_uc_hr_cnt,g_uc_min_cnt,g_uc_sec_cnt);//display "1",ready for receive the serial data
while(g_uc_recv_serial_cnt < 7)//waiting for 11 times serial interrupt
{
_nop_();
}
g_uc_recv_serial_cnt = 0;
ES = 0;//mask the serial interrupt
EA = 0;//mask all interrupt
g_uc_sec_cnt = 0xA3;
g_uc_min_cnt = 0xAA;
g_uc_hr_cnt = 0xAA;
display_led(g_uc_hr_cnt,g_uc_min_cnt,g_uc_sec_cnt);//display "1",ready for receive the serial data
beep = 0;//提示鍵盤按下
delay(50,100);
beep = 1;
/*for(j = 1;j < 7;j++)//send data to IBM
{
//uc_device_addr = 0xA0;//0xA0=1010 0000B, 1010is the device number,000 is the A2A1A0 hard wired, 0 write.
//uc_device_sub_addr = 0x00 + ((j) << 3);
//IRcvStr(uc_device_addr,uc_device_sub_addr,g_uc_data_receive,3);
//SBUF = g_uc_data_receive[0];
SBUF = 0x30;
while(TI == 0)
{
delay(3,255);
}
TI = 0;
SBUF = 0x31;
while(TI == 0)
{
delay(3,255);
}
TI = 0;
SBUF = 0x32;
while(TI == 0)
{
delay(3,255);
}
TI = 0;
beep = 0;
delay(50,100);
beep = 1;
}*/
/*SBUF = 0x21;//發送回車,提示PC數據發送完畢
while(TI == 0)
{
delay(3,255);
}
TI = 0;*/
beep = 0;//提示鍵盤按下
delay(50,100);
beep = 1;
break;
case 0xB0://顯示當前記錄
TR0 = 0;//暫停T0
beep = 0;//提示鍵盤按下
delay(50,100);
beep = 1;
g_uc_hr_cnt = 0xFF;
g_uc_min_cnt = 0xFF;
g_uc_sec_cnt = g_uc_log_number;
display_led(g_uc_hr_cnt ,g_uc_min_cnt ,g_uc_sec_cnt);
delay(255,255);
delay(255,255);
delay(255,255);
g_st_current_time.sec += 2;//給時鐘進行時間補償2s
TR0 = 1;//重新啟動T0
break;
case 0xB1://第1段存放密碼,從第2段開始存放采集的記錄值
uc_device_addr = 0xA0;//0xA0=1010 0000B, 1010is the device number,000 is the A2A1A0 hard wired, 0 write.
uc_device_sub_addr = 0x00 + ((1) << 3);//EEPROM 首地址
IRcvStr(uc_device_addr,uc_device_sub_addr,g_uc_data_receive,3);//以頁方式讀取//讀出的數據保存在數組g_uc_data_receive中
g_uc_hr_cnt = g_uc_data_receive[0];
g_uc_min_cnt = g_uc_data_receive[1];
g_uc_sec_cnt = g_uc_data_receive[2];
display_led(g_uc_hr_cnt ,g_uc_min_cnt ,g_uc_sec_cnt);
beep = 0;//連續發聲
delay(50,100);
beep = 1;
break;
case 0xB2:
uc_device_addr = 0xA0;//0xA0=1010 0000B, 1010is the device number,000 is the A2A1A0 hard wired, 0 write.
uc_device_sub_addr = 0x00 + ((2) << 3);//EEPROM 首地址
IRcvStr(uc_device_addr,uc_device_sub_addr,g_uc_data_receive,3);//以頁方式讀取//讀出的數據保存在數組g_uc_data_receive中
g_uc_hr_cnt = g_uc_data_receive[0];
g_uc_min_cnt = g_uc_data_receive[1];
g_uc_sec_cnt = g_uc_data_receive[2];
display_led(g_uc_hr_cnt ,g_uc_min_cnt ,g_uc_sec_cnt);
beep = 0;//連續發聲
delay(50,100);
beep = 1;
break;
case 0xB3:
uc_device_addr = 0xA0;//0xA0=1010 0000B, 1010is the device number,000 is the A2A1A0 hard wired, 0 write.
uc_device_sub_addr = 0x00 + ((3) << 3);//EEPROM 首地址
IRcvStr(uc_device_addr,uc_device_sub_addr,g_uc_data_receive,3);//以頁方式讀取//讀出的數據保存在數組g_uc_data_receive中
g_uc_hr_cnt = g_uc_data_receive[0];
g_uc_min_cnt = g_uc_data_receive[1];
g_uc_sec_cnt = g_uc_data_receive[2];
display_led(g_uc_hr_cnt ,g_uc_min_cnt ,g_uc_sec_cnt);
beep = 0;//連續發聲
delay(50,100);
beep = 1;
break;
case 0xB4:
uc_device_addr = 0xA0;//0xA0=1010 0000B, 1010is the device number,000 is the A2A1A0 hard wired, 0 write.
uc_device_sub_addr = 0x00 + ((4) << 3);//EEPROM 首地址
IRcvStr(uc_device_addr,uc_device_sub_addr,g_uc_data_receive,3);//以頁方式讀取//讀出的數據保存在數組g_uc_data_receive中
g_uc_hr_cnt = g_uc_data_receive[0];
g_uc_min_cnt = g_uc_data_receive[1];
g_uc_sec_cnt = g_uc_data_receive[2];
display_led(g_uc_hr_cnt ,g_uc_min_cnt ,g_uc_sec_cnt);
beep = 0;//連續發聲
delay(50,100);
beep = 1;
break;
case 0xB5:
uc_device_addr = 0xA0;//0xA0=1010 0000B, 1010is the device number,000 is the A2A1A0 hard wired, 0 write.
uc_device_sub_addr = 0x00 + ((5) << 3);//EEPROM 首地址
IRcvStr(uc_device_addr,uc_device_sub_addr,g_uc_data_receive,3);//以頁方式讀取//讀出的數據保存在數組g_uc_data_receive中
g_uc_hr_cnt = g_uc_data_receive[0];
g_uc_min_cnt = g_uc_data_receive[1];
g_uc_sec_cnt = g_uc_data_receive[2];
display_led(g_uc_hr_cnt ,g_uc_min_cnt ,g_uc_sec_cnt);
beep = 0;//連續發聲
delay(50,100);
beep = 1;
break;
case 0xB6:
uc_device_addr = 0xA0;//0xA0=1010 0000B, 1010is the device number,000 is the A2A1A0 hard wired, 0 write.
uc_device_sub_addr = 0x00 + ((6) << 3);//EEPROM 首地址
IRcvStr(uc_device_addr,uc_device_sub_addr,g_uc_data_receive,3);//以頁方式讀取//讀出的數據保存在數組g_uc_data_receive中
g_uc_hr_cnt = g_uc_data_receive[0];
g_uc_min_cnt = g_uc_data_receive[1];
g_uc_sec_cnt = g_uc_data_receive[2];
display_led(g_uc_hr_cnt ,g_uc_min_cnt ,g_uc_sec_cnt);
beep = 0;//連續發聲
delay(50,100);
beep = 1;
break;
case 0xB7:
uc_device_addr = 0xA0;//0xA0=1010 0000B, 1010is the device number,000 is the A2A1A0 hard wired, 0 write.
uc_device_sub_addr = 0x00 + ((7) << 3);//EEPROM 首地址
IRcvStr(uc_device_addr,uc_device_sub_addr,g_uc_data_receive,3);//以頁方式讀取//讀出的數據保存在數組g_uc_data_receive中
g_uc_hr_cnt = g_uc_data_receive[0];
g_uc_min_cnt = g_uc_data_receive[1];
g_uc_sec_cnt = g_uc_data_receive[2];
display_led(g_uc_hr_cnt ,g_uc_min_cnt ,g_uc_sec_cnt);
beep = 0;//連續發聲
delay(50,100);
beep = 1;
break;
default:
break;
}
}
}
uc_keypad_response_flag = 0;//for single key press
}
/*************************************************/
/*name:keypad_response_single()
function:response to the key single number
input:uc_key_number*/
/*************************************************/
void keypad_response_single(uchar key_number)
{
data uchar k;
while(!(ACC == 0x87))//release the key//P1.7 for beep!
{
delay(2,255);
P1 = 0x87;
ACC = P1;
ACC &= 0X87;
}
for(k=0;k<=11;k++)
{
if(key_number == g_uc_key_number_all[k])
break;
}
switch(k)
{
case 10:/*A*/
break;
case 11:/*B*/
break;
default:/*k = 0~9*/
if(g_uc_disp_cnt < 7)//the maximal number is 6
{
g_uc_disp_cnt++;
switch(g_uc_disp_cnt)
{
case 1:/*hr high*/
g_uc_hr_cnt = k << 4;
g_hr_disp = g_uc_hr_cnt;/*using OR can't mask the hr_low,so hr equal to 0*/
break;
case 2:/*hr low*/
g_uc_hr_cnt += k;
g_hr_disp = g_uc_hr_cnt;
break;
case 3:/*min high*/
g_uc_min_cnt = k << 4;
g_min_disp = g_uc_min_cnt;
break;
case 4:/*min low*/
g_uc_min_cnt += k;
g_min_disp = g_uc_min_cnt;
break;
case 5:/*sec high*/
g_uc_sec_cnt = k << 4;
g_sec_disp = g_uc_sec_cnt;
break;
case 6:/*sec low*/
g_uc_sec_cnt += k;
g_sec_disp = g_uc_sec_cnt;
break;
default:
break;
}
}
break;
}
}
/*************************************************/
/* name:display_led
function:display the number*/
/*************************************************/
void display_led(uchar hr, uchar min,uchar sec)
{
g_sec_disp = sec;//顯示sec
g_min_disp = min;//顯示min
g_hr_disp = hr;//顯示hr
}
/*************************************************/
/* name:delay
function: */
/*************************************************/
void delay(uchar m, uchar n)
{
data uchar i, j;
for(i=0;i<m;i++)
{
for(j=0;j<n;j++);
}
}
/*************************************************/
/*time0_interrupt()時鐘計數,顯示*/
/*************************************************/
void time0_interrupt(void) interrupt 1 using 3
{
TH0 =0x3C ;//重新裝入初值15536
TL0 =0xB0 ;//100ms=0.1s
g_uc_ms_cnt++;
if(g_uc_ms_cnt==10)
{
g_uc_ms_cnt = 0;
g_st_current_time.sec ++;
if((g_st_current_time.sec&0x0F)>9) /*變量uc_sec_cnt為16進制數,顯示應該為10進制*/
{
g_st_current_time.sec += 6; /*(uc_sec_cnt&0x0F)按位與運算*/
} /*若沒有if語句,則只能是到9以后,繼續數到F才進位*/
display_led(g_st_current_time.hr,g_st_current_time.min,g_st_current_time.sec);/*顯示時鐘,每秒刷新一次*/
if((g_st_current_time.sec)>=0x60)
{
g_st_current_time.sec = 0;
g_st_current_time.min ++;
if((g_st_current_time.min&0x0F)>9) /*變量uc_min_cnt為16進制數,顯示應該為10進制*/
{
g_st_current_time.min += 6; /*(uc_min_cnt&0x0F)按位與運算*/
} /*若沒有if語句,則只能是到9以后,繼續數到F才進位*/
if((g_st_current_time.min)>=0x60)
{
g_st_current_time.min = 0;
g_st_current_time.hr ++;
if((g_st_current_time.hr&0x0F)>9) /*變量uc_hr_cnt為16進制數,顯示應該為10進制*/
{
g_st_current_time.hr += 6; /*(uc_hr_cnt&0x0F)按位與運算*/
} /*若沒有if語句,則只能是到9以后,繼續數到F才進位*/
if((g_st_current_time.hr)>=0x24)
{
g_st_current_time.hr = 0;
}
}
}
}
}
/*************************************************/
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -