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

📄 leddisp.c

📁 嵌入式系统中的一个显示器的驱动程序
💻 C
字号:
#include<head.h>

void WordLoad(void);

/*---------------------------------------------------------------------------------*/
/*                         通讯用的函数                                            */
/*---------------------------------------------------------------------------------*/
void  COM(void);
void  NAPCOMM(void);
void  serial(void);
void  WSBUF(unsigned char ch);
void  ModbusCrc(unsigned char x);
/*---------------------------------------------------------------------------------*/
/*                         显示用的函数                                           */
/*---------------------------------------------------------------------------------*/
void OUT(unsigned char start,unsigned char size);
/*---------------------------------------------------------------------------------*/
/*                         通讯用的变量                                         */
/*---------------------------------------------------------------------------------*/
unsigned int  idata CRC2;
unsigned int idata  yafslong=0,yifslong=0;
unsigned char idata  comml=0,crc=0,modbus0=0;
bit          yxfs=0;
unsigned data T2MS=0;
/*---------------------------------------------------------------------------------*/
/*                        内部变量                                         */
/*---------------------------------------------------------------------------------*/
unsigned char data ledcs=1;
unsigned char code dd[64]={0x02,0x00,0x01,0x00,0xFF,0xFE,0x00,0x00,0x0F,0xE0,0x08,0x20,0x0F,0xE0,0x00,0x00,
0x7F,0xFC,0x40,0x04,0x4F,0xE4,0x48,0x24,0x48,0x24,0x4F,0xE4,0x40,0x14,0x40,0x08,0x08,0x02,0x08,0x02,0x14,0x12,0x13,0x12,0x21,0xD2,0x40,0x92,0xBF,0x12,0x21,0x12,
0x21,0x12,0x25,0x12,0x22,0x12,0x20,0x82,0x20,0x82,0x20,0x8A,0x1F,0x84,0x00,0x00};
unsigned char tempi=0;
unsigned char temp=0;
unsigned char timei=0;

unsigned char str[3]="上";
main()
{
AUXR=0x00;

IE=0X9A;
IP=0X02;
TMOD=0X11;
TH0=0XF8;TL0=0X2F;
TH1=0X9E;TL0=0X58;
TR0=1;TR1=1;

P1=0Xff;
XBYTE[0x2003]=0xff;
XBYTE[0x2001]=0xff;
XBYTE[0x2002]=0xFc;
XBYTE[0x2003]=0x3;

SCON=0x50;
TL2=0;TH2=0;T2CON=0x34;  //串行口设置(用T2作为波特率发生定时器)
RCAP2H=0xFF;RCAP2L=0xDC;RS485=1;

de=1;
RS485=1;

WordCode[0]=0xb4;//str[0];
WordCode[1]=0xb4;//str[1];


for(;;){

       }
}

void TimeInt0(void) interrupt 1
{

TH0=0XF8;TL0=0X2F;
P1=0XFF;


XBYTE[0x2001]=Character[temp];//+tempi*32];
XBYTE[0x2003]=Character[temp+8];//+1+tempi*32];
XBYTE[0x2000]=Character[temp+16];//+16+tempi*32];
XBYTE[0x2002]=Character[temp+24];///+17+tempi*32];

temp++;
P1=~ledcs;
//WordLoad();
ledcs=ledcs<<1;
if(ledcs==0){ledcs=1;temp=0;}



}
void TimeInt1(void) interrupt 3
{
TH1=0X9E;TL0=0X58;
modbus0++;
if(modbus0 >= 200)  {comml=0;}     //5s内没有后续报文,清空前面的报文
COM();
timei++;
//if(timei>80){timei=0;tempi=!tempi;}
if(timei>40){ 
				   char i;
					char tempword;
						timei=0;
					tempword=Character[15];
					for(i=15;i>0;i--)Character[i]=Character[i-1];Character[15]=tempword;
               tempword=Character[31];
					for(i=31;i>16;i--)Character[i]=Character[i-1];Character[31]=tempword;
				 }

					
}

void WordLoad(void)
{
}


void serial(void) interrupt 4
{


unsigned  char ch;
if(RI)
   {       //RTU模式接收
        ch=SBUF;RI=0;modbus0=0;
        if((comml==0)&&(ch!=de)) {return;}   
        if(comml < 255)commd[comml++]=ch;// {commd[comml]=ch;comml++;}
   }
else if(TI)
   {TI=0; 
    if(yxfs)
      {SBUF=ssbuf[yifslong++];
       if(yifslong==(yafslong+1))
          {
            yifslong=0;yafslong=0;
            yxfs=0;RS485=1;
          }

      }
   }

}

