#includereg51.h#defineucharunsignedchar#defineuintunsignedintuints[4];/*输入密码的储存数组*/sbitkey4=P2^1;/*这个是红外模块的输出端*/sbitkey1=P2^0;/*震动感应端口*/sbitkey2=P2^2;/*用于提示有人经过,红灯闪烁*/sbitkey3=P2^3;/*当密码输入正确时,绿灯闪烁*/sbitkey5=P2^4;/*蜂鸣器端口*//*/键盘使用P1口*/voiddelay1(unsignedintc);#ifndef__LCD_H_#define__LCD_H_/**********************************当使用的是4位数据传输的时候定义,使用8位取消这个定义**********************************/#defineLCD1602_4PINS#ifndefuchar#defineucharunsignedchar#endif#ifndefuint#defineuintunsignedint#endif/**********************************PIN口定义**********************************/#defineLCD1602_DATAPINSP0sbitLCD1602_E=P2^7;sbitLCD1602_RW=P2^5;sbitLCD1602_RS=P2^6;/**********************************函数声明**********************************//*在51单片机12MHZ时钟下的延时函数*/voidLcd1602_Delay1ms(uintc);//误差0us/*LCD1602写入8位命令子函数*/voidLcdWriteCom(ucharcom);/*LCD1602写入8位数据子函数*/voidLcdWriteData(uchardat);/*LCD1602初始化子程序*/voidLcdInit();#endif#defineuncharunsignedchar#defineunintunsignedintuninttemp,key;ucharnum;ucharnum1;voidzhongduan0(){num=0;num1=0;TMOD=0x11;TH0=(65536-50000)/256;TL0=(65536-50000)%256;TH1=(65536-50000)/256;TL1=(65536-50000)%256;EA=1;ET0=1;TR0=1;ET1=1;TR1=1;}voidT0_time()interrupt1{TH0=(65536-50000)/256;TL0=(65536-50000)%256;num++;}voidT1_time()interrupt3{TH1=(65536-50000)/256;TL1=(65536-50000)%256;num1++;}voiddelay(unintxms){uninti,j;for(i=xms;i0;i--)for(j=110;j0;j--);}voidkeyscan(){unchark=0;num1=0;s[1]=0;s[0]=0;s[2]=0;s[3]=0;while(k4&&num190){P1=0xfe;temp=P1;temp=temp&0xf0;if(temp!=0xf0){delay(10);temp=P1;temp=temp&0xf0;if(temp!=0xf0){temp=P1;switch(temp){case0xee:key=15;break;case0xde:key=15;break;case0xbe:key=15;break;case0x7e:key=15;break;}s[k]=key;k++;while(temp!=0xf0){temp=P1;temp=temp&0xf0;}}}P1=0xfd;temp=P1;temp=temp&0xf0;if(temp!=0xf0){delay(10);temp=P1;temp=temp&0xf0;if(temp!=0xf0){temp=P1;switch(temp){case0xed:key=9;break;case0xdd:key=6;break;case0xbd:key=3;break;case0x7d:key=15;break;}s[k]=key;k++;while(temp!=0xf0){temp=P1;temp=temp&0xf0;}}}P1=0xfb;temp=P1;temp=temp&0xf0;if(temp!=0xf0){delay(10);temp=P1;temp=temp&0xf0;if(temp!=0xf0){temp=P1;switch(temp){case0xeb:key=8;break;case0xdb:key=5;break;case0xbb:key=2;break;case0x7b:key=0;break;}s[k]=key;k++;while(temp!=0xf0){temp=P1;temp=temp&0xf0;}}}P1=0xf7;temp=P1;temp=temp&0xf0;if(temp!=0xf0){delay(10);temp=P1;temp=temp&0xf0;if(temp!=0xf0){temp=P1;switch(temp){case0xe7:key=7;break;case0xd7:key=4;break;case0xb7:key=1;break;case0x77:key=15;break;}s[k]=key;k++;while(temp!=0xf0){temp=P1;temp=temp&0xf0;}}}}}voidfengming(){num=0;while(num20){key5=0;}key5=1;EA=0;num=0;}/********************************************************************************函数名:Lcd1602_Delay1ms*函数功能:延时函数,延时1ms*输入:c*输出:无*说名:该函数是在12MHZ晶振下,12分频单片机的延时。*******************************************************************************/voidLcd1602_Delay1ms(uintc)//误差0us{uchara,b;for(;c0;c--){for(b=199;b0;b--){for(a=1;a0;a--);}}}/********************************************************************************函数名:LcdWriteCom*函数功能:向LCD写入一个字节的命令*输入:com*输出:无*******************************************************************************/#ifndefLCD1602_4PINS//当没有定义这个LCD1602_4PINS时voidLcdWriteCom(ucharcom)//写入命令{LCD1602_E=0;//使能LCD1602_RS=0;//选择发送命令LCD1602_RW=0;//选择写入LCD1602_DATAPINS=com;//放入命令Lcd1602_Delay1ms(1);//等待数据稳定LCD1602_E=1;//写入时序Lcd1602_Delay1ms(5);//保持时间LCD1602_E=0;}#elsevoidLcdWriteCom(ucharcom)//写入命令{LCD1602_E=0;//使能清零LCD1602_RS=0;//选择写入命令LCD1602_RW=0;//选择写入LCD1602_DATAPINS=com;//由于4位的接线是接到P0口的高四位,所以传送高四位不用改Lcd1602_Delay1ms(1);LCD1602_E=1;//写入时序Lcd1602_Delay1ms(5);LCD1602_E=0;//Lcd1602_Delay1ms(1);LCD1602_DATAPINS=com4;//发送低四位Lcd1602_Delay1ms(1);LCD1602_E=1;//写入时序Lcd1602_Delay1ms(5);LCD1602_E=0;}#endif/********************************************************************************函数名:LcdWriteData*函数功能:向LCD写入一个字节的数据*输入:dat*输出:无*******************************************************************************/#ifndefLCD1602_4PINSvoidLcdWriteData(uchardat)//写入数据{LCD1602_E=0;//使能清零LCD1602_RS=1;//选择输入数据LCD1602_RW=0;//选择写入LCD1602_DATAPINS=dat;//写入数据Lcd1602_Delay1ms(1);LCD1602_E=1;//写入时序Lcd1602_Delay1ms(5);//保持时间LCD1602_E=0;}#elsevoidLcdWriteData(uchardat)//写入数据{LCD1602_E=0;//使能清零LCD1602_RS=1;//选择写入数据LCD1602_RW=0;//选择写入LCD1602_DATAPINS=dat;//由于4位的接线是接到P0口的高四位,所以传送高四位不用改Lcd1602_Delay1ms(1);LCD1602_E=1;//写入时序Lcd1602_Delay1ms(5);LCD1602_E=0;LCD1602_DATAPINS=dat4;//写入低四位Lcd1602_Delay1ms(1);LCD1602_E=1;//写入时序Lcd1602_Delay1ms(5);LCD1602_E=0;}#endif/********************************************************************************函数名:LcdInit()*函数功能:初始化LCD屏*输入:无*输出:无*******************************************************************************/#ifndefLCD1602_4PINSvoidLcdInit()//LCD初始化子程序{LcdWriteCom(0x38);//开显示LcdWriteCom(0x0c);//开显示不显示光标LcdWriteCom(0x06);//写一个指针加1LcdWriteCom(0x01);//清屏LcdWriteCom(0x80);//设置数据指针起点}#elsevoidLcdInit()//LCD初始化子程序{LcdWriteCom(0x32);//将8位总线转为4位总线LcdWriteCom(0x28);//在四位线下的初始化LcdWriteCom(0x0c);//开显示不显示光标LcdWriteCom(0x06);//写一个指针加1LcdWriteCom(0x01);//清屏LcdWriteCom(0x80);//设置数据指针起点}#endif//--定义