📄 com_frontboard.c
字号:
}
remote_count=0;
continue_txd_switch=1;//打开连续按键的处理开关
timeout_count=0;//置计数器的溢出次数为0
if((recv_code.sys1_code!=SYSTEM_CODE1)&&(recv_code.sys2_code!=SYSTEM_CODE2))
{continue_txd_switch=0;}
reset_remote_condition();
}
else
{
TH0=-(65536/256);
TL0=-(65536%256);
TR0=1;ET0=1;
}
}
}
TH0=-(65536/256);
TL0=-(65536%256);
TR0=1;ET0=1;
}
//计时器T0中断服务程序
void t0_int(void) interrupt 1 using 1
{
TR0=0;ET0=0;
if(timeout_count<14){//计数器溢出14次后关闭对连续按键的处理
reset_remote_condition();
TH0=-(65536/256);
TL0=-(65536%256);
TR0=1;ET0=1;
timeout_count++;//计数器的溢出次数加1
}
else{
reset_remote_condition();
timeout_count=0;//置计数器的溢出次数为0
continue_txd_switch=0;//关闭连续按键的处理开关
}
}
// 74LS164数据右移一位
void fun_shift_one_bit(bit data_out)
{
P3_5=data_out;P3_4=1;P3_4=0;
}
// 有键按下返回1,无键按下返回0
unsigned char key_push()
{
unsigned char bit_count;
P3_3=1;
for(bit_count=0;bit_count<=7;bit_count++)
fun_shift_one_bit(0);
if(P3_3==0)return(1);
if(P3_3==1)return(0);
}
// 返回input[]的下标
unsigned char key_assignments()
{
unsigned char key_number;
for(key_number=0;key_number<=7;key_number++)
fun_shift_one_bit(1);
for(key_number=0;key_number<=7;)
{
if(key_number==0) fun_shift_one_bit(0);
else fun_shift_one_bit(1);
if(P3_3==0)break;
key_number++;
}
if(key_number==3)
{
P3_4=1;P3_4=0;
if(P3_3==0)return(8);
}
return(key_number);
}
// 刷新数码管的显示
void display(void)
{
unsigned char bit_count;
for(bit_count=0;bit_count<=3;bit_count++)
fun_shift_one_bit(0);
for(bit_count=0;bit_count<=3;bit_count++)
{
P1=0xff;
if(bit_count==0)fun_shift_one_bit(1);
else fun_shift_one_bit(0);
P1=~rec_display[bit_count];
delay(1,3);
}
P1=0xff;
}
// 在等待的同时刷新数码管的显示
void delay_display(unsigned int count)
{
unsigned int i;
for(i=0;i<=count;i++) display();
}
// 按下STANDBY键的显示
void display_for_standby(void)
{
if(standby==1)
{rec_display[0]=0x7c;rec_display[1]=0x5c;
rec_display[2]=0x5c;rec_display[3]=0x78;}
if(standby==0)
{rec_display[0]=0x5c;rec_display[1]=0x71;
rec_display[2]=0x71;rec_display[3]=0x00;}
}
// 通过串口向外发送一字节的数据
void putbyte(char c)
{
ES=0;
while((((outlast-putlast)==2)&&(outlast>putlast))||((outlast<putlast)&&(OLEN-(putlast-outlast)==2)))
{ ES=1; c++;c--;ES=0;}
*putlast=c;
putlast++;
if (putlast==outbuf+OLEN) putlast=outbuf;
outbufsign=1;
if (!outbufsign0) {outbufsign0=1;TI=1; }
ES=1;
}
/*
// 向串口发送一字符串
void putstring(unsigned char *puts)
{
for (;*puts!=0;puts++)
putbyte(*puts);
}
*/
//通过串口接收一字节的数据
unsigned char getbyte (void)
{ char idata c ;
while (!inbufsign)
return(0);
ES=0;
c= *getlast;
getlast++;
inbufful=0;
if (getlast==inbuf+ILEN) getlast=inbuf;
if (getlast==inlast) inbufsign=0;
ES=1;
return (c);
}
// 接收数据到接收缓冲区
void rec_data(void)
{
if(rec_temp_data==REC_START_BYTE)
{
if(rec_first_start_byte_flag==1)
{
rec_info_count=0;
rec_first_start_byte_flag=0;
}
}
rec_info[rec_info_count]=rec_temp_data;
rec_info_count++;
rec_time_count=0;
rec_sw=0;
rec_time_count_sw=1;
if(rec_info_count>=7)
{
rec_info_count=0;
rec_time_count_sw=0;
rec_sw=1;
}
}
// 对接收的数据进行处理
void rec_data_process()
{
unsigned short rec_crc16_value;
if(rec_sw==1)
{
ES=0;
rec_crc16_value=rec_info[6]*0x100+rec_info[5];
if(rec_crc16_value==get_crc16(rec_info,5))
{
rec_display[0]=rec_info[1];
rec_display[1]=rec_info[2];
rec_display[2]=rec_info[3];
rec_display[3]=rec_info[4];
ES=1;
putbyte(OK);
}
else
{
ES=1;
putbyte(ER);
}
reset_rec_condition();
}
if(rec_time_count_sw==1)
{
rec_time_count++;
if(rec_time_count>RESET_ERROR_CONDITION_TIME)
{
putbyte(ER);
reset_rec_condition();
}
}
}
// RESET接收参数
void reset_rec_condition(void)
{
rec_time_count=0;
rec_time_count_sw=0;
rec_first_start_byte_flag=1;
rec_sw=0;
rec_info_count=0;
inlast=inbuf;
getlast=inbuf;
inbufsign=0;
inbufful=0;
}
// CRC16校验
unsigned short get_crc16(unsigned char *data_blk_ptr,unsigned char data_blk_size)
{
unsigned short crc_return;
unsigned char CRC16Lo=INI_VECTORLo;
unsigned char CRC16Hi=INI_VECTORHi;
unsigned char SaveHi,SaveLo;
unsigned char i, j;
for (i = 0; i < data_blk_size; i++)
{
CRC16Lo = CRC16Lo ^ *data_blk_ptr++;
for ( j = 0; j < 8; j++ )
{
SaveHi = CRC16Hi;
SaveLo = CRC16Lo;
CRC16Hi = CRC16Hi >>1;
CRC16Lo = CRC16Lo >>1;
if ((SaveHi & 0x1) == 0x1)
CRC16Lo = CRC16Lo | 0x80;
if ((SaveLo & 0x1) == 0x1)
{
CRC16Hi = CRC16Hi ^ POLYNOMIALHi;
CRC16Lo = CRC16Lo ^ POLYNOMIALLo;
}
}
}
crc_return=CRC16Hi*256 + CRC16Lo;
return (crc_return);
}
// 主函数
main()
{
unsigned char key_assignment_number,key_continue_count;
init();
while(1)
{
rec_data_process();
display();
if(key_push()==1)
{
delay_display(30);
if(key_push()==1)
{
key_assignment_number=key_assignments();
if(key_assignment_number==8)continue;
if((key_assignment_number==5)||(key_assignment_number==6))
{//音量键处理
putbyte(output_key[key_assignment_number]);
while(1)
{
if(key_push()==0){break;}
key_continue_count=1;
for(;;key_continue_count++)
{
delay_display(25);
if(key_continue_count%35==0)
{
putbyte(output_key[key_assignment_number]);
key_continue_count=15;
}
if(key_push()==0){break;}
}
break;
}
}
else
{//
if(key_assignment_number==8)
{//loader键处理
putbyte(output_key[key_assignment_number]);
while(1)
{
if(getbyte()==0xf2) break;
if(key_push()==0) break;
key_continue_count=1;
for(;;key_continue_count++)
{
delay_display(25);
if(key_continue_count%15==0)
{
putbyte(output_key[key_assignment_number]);
key_continue_count=1;
}
if(key_push()==0) break;
if(getbyte()==0xf2) break;
}
}
}
if(key_assignment_number==2)
{//standby处理
while(key_push()==1)delay_display(25);
standby=~standby;
P3_7=standby;
putbyte(output_key[key_assignment_number]);
display_for_standby();
}
else
{//普通键处理
while(key_push()==1)delay_display(25);
putbyte(output_key[key_assignment_number]);
}
}
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -