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

📄 main.c

📁 这是本人有幸收集的最完整的10多级液晶显示程序模块
💻 C
📖 第 1 页 / 共 5 页
字号:
   {
      if(++remote_fault_count>10)
      {
        remote_fault_count=0;
        old_dis_number=dis_number;
        ComunicationFault();
        remote_build();
        dis_number=old_dis_number;
 //       key=nokey;
 //       display();
      }

     write_rebuf_p=RxdPointBak;
     goto again;
   }
   else
     {
       value_message_count++;//报文计数加一
       remote_fault_count=0;
     }
 }
}
void WriteData(void)
{

 again:
    if(program_state==1)  return;
    trbuf[0]=address_device;
    trbuf[1]=0x06;
    trbuf[2]=set_addh;
    trbuf[3]=set_addl;
    trbuf[4]=set_valueh;
    trbuf[5]=set_valuel;
    TxdLength=6;//实际发送缓存有效长度
    receive_byte_number=8;			//06功能码接收总字节数
    RemoteTypeBak=1;

   crc_account();						//crc计算
   Txded_Number=0;    //发送缓存读计数清零,接收缓存清零在发送结束时清零.													//发送缓存读计数清零
   Current_Message_End=1;
   REN=0;		      //启动发送							//起动输出
   CLK=1;
   RI=0;

   SBUF=trbuf[0];
   WaitTime=0;
   //Current_Message_End=0;//for debug
   while((Current_Message_End!=0)&&(WaitTime<100))
     WD_SDA=~WD_SDA;
   if(Current_Message_End!=0)
   {
      if(++remote_fault_count>5)
      {
        remote_fault_count=0;
        old_dis_number=dis_number;
        ComunicationFault();
        remote_build();
        dis_number=old_dis_number;
 //       key=nokey;
 //       display();
      }
      goto again;

   }
   else
     remote_fault_count=0;
 }
/*
void WriteOrder(void)
{
 //数据打包
 unsigned j;
again:
    trbuf[0]=address_device;
    trbuf[1]=0x06;
    for(j=0;j<4;j++)
    {
      trbuf[j+2]=*(read_order_p+j);	  //[行][列]*(p+i*long_dis_message+j)
    }
    TxdLength=6;//用于计算效验码 ,在计算完后加二形成发送长度.
    crc_account();
     Txded_Number=0;
    receive_byte_number=8;   //报文接收字节数
    RemoteTypeBak=0;     //当前交互报文类型
    Current_Message_End=1;
     REN=0;		      //启动发送							//起动输出
   CLK=1;
   RI=0;
    SBUF=trbuf[0];
    WaitTime=0;
   while((Current_Message_End!=0)&&(WaitTime<100))
     WD_SDA=~WD_SDA;
   if(Current_Message_End!=0)
   {
      if(++remote_fault_count>5)
      {
        remote_fault_count=0;
        old_dis_number=dis_number;
        ComunicationFault();
        remote_build();
        dis_number=old_dis_number;
 //       key=nokey;
 //       display();
      }
      goto again;

   }
   else
     remote_fault_count=0;

}*/

void GetState(void)
{
again:
    if((program_state==1)||(alone_user==1))  return;//编程状态或单机模式
    trbuf[0]=address_device;
    trbuf[1]=state_message_tab[0];
    trbuf[2]=state_message_tab[1];
    trbuf[3]=state_message_tab[2];
    trbuf[4]=state_message_tab[3];
    trbuf[5]=state_message_tab[4];
    TxdLength=6;
    receive_byte_number=5 + trbuf[5] * 2;
    RemoteTypeBak=4;
    write_rebuf_p=union_state.state_buf;
    crc_account();
    Current_Message_End=1;
     Txded_Number=0;
      REN=0;		      //启动发送							//起动输出
      CLK=1;
      RI=0;
    SBUF=trbuf[0];
    WaitTime=0;
   //Current_Message_End=0;//for debug
   while((Current_Message_End!=0)&&(WaitTime<200))
     WD_SDA=~WD_SDA;
   //Current_Message_End=0;//for debug
   if(Current_Message_End!=0)
   {
      if(++remote_fault_count>5)
      {
        remote_fault_count=0;
        old_dis_number=dis_number;
        ComunicationFault();
        remote_build();
        dis_number=old_dis_number;
 //       key=nokey;
 //       display();
      }
      goto again;

   }
   else
     remote_fault_count=0;


}





