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

📄 终极版.c

📁 基于HOLTEK的自动放行系统
💻 C
字号:
//receive.c
//wrote by smh
//Body: HT46R24
//Mask option
//All the mask options use the default value.

#include <ht46r24.H>


#pragma vector isr_4 @ 0x4
#pragma vector isr_8 @ 0x8
#pragma vector isr_c @ 0xc

//ISR for safequard
void isr_4(){} // external ISR
void isr_8(){} // timer/event 0
void isr_c(){} // timer/event 1

//initialize registers for safeguard
void safeguard_init()                      //初始化
{
    _intc0 = 0;
    _intc1 = 0;
    _tmr0h = 0;
    _tmr0l = 0;
    _tmr0c = 0;
    _tmr1h = 0;
    _tmr1l = 0;
    _tmr1c = 0;
	
	
    _pac = 0xff;                          //输入模式
    _pbc = 0xff;
    _pcc = 0xff;
    _pdc = 0xff;
    _pfc = 0xff;
    
       
}


//////////////////////////////////////////////////////////////////
#define RST _16_4                  //宏定义rst为pc4脚
#define RS _16_3                   //宏定义rs为 pa3
#define RW _16_1                   //宏定义r/w 为 pa2
#define E _16_0                    //宏定义E为 pa1
#define OUTPUT _pb                 //宏定义output为数据线
//////////////////////////////////////////////////////////////////
#define  n 5                       //宏定义注册数据个数n
#define  rece   _pa6               //接收脚为pa6
#define  T 39000
#define  SPACE 833
#define  WRITE 25000

const unsigned  char tab_data1[n]={0x2,0xab,0x11,0x12,0x20};   //注册数据放入数组(暂时写几个)
const unsigned  char tab_data2[n]={0x34,0xcd,0xff,0x22,0x48}; 
const unsigned  char tab_data3[n]={0x56,0xef,0xc,0xd,0xe}; 
unsigned  char *data_store;
unsigned  int  data[14];

void rxfourdata();
searchvt(void);
void judgedata(void);
void display();
void errordip();
void voice();
void error_1();
void event_1();
void rst_lcd();
void chk_busy();
void write_com(unsigned int a);
void write_data(unsigned int a);
void clear();

unsigned char rxdata,rxdata_H,rxdata_L,rxdata_last;    //定义全局变量
unsigned int i,j,k,YN,intflag;
unsigned long num;