void  COM(void)
{
unsigned  int     chh,addr,ch1;
unsigned  char    leng1,ch10;

while(comml>6)
     {
           if(commd[0]==de && (commd[1]==0x03 || commd[1]==0x06) ) {if(comml>=8) leng1 = 8; else return;}
           else if(commd[0]==de && commd[1]==0x10 && commd[6]<0x60 ) {if(comml>=commd[6]+9) leng1=commd[6]+9;else return;}
           else { NAPCOMM(); continue;}
           for(ch1=0,CRC2=0xFFFF;ch1<leng1-2;ch1++) ModbusCrc(commd[ch1]);         //计算crc
           if((commd[comml-1]!=CRC2/256)||(commd[comml-2]!=CRC2%256)) {NAPCOMM();} 
			  else  {break;}
     }

if (comml<=6)       {return;}

addr=((commd[2]*256+commd[3]))*2;                                  //开始地址


switch(commd[1])
   {case 0x03:RS485=0;                                                //开始发送数据
              crc=0;                                            //开始冒号
              WSBUF(de);crc+=de;                                          //设备号
              WSBUF(0x03);crc+=3;                                         //功能码
              chh=2*(commd[4]*256+commd[5]);crc+=chh;WSBUF(chh);          //
              for(ch1=0;ch1<chh;ch1++)
                 {
                 //  if(addr>=0x0040&&addr<=0x00A0)                              //浮点数字节倒序
                  //   {if(addr%2==0) {ch10=XBYTE[0x8000+addr+1];}
                 //     else       {ch10=XBYTE[0x8000+addr-1];}
                    // }
                  //else {  
                 ch10=XBYTE[0x8000+addr];//}
                 crc+=ch10;WSBUF(ch10);
                 addr=addr+1;

                 }                 //数据
             
              for(ch1=0,CRC2=0xFFFF;ch1<yafslong;ch1++)
                      ModbusCrc(ssbuf[ch1]);
              WSBUF(CRC2%256);WSBUF(CRC2/256);
              SBUF=ssbuf[0];yifslong=1;yxfs=1;
              break;

         case 0x06:
             if(addr == 0x00)
             {}
             else
             {XBYTE[0x8000+addr]=commd[4];             //数据
              XBYTE[0x8000+addr+1]=commd[5];}
                OUT(0,1); 

              RS485=0;
              crc=0;                                            //开始冒号
              WSBUF(de);crc+=de;                                          //设备号
              WSBUF(0x06);crc+=6;                                         //功能码
              ch1=commd[2];crc+=ch1;WSBUF(ch1);                           //开始地址
              ch1=commd[3];crc+=ch1;WSBUF(ch1);
              ch1=commd[4];crc+=ch1;WSBUF(ch1);                          //开始地址
              ch1=commd[5];crc+=ch1;WSBUF(ch1);
              
				  for(ch1=0,CRC2=0xFFFF;ch1<yafslong;ch1++)
                      ModbusCrc(ssbuf[ch1]);
              WSBUF(CRC2%256);WSBUF(CRC2/256);
               
               
              SBUF=ssbuf[0];yifslong=1;yxfs=1;
            
              break;
   case 0x10:
              RS485=0;           //开始发送数据
              crc=0;                                            //开始冒号
              WSBUF(de);crc+=de;                                          //设备号
              WSBUF(0x10);crc+=0x10;                                         //功能码
              ch1=commd[2];crc+=ch1;WSBUF(ch1);
              ch1=commd[3];crc+=ch1;WSBUF(ch1);
              ch1=commd[4];crc+=ch1;WSBUF(ch1);
              ch1=commd[5];crc+=ch1;WSBUF(ch1);
              
		        for(ch1=0,CRC2=0xFFFF;ch1<yafslong;ch1++)
                      ModbusCrc(ssbuf[ch1]);
              WSBUF(CRC2%256);WSBUF(CRC2/256);
              
              SBUF=ssbuf[0];yifslong=1;yxfs=1;
              chh=commd[6];
              for(ch1=0;ch1<chh;ch1++)
               {
                 /* if(addr>=0x0040&&addr<=0x00A0)                              //浮点数字节倒序
                    {
                      tempaddr = addr + ch1;
                      if(tempaddr >= 0x0040 && tempaddr < 0x0060)
                      {       if(ch1%2==0) {XBYTE[tempaddr+1+0x8000]=commd[7+ch1];}
                              else       {XBYTE[tempaddr-1+0x8000]=commd[7+ch1];}     }
                      else if(tempaddr >= 0x0060 && tempaddr < 0x00A0)
                      {
                      }

                     }
                  else {*/
               XBYTE[addr+ch1+0x8000]=commd[7+ch1];//}
               }     
              break;
   }
comml=0;
}

void NAPCOMM(void)               //将现在的报文第一个字符除去,并且找出后面第一个为站号的字符并且修整数组
{
 unsigned int i14,pos1;
 pos1 = 0;
 
 for(i14=1;i14<comml;i14++) {if(commd[i14]==de) {pos1=i14;break;} }
 if(pos1>0) {
             for(i14=pos1;i14<comml;i14++) commd[i14-pos1]=commd[i14]; comml-=pos1; }
 else {comml=0;}
 
}

void WSBUF(unsigned char ch)          //单字节发送
 {if(yafslong<0xff)ssbuf[yafslong++]=ch;}


void ModbusCrc(unsigned char x)
// modbus协议CRC校验, R7为输入校验字节,CRC2为校验字
{
unsigned char k,v;
CRC2=CRC2^x;
for(k=0;k<8;k++)
      {
      v=CRC2 %2;
      CRC2=CRC2>>1;
      if(v==1) {CRC2=CRC2^0xa001;}
      }
}

⌨️ 快捷键说明

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