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

📄 dzagree.c

📁 16位按键扫描程序,包含数字钟计时,闹钟报警,及定时应用
💻 C
字号:
/******************************************************************************************/
/******************************************电总转换协议************************************/
/******************************************************************************************/
//#include <reg52.h>
#include "STC89C51.h"
#include "main.h"
extern unsigned char idata Uart_RxBuf[50];
extern unsigned char idata Uart_TxBuf[50];
extern bit Uart_RecvOk; 

unsigned char idata Address;
unsigned char idata  ComTxPointer;
unsigned char idata  ComTxLength;
unsigned char idata   HighByte;
unsigned char idata   LowByte;
unsigned char idata  ComRxData;
unsigned char ComRxPointer=1;
unsigned char ComRxStep=0;
unsigned char lenghAscTX;
unsigned char ComRxAdr;

unsigned char ComRxChkSum();
unsigned char AscToHex(unsigned char a,unsigned char b);
void HexToAsc(unsigned char a);
/**************************************************************************/
extern unsigned char code lum_grade[10];
extern unsigned char idata LightGrade[8];
#define DeviceSort  0x02  //可调光
//#define DeviceSort  0x01  //不可调光
#define CardNum     0x01
//#define CardNum     0x02
unsigned char code scene[10]={0xAA,0xB9,0x6C,0x6D,0x6E,
                              0xB0,0xA7,0xC1,0xDC,0xE1};
unsigned char code chligtscene[10][8]= {{135,125,105,95,85,75,135,30},
                                        {30,135,125,105,95,85,30,135},
	                                    {55,30,135,125,105,95,85,75},
									    {75,55,30,135,125,105,95,85},
									    {85,75,55,30,135,125,105,95},
									    {95,85,75,55,30,135,125,105},
									    {105,95,85,75,55,30,135,125},
									    {125,105,95,85,75,55,30,135},
									    {55,125,105,95,85,75,30,135},
									    {135,125,105,135,85,75,55,30},};