//多位数据接收子程序
void rxfourdata()
{
    unsigned char rxdata_1,rxdata_2;
  
    _pac=0xff;                            //定义pa口为输入
    _pcc=0x0;                             //定义pc口为输出
  
    while(1)
     { 
       if(_pa5==0)continue; 
       for(i=0;i<10;i++)                  //去抖
       _delay(50000); 
       rxdata=_pa&0xf;                    //接收数据赋给rxdata变量
       rxdata_1=rxdata;                   //数据存到rxdata_1以备显示程序显示
       _swap(&rxdata_1);                  //接收数据高低字节交换
       if(rxdata<0xa)
       *data_store=rxdata+0x30;           //如果接收的四位数据的值小于0xa则调用数字的ascii码
       else *data_store=rxdata+0x37;      //如果接收的四位数据值大于等于0xa则调用字母的asii码
                            
       searchvt();                        //调用数据检测子程序
       for(i=0;i<10;i++)                  //去抖
        _delay(50000); 
       rxdata_2=rxdata;                   //数据存到rxdata_2
       if(rxdata<0xa)
       *(data_store+1)=rxdata+0x30;        //如果接收的四位数据的值小于0xa则调用数字的ascii码
       else *(data_store+1)=rxdata+0x37;   //如果接收的四位数据值大于等于0xa则调用字母的asii码
       rxdata_H=rxdata_1|rxdata_2;        //两组四位有效数据存到rxdata_H
       
           
       searchvt();                        //调用数据检测子程序  
       for(i=0;i<10;i++)                  //去抖
        _delay(50000); 
       rxdata_1=rxdata;                   //数据存到rxdata_1以备显示程序显示
       if(rxdata<0xa)
       *(data_store+2)=rxdata+0x30;       //如果接收的四位数据的值小于0xa则调用数字的ascii码
       else *(data_store+2)=rxdata+0x37;  //如果接收的四位数据值大于等于0xa则调用字母的asii码
      _swap(&rxdata_1);                   //接收数据高低字节交换
     
     
       searchvt();                        //调用数据检测子程序
       for(i=0;i<10;i++)                  //去抖
        _delay(50000); 
       rxdata_2=rxdata;                   //数据存到rxdata_2
       if(rxdata<0xa)                     //如果接收的四位数据的值小于0xa则调用数字的ascii码
       *(data_store+3)=rxdata+0x30;
       else *(data_store+3)=rxdata+0x37;  //如果接收的四位数据值大于等于0xa则调用字母的ascii码
       rxdata_L=rxdata_1|rxdata_2;        //两组四位有效数据存到rxdata_L
       
       
       searchvt();                        //调用数据检测子程序  
       for(i=0;i<10;i++)                  //去抖
        _delay(50000); 
       rxdata_1=rxdata;                   //数据存到rxdata_1以备显示程序显示
       if(rxdata<0xa)
       *(data_store+4)=rxdata+0x30;       //如果接收的四位数据的值小于0xa则调用数字的ascii码
       else *(data_store+4)=rxdata+0x37;  //如果接收的四位数据值大于等于0xa则调用字母的asii码
        _swap(&rxdata_1);                   //接收数据高低字节交换       

       searchvt();                        //调用数据检测子程序  
       for(i=0;i<10;i++)                  //去抖
        _delay(50000); 
       rxdata_2=rxdata;                   //数据存到rxdata_1以备显示程序显示
       if(rxdata<0xa)
       *(data_store+5)=rxdata+0x30;       //如果接收的四位数据的值小于0xa则调用数字的ascii码
       else *(data_store+5)=rxdata+0x37;  //如果接收的四位数据值大于等于0xa则调用字母的asii码
       rxdata_last=rxdata_1|rxdata_2;        //两组四位有效数据存到rxdata_L
       break;
    }
}



//vt信号查询子程序
searchvt()                                //vt信号查询子程序
{
     while(1)                              
       {if(_pa5==0)continue;
        else rxdata=_pa&0xf;
        break;
       }
     return(rxdata);
} 




 //数据串判断子程序
void judgedata()                          
{
     for(i=0;i<n;i++)                     
       {if(rxdata_H==tab_data1[i])        //查询16位中高8位是否在表格中
        break;                       
       }                           
     for(j=0;j<n;j++) 
       {if(rxdata_L==tab_data2[j])   
        break;                 
       }    
     for(k=0;k<n;k++)
       {if(rxdata_last==tab_data3[k])
        break;
       }                       
               
     if(i==n||j==n||k==n)                   //如果i等于n则表明接收数据不在表格中
        YN=0;                             //如果输入数据不在表格中则把识别标识置0
     else YN=1;
}



//事件一子程序(开继电器)
void event_1()                          
{       _pcc=0x0;
        _pc2=1;
           
}

//错误警报声子程序
void error_voice()                       
{       _pac=0x0;
                            
        for(i=0;i<200;i++)
           {_pa4=1;
            _delay(50000);           
           }
}


//按键声子程序
void voice()                           
{
         _pac=0x0;
        
         _pa4=1;
         _delay(40000);  
         _delay(40000);
         _pa4=0;
        
}    


//重启LCD子程序
void rst_lcd()
{    _pcc=0x0;
     RST=0;
	 _delay(5000);               //延时5ms
	 RST=1;
	 _delay(1);
}


//查询LCD是否处于忙的状态子程序
void chk_busy()
{       _pbc=0x00;                  //定义pb脚为输出模式
        OUTPUT=0x00;
        _pbc=0xff;                  //定义pb脚为输出模式

	RS=0;RW=1;E=1;
        while(_pb7);              
        _delay(2);
	    E=0;
}

//清0子程序
void clear()
{
	write_com(0x01);         
	write_com(0x34);
	write_com(0x30);
}

//写指令子函数
void write_com(unsigned int a)
{
	chk_busy();
    _pbc=0x00;                 
	RS=0;RW=0;
	OUTPUT=a;
	E=1;
	_delay(2);
	E=0;
}

//写数据子函数
void write_data(unsigned int a)//write data to lcd
{
	chk_busy();
    _pbc=0x0;     
	RS=1;RW=0;
	OUTPUT=a;
	E=1;
	_delay(2);
	E=0;
}

//显示子程序
void display(unsigned char  *tab_store,unsigned char address)
{
       
          write_com(0x34);          
          write_com(0x30);         
          write_com(0x06);          
          write_com(0x0c);       

          write_com(address);        
          for(i=0;i<16;i++)
          write_data(tab_store[i]);  
          for(i=0;i<10;i++)
          _delay(WRITE);

}

//显示子程序
void display_1(unsigned char  *tab_store,unsigned char address)
{
       
          write_com(0x34);          
          write_com(0x30);         
          write_com(0x06);          
          write_com(0x0c);       

          write_com(address);        
          for(i=0;i<8;i++)
          write_data(tab_store[i]);  
          for(i=0;i<10;i++)
          _delay(WRITE);

}


//主函数
void main()
{         unsigned  char tab_str1[]={"   Welcome !   "};
          unsigned  char tab_str2[]={"未注册!    "};
          unsigned  char tab_str3[]={"车主:×××       "};
          unsigned  char tab_str4[]={"车牌:×××       "};
          unsigned  char tab_str5[]={"时间:×××       "};
          unsigned  char tab_str6[]={"开门..."};
          unsigned  char tab_str7[]={"  盛群单片机    "};
          unsigned  char tab_str8[]={"www.holtek.com "};
          unsigned  char tab_str9[]={"              "};           
          unsigned  char tab_str10[]={"  重庆邮电大学  "};
          unsigned  char tab_str11[]={"    移通学院    "};          

          safeguard_init();
          rst_lcd();
          for(i=0;i<16;i++)
            data[i]=0x20;                                  //0x20为空格的ascii码
          data_store=&data[0];
          _pc2=0;
          _pa4=0;          
          clear();
         display(tab_str1,0x88);
          while(1)                                        //若以断时间内没有接收数据则转入屏保
             {_pac=0xff;
                while(1)
                 {  
                    for(i=0;i<4;i++)			  //?
                      {for(num=0;num<50000;num++)
                       if(_pa5==1)break;
                       if(_pa5==1)break;
                      }
                    if(i==4)
                       {clear();
                        display(tab_str7,0x90);
                        display(tab_str8,0x98);
                       }
                   for(i=0;i<4;i++)
                      {for(num=0;num<50000;num++)
                       if(_pa5==1)break;
                       if(_pa5==1)break;
                      }
                   if(i==4)
                     {clear();
                      display(tab_str10,0x90); 
                      display(tab_str11,0x98); 
                      }
                   if(_pa5==1)break;
                  }    
              
              rxfourdata();
              judgedata();
              if(YN==1)                                 //如果yn的值等于1即数据为有效码
                 {_pc2=1;                               //开继电器
                  voice();
                  clear();
                  display_1(data_store,0x80);             //从地址0x80开始显示数据
                  display(tab_str3,0x90);               //从地址0x90开始依次显示车主姓名
                  display(tab_str4,0x88);               //从地址0x88开始依次显示车牌号 
                  display(tab_str5,0x98);               //从地址0x98开始依次显示时间
                  
                  for(i=0;j<10;j++)                    //开门时间
                     {display_1(tab_str6,0x84);               //从地址0x85开始显示"开门..."
                      for(i=0;i<15;i++)
                      _delay(50000);
                      display_1(tab_str9,0x84);
                      for(i=0;i<15;i++)
                      _delay(50000);
                      
                      }
                  _pc2=0;                               //关继电器
                  }
               else                                     //如果不等于1即数据为无效码则做以下动作
                  {_pac=0x0;
                   _pa4=1;
                   display_1(data_store,0x80);
                   display(tab_str3,0x90);
                   display(tab_str4,0x88);
                   display(tab_str5,0x98);
                   for(j=0;j<6;j++)
                    {display_1(tab_str2,0x84);
                     for(i=0;i<15;i++)
                    _delay(50000);           
                    display_1(tab_str9,0x84);
                    for(i=0;i<15;i++)
                     _delay(50000);                    

                     }
                    _pa4=0;
                   }
             }

}

⌨️ 快捷键说明

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