⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 com_frontboard.c

📁 单片机为2051,带有数码管显示机顶盒前面板程序
💻 C
📖 第 1 页 / 共 2 页
字号:
        		   }
              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 + -