/**************************************************************************/
void DoComUnPacket(void)
{	
    unsigned int idata ChkTXSum;
	unsigned char p;
	unsigned char Cid1;	
	unsigned char Cid2;
	unsigned char RtnCode;
	unsigned char ComRxVer;
//    unsigned char ComRxAdr;	//
	unsigned char i;
	unsigned char ChkSumHigh;
	unsigned char ChkSumLow;
	RtnCode=ComRxChkSum();//
	ComRxVer=Uart_RxBuf[1];
	ComRxAdr=Uart_RxBuf[2];
	Cid1=Uart_RxBuf[3];
	Cid2=Uart_RxBuf[4];

	if((RtnCode==0)&&(Uart_RecvOk==1))
	  {
      unsigned char CommandType1;
      unsigned char CommandType;
	  CommandType1=Cid2;
	  if(ComRxAdr==CardNum||ComRxAdr==0xFF)
	    {
	  switch(CommandType1)
	        {
			  case 0x42://控制单盏灯
			     {
				      CommandType=Uart_RxBuf[7];
                      switch(DeviceSort)
                             {
							 case 0x01:
                               {
				                switch(CommandType)
				                       {
									    case 0xFF:                    //全开
							                 P0_state=0x00;
										     break;
										case 0x00:                    //全关
							                 P0_state=0xFF;
										     break;
										case 0x01:                    //单盏灯的开关
										     if(Uart_RxBuf[8]==0xFF)P0_0OnOff=0;
										     else if(Uart_RxBuf[8]==0x00)P0_0OnOff=1;
											 break;
									    case 0x02:
										     if(Uart_RxBuf[8]==0xFF)P0_1OnOff=0;
										     else if(Uart_RxBuf[8]==0x00)P0_1OnOff=1;
											 break;
									    case 0x03:
										     if(Uart_RxBuf[8]==0xFF)P0_2OnOff=0;
										     else if(Uart_RxBuf[8]==0x00)P0_2OnOff=1;
											 break;
				                        case 0x04:
										     if(Uart_RxBuf[8]==0xFF)P0_3OnOff=0;
										     else if(Uart_RxBuf[8]==0x00)P0_3OnOff=1;
											 break;
										case 0x05:
										     if(Uart_RxBuf[8]==0xFF)P0_4OnOff=0;
										     else if(Uart_RxBuf[8]==0x00)P0_4OnOff=1;
											 break;
									    case 0x06:
										     if(Uart_RxBuf[8]==0xFF)P0_5OnOff=0;
										     else if(Uart_RxBuf[8]==0x00)P0_5OnOff=1;
											 break;
									    case 0x07:
										     if(Uart_RxBuf[8]==0xFF)P0_6OnOff=0;
										     else if(Uart_RxBuf[8]==0x00)P0_6OnOff=1;
											 break;
										case 0x08:
										     if(Uart_RxBuf[8]==0xFF)P0_7OnOff=0;
										     else if(Uart_RxBuf[8]==0x00)P0_7OnOff=1;
											 break;
										default:
										break;
                                        }//end of 01 switch(CommandType)
								}
                                    break;
                             case 0x02:
                              {
                               switch(CommandType)
				                      {
                                      case 0xFF:                    //全开
                                             P0_state=0x00;
							                 P1_state=0x00;
										     break;
									  case 0x00:                    //全关
                                             P0_state=0xFF;
							                 P1_state=0xFF;
										     break;
				                      case 0x08:
				                           if(Uart_RxBuf[8]==0xFF)
										       {
											    P1_0OnOff=0;
												P0_0OnOff=0;
											   }
				                           else if(Uart_RxBuf[8]==0x00)
										        {
												 P1_0OnOff=1;
                                                 P0_0OnOff=1;
												}
				                           else
				                                {
												 P1_0OnOff=0;
												 P0_0OnOff=0;
				                                 LightGrade[0]=lum_grade[Uart_RxBuf[8]-1];
				                                }
                                           break;
                                     case 0x07:
				                           if(Uart_RxBuf[8]==0xFF)
										        {
												 P1_1OnOff=0;
												 P0_1OnOff=0;
												 }
				                           else if(Uart_RxBuf[8]==0x00)
										        {
												 P1_1OnOff=1;
												 P0_1OnOff=1;
												 }
				                           else
				                                {
												 P1_1OnOff=0;
                                                 P0_1OnOff=0;
				                                 LightGrade[1]=lum_grade[Uart_RxBuf[8]-1];
				                                }
                                           break;
                                     case 0x06:
				                           if(Uart_RxBuf[8]==0xFF)
										        {
												 P1_2OnOff=0;
												 P0_2OnOff=0;
												 }
				                           else if(Uart_RxBuf[8]==0x00)
										        {
												 P1_2OnOff=1;
												 P0_2OnOff=0;
												 }
				                           else
				                                {
												 P1_2OnOff=0;
												 P0_2OnOff=0;
				                                 LightGrade[2]=lum_grade[Uart_RxBuf[8]-1];
				                                }
                                           break;
                                     case 0x05:
				                           if(Uart_RxBuf[8]==0xFF)
										        {
												 P1_3OnOff=0;
												 P0_3OnOff=0;
												 }
				                           else if(Uart_RxBuf[8]==0x00)
										         {
												  P1_3OnOff=1;
												  P0_3OnOff=1;
												  }
				                           else
				                                {
												 P1_3OnOff=0;
												 P0_3OnOff=0;
				                                 LightGrade[3]=lum_grade[Uart_RxBuf[8]-1];
				                                }
                                           break;
                                    case 0x04:
				                           if(Uart_RxBuf[8]==0xFF)
										        {
												 P1_4OnOff=0;
                                                 P0_4OnOff=0;
												 }
				                           else if(Uart_RxBuf[8]==0x00)
										         {
												  P1_4OnOff=1;
												  P0_4OnOff=1;
												  }
				                           else
				                                {
												 P1_4OnOff=0;
												 P0_4OnOff=0;
				                                 LightGrade[4]=lum_grade[Uart_RxBuf[8]-1];
				                                }
                                           break;
                                     case 0x03:
				                           if(Uart_RxBuf[8]==0xFF)
										        {
												 P1_5OnOff=0;
												 P0_5OnOff=0;
												 }
				                           else if(Uart_RxBuf[8]==0x00)
										         {
												  P1_5OnOff=1;
												  P0_5OnOff=1;
												  }
				                           else
				                                {
												 P1_5OnOff=0;
												 P0_5OnOff=0;
				                                 LightGrade[5]=lum_grade[Uart_RxBuf[8]-1];
				                                }
                                           break;
                                    case 0x02:
				                           if(Uart_RxBuf[8]==0xFF)
                                                {
                                                 P1_6OnOff=0;
                                                 P0_6OnOff=0;
												 }
				                           else if(Uart_RxBuf[8]==0x00)
										         {	
												  P1_6OnOff=1;
                                                  P0_6OnOff=1;
												  }
				                           else
				                                {
												  P1_6OnOff=0;
												  P0_6OnOff=0;
				                                  LightGrade[6]=lum_grade[Uart_RxBuf[8]-1];
				                                }
                                           break;
                                    case 0x01:
				                           if(Uart_RxBuf[8]==0xFF)
										        { 
											     P1_7OnOff=0;
											     P0_7OnOff=0;
											    }
				                           else if(Uart_RxBuf[8]==0x00)
										        {
												 P1_7OnOff=1;
												 P0_7OnOff=1;
												}
				                           else
				                                {
												 P1_7OnOff=0;
												 P0_7OnOff=0;
				                                 LightGrade[7]=lum_grade[Uart_RxBuf[8]-1];
				                                }
                                           break;
									default:
									break;
                                      }//end of 02 switch(CommandType)
							   }
                                  break;
                              default:
							  break;        
				             }//end of switch(DeviceSort)
					    }//end of case 42
					break;
               case 0x41://读取设备号
			        {
                    lenghAscTX=lenghAscTX+4;
                    Uart_RxBuf[5]=0xC0;
                    Uart_RxBuf[6]=0x04;
                    Uart_RxBuf[7]=DeviceSort;
                    Uart_RxBuf[8]=0x08;
                    Uart_RxBuf[9]=0xFC;
                    Uart_RxBuf[10]=0xD8;
					}//end of case 41
			        break;
			   case 0x44://设置场景
			        {
					 switch(DeviceSort)
					       {
						   case 0x01:
						        {
								CommandType=Uart_RxBuf[7];
                                P0_state=scene[CommandType-1];
								}
						   break;
                           case 0x02:
						        {
								P1_state=0x00;
                                CommandType=Uart_RxBuf[7];
								for(i=0;i<8;i++)
									{
									LightGrade[i]=chligtscene[CommandType-1][i];
									}
								}
						   break;
						   default:
						   break;
						   }
                      
					}//end of case 44
                    break;
								default:
								break;
			 }//end of switch(CommandType1)
	         Uart_TxBuf[0]=Uart_RxBuf[0];
             Uart_RxBuf[4]=RtnCode;
      	     ChkTXSum=0;
		     p=1;
		  for(i=1;i<lenghAscTX;i++)
		    {
			 HexToAsc(Uart_RxBuf[p]);
	         p++;
			 Uart_TxBuf[i++]=HighByte;
			 ChkTXSum+=HighByte;
			 Uart_TxBuf[i]=LowByte;
			 ChkTXSum+=LowByte;
			}
			ChkTXSum = (~ChkTXSum) + 1;	
			ChkSumHigh = ChkTXSum >> 8;		
			HexToAsc(ChkSumHigh);
			Uart_TxBuf[i++] = HighByte;
			Uart_TxBuf[i++] = LowByte;
		
			ChkSumLow = ChkTXSum & 0x00FF;		
			HexToAsc(ChkSumLow);
			Uart_TxBuf[i++] = HighByte;
			Uart_TxBuf[i++] = LowByte;
			Uart_TxBuf[i]=0x0D;
//			Uart_TxBuf[i]=Uart_RxBuf[p];
            CTRL485=0;          //RS-485转换成发送
	        SBUF=Uart_TxBuf[0];
		 }//end of if(ComRxAdr==CardNum||ComRxAdr==0xFF)
          else
           {
            SBUF=01;
            }
	  }
}

