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