/********************************************************************
*
* 名称: crc_account
* 说明: 根据发送缓存使用长度,计算并添加其crc.
		更新使用长度值,read_trbuf_p (读取发送缓存指针)保持原值.
* 功能: CRC 计算
* 调用:
* 输入: 全局变量
* 返回值: 无,
***********************************************************************/
void crc_account(void)
{ //TxdLength为要校验的字节数
	idata union{
	             uint wordd;
	             uchar charr[2];
	           }crcreg;								//crc寄存器
	idata uchar temp1,i=0,j;
	uint  da;
	crcreg.wordd=0xffff;
	do													//所有参加计算字节的循环
		{
	  		temp1=trbuf[i];					//(read_trbuf_p=rebuf)
	  		crcreg.wordd^=temp1;						//nnn高8位无影响?
	  		for(j=0;j<8;j++)							//一个字节的8次移位循环
	  			{
	 		 		da=crcreg.wordd;
	 		 		crcreg.wordd>>=1;
	  				if(da&0x0001) crcreg.wordd^=CRC;	//移出前最低位判断(define CRC 0xa001)
	 		 	}
	  		i++;
		}
	while(i<TxdLength);					//参加crc计算的字节完毕
    trbuf[i]=crcreg.charr[1];
    crch_bak=crcreg.charr[0];			//低字节
    i++;
    trbuf[i]=crcreg.charr[0];
    crcl_bak=crcreg.charr[1];			//高字节
	TxdLength+=2;
}//crc_account



/********************************************************************
*
* 名称: uart_interrupt
* 说明: 串口发送中断:未取完成则取指针++,填下一个需发送字节
		接收:存数据,计数,存指针++
				接收完成后,置单条报文完成标志item_end=0;
* 功能: 串口中断
* 调用:
* 输入: 全局变量
* 返回值: 无
***********************************************************************/
void uart_interrupt (void) interrupt 4 using 1
{
  idata uchar rechar,j;
  uint da;
  //WDTRST=0x1e;
  //WDTRST=0xe1;
  if(TI)
  {
   TI=0;
    if(Current_Message_End==0)
      return;
   if(++Txded_Number>=TxdLength)
   {

										//抑制循环nnn,使能接收中断
    CLK=0;
    rebuf_write_count=0;				//初始化接收缓存计数器
    Txded_Number=0;
    REN=1;
   }
   else

    SBUF=trbuf[Txded_Number];					//发送的第一个字节由通讯控制程序写入
  }
  if(RI)
  {
    rechar=SBUF;
	RI=0;

	//		if(remote_sign_program_state==1) return;//编程器连接,则交出通讯权nnn
	if (Current_Message_End==0)
	  return;
	if(remote_type_address==1)
	{//特殊指令接收
	  rebuf_write_count++;
	  if(rebuf_write_count==1||rebuf_write_count==4)
	  {
	    if(rechar!=0x68)rebuf_write_count=0;//改变波特率重试,重记数
		return;
	  }
	  if(rebuf_write_count==2)
	  	address_device=rechar;			//保存设备地址
	  if(rebuf_write_count==3)			//验证设备地址
	  {
	    if(rechar!=address_device)rebuf_write_count=0;//改变波特率重试,重记数
		return;
	  }
	  if(rebuf_write_count==5)
	  {//特殊报文校验码接收nnn
		if(rechar==((address_device*2+0xd0)%256))
		 {
		   remote_type_address=0;
		   remote_sign_built=1;		//特殊报文校验码,通讯建立,
       alone_user=0;          //联机模式---唯一此处能转工作模式
		   REN=0;
       CLK=1;
       RI=0;

		 }
	  }
	  return;
	}//特殊指令接收
//以下为标准协议指令接收

	if(rebuf_write_count==0)						//读第一字节
	{
	  if(rechar!=address_device) return;		//普通报文地址校对
	  	recrc.recrc_int=0xffff;					//初始化接收CRC初值
	}
	rebuf_write_count++;
									//接收缓存写计数++
	if(rebuf_write_count>receive_byte_number-2)
	{//>接收crc
      if(rebuf_write_count>receive_byte_number-1)
      {//crch效验
	   if(rechar==recrc.recrc[0])
	   {//=接收crch
        //CRC正确,指令和状态接收结束
        Current_Message_End=0;			//条报文完成标志仅由通讯程序置位
        remote_fault_count=0;
        switch (RemoteTypeBak)
        {
         case 0:remote_type_order=0;
                break;
         case 1: remote_type_set=0;
                break;
         case 3: break;
          default:break;
        }
        REN=0;
        CLK=1;
        RI=0;
	   }//CRC正确
	   else
	   {
        REN=0;
        CLK=1;
        RI=0;
       }
       return;
      }
	  else
	  {//crcl效验
	    if(rechar!=recrc.recrc[1])
        {
          REN=0;
          CLK=1;
          RI=0;
        }
        return;
      }
    }//>接收crc
	else
	{//<=接收crc外其他字节
	  //接收校验码计算
	  recrc.recrc_int^=rechar;
	  for(j=0;j<8;j++)
		{
		  da=recrc.recrc_int;
		  recrc.recrc_int>>=1;
		  if(da&0x0001)recrc.recrc_int^=CRC;
		}

	  if((RemoteTypeBak==0)||(RemoteTypeBak==1))		return;						//指令
	  {
	    if(rebuf_write_count>3)
	    {*write_rebuf_p=rechar;
             write_rebuf_p++;
            }
          }
    }//<=接收crc外其他字节
  }//if(RI)
}//uart_interrupt
/*---------------------------------------    通讯控制程序结束    ----------------------------------------*/