/******************************************************************************************/
unsigned char ComRxChkSum()//ChkSum
{	
	unsigned int idata ChkSum;
	unsigned char  ComRxData;		//	
	unsigned char  LengthHigh;
	unsigned char  LengthLow;
	unsigned char  LengthChkSum;
	unsigned char  RtnCode;
	unsigned char  i;
	unsigned char  p;
	
 	LowByte=Uart_RxBuf[9];
	LengthChkSum=AscToHex(0,LowByte);

 	LowByte=Uart_RxBuf[10];
	LengthHigh=AscToHex(0,LowByte);
	LengthChkSum+=LengthHigh;

 	LowByte=Uart_RxBuf[11];
 	ComRxData=AscToHex(0,LowByte);
    LengthChkSum+=ComRxData;

 	LowByte=Uart_RxBuf[12];
 	ComRxData=AscToHex(0,LowByte);
    LengthChkSum+=ComRxData;
	LengthChkSum&=0x0f;
	HighByte=Uart_RxBuf[11];
 	LowByte=Uart_RxBuf[12];
 	LengthLow=AscToHex(HighByte,LowByte);
 	LengthLow+=13;

	if((LengthChkSum!=0)||(LengthHigh!=0))
    {	if(LengthHigh!=0)
		{
			RtnCode=0xe1;	
		}
		else
		{
			RtnCode=0x03;	
		}
	}
	else
	{
 	 	ChkSum=0;
 		for(i=1;i<LengthLow;i++)
 		{	
		 	ChkSum+=Uart_RxBuf[i];
		}
 		HighByte=Uart_RxBuf[i++];
 		LowByte=Uart_RxBuf[i++];
 		ComRxData=AscToHex(HighByte,LowByte);
 		ChkSum+=(ComRxData<<8);
 		HighByte=Uart_RxBuf[i++];
 		LowByte=Uart_RxBuf[i++];
 		ComRxData=AscToHex(HighByte,LowByte);
 		ChkSum+=ComRxData;
 		if(ChkSum!=0)
 			RtnCode=0x02;	
 		else
 			RtnCode=0;		
     }
	 p=1;
	 lenghAscTX=LengthLow;
	 for(i=1;i<LengthLow+4;i++)
 	{	
		HighByte=Uart_RxBuf[i++];
 		LowByte=Uart_RxBuf[i];
 		ComRxData=AscToHex(HighByte,LowByte);
		Uart_RxBuf[p++]=ComRxData;	    
	}
	Uart_RxBuf[p]=Uart_RxBuf[i];
	return(RtnCode);		
}

/****************************************************************/
unsigned char AscToHex(unsigned char a,unsigned char b)
{
 	if(a<0x3a)
	{
		a&=0x0f;
	} 
 	else      
	{
		a-=0x07;
		a&=0x0f;
	} 
 	if(b<0x3a)
	{
		b&=0x0f;
	}  
 	else      
	{
		b-=0x07;
		b&=0x0f;
	}  
 	a<<=4;
	a|=b; 
	return (a);
}
/******************************************************************************************/
void HexToAsc(unsigned char a)  //a=ASC_H, b=ASC_L
{
 	LowByte=a;
 	a&=0xf0;
 	a>>=4;
 	if(a<0x0a)
 	{
		a+=0x30;
	}
	 else      
	 {
		a+=0x37;
	}
	 HighByte=a;

	 a=LowByte;
	 a&=0x0f;
 	if(a<0x0a)
	{
		a+=0x30;
	}
 	else      
	{
		a+=0x37;
	}
 	LowByte=a;
}	
/******************************************************************************************/ 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -