📄 终极版.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 + -