//----------s---------

void   menu_main_control()
{
  switch(key)
  {
    case  nokey:
                clr_fullscreen();
                if(arrow_state1%2==0)
                  lcdwrite(3,115,6,&arrow);
                if(arrow_state1%2==1)
                  lcdwrite(1,115,6,&arrow);
                if(SuperUser==1)
                {
                 switch(arrow_state1/2)
                 {
                    case  0:
                      	   lcdwrite_chinese(2,4,13,&xi);
                            lcdwrite_chinese(2,17,13,&shu);
                            lcdwrite_chineseN(2,30,2,&jiao);
                            lcdwrite_chineseN(0,4,4,&xinhaoceliang);
                      	   break;
                    case  1:
                            lcdwrite_chineseN(2,4,2,&bao);
                            lcdwrite_chineseN(2,30,2,&cha);
                            lcdwrite_chineseN(0,4,4,&gu);
                      	   break;
                    case  2:
                      	   lcdwrite_chineseN(2,4,2,&guan);//管理
                            lcdwrite_chineseN(2,30,2,&xinhao);//信息

                            lcdwrite_chinese(0,4,9,&hanD);
                            lcdwrite_chinese(0,13,4,&hanI);
                            lcdwrite_chinese(0,17,10,&xiexian);
                            lcdwrite_chinese(0,27,9,&hanD);
                            lcdwrite_chinese(0,36,9,&hanO);

                            lcdwrite_chineseN(0,45,2,&zhuang);
                            lcdwrite_chineseN(0,71,2,&cha);
                      	   break;
                    case  3:
                            //lcdwrite_chineseN(2,4,4,&tongxun);
                            lcdwrite_chineseN(2,4,6,&baohu);//保护定值设置
                            if(union_state.state_buf[11]==protect)//保护模式
                            {
                              lcdwrite_chineseN(0,4,2,&xi);//系统
                              lcdwrite_chineseN(0,30,4,&can);//参数
                            }
                            else
                            {
                              lcdwrite_chineseN(0,4,2,&qidong);//起动
                              lcdwrite_chineseN(0,30,4,&can);//参数
                            }
                      	   break;
                    case  4:
                      	   //lcdwrite_chineseN(2,4,2,&qidong);
                            //lcdwrite_chineseN(2,30,4,&can);
                            if(union_state.state_buf[11]==protect)//保护模式 ,此下重定义光标号意义
                            {
                              lcdwrite_chinese(2,4,13,&shuchu);
                              lcdwrite_chinese(2,17,13,&ru);
                              lcdwrite_chineseN(2,30,2,&shuchu);
                              lcdwrite_chineseN(2,56,2,&pei);
                            }
                            else
                            {
                              lcdwrite_chineseN(2,4,2,&xi);
                              lcdwrite_chineseN(2,30,4,&can);

                              lcdwrite_chinese(0,4,13,&shuchu);
                              lcdwrite_chinese(0,17,13,&ru);
                              lcdwrite_chineseN(0,30,2,&shuchu);
                              lcdwrite_chineseN(0,56,2,&pei);
                            }


                      	   break;
                   // case  5:
                      	    // lcdwrite_chinese(2,4,13,&shuchu);
                           // lcdwrite_chinese(2,17,13,&ru);
                           // lcdwrite_chineseN(2,30,2,&shuchu);
                           // lcdwrite_chineseN(2,56,2,&pei);
                      	  // break;
                 }
                }
                else
                {
                	if(arrow_state1==8)
                	  arrow_state1=6;
                	if(arrow_state1==9)
                	  arrow_state1=7;
                	switch(arrow_state1/2)
                 {
                    case  0:
                      	   lcdwrite_chineseN(2,4,4,&xinhaoceliang);
                      	   lcdwrite_chineseN(0,4,2,&bao);
                            lcdwrite_chineseN(0,30,2,&cha);
                      	   break;
                    case  1:
                            lcdwrite_chineseN(2,4,4,&gu);
                            lcdwrite_chineseN(0,4,2,&guan);//管理
                            lcdwrite_chineseN(0,30,2,&xinhao);//信息
                      	   break;
                    case  2:
                      	    lcdwrite_chinese(2,4,9,&hanD);
                            lcdwrite_chinese(2,13,4,&hanI);

⌨️ 快捷键说明

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