#include#define uchar unsigned char// 宏#define uint unsigned int // 定#define dataport P0 //定义数据端口 程序中遇到dataport 则用P0 替换 义#define KeyPort P2 //定义数据端口 程序中遇到KeyPort 则用P2 替换/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////uchar code table0[9]={0xfe,0xfb,0xef,0xbf,0x7f,0xdf,0xf7,0xfd,0xff}; //1 3 5 7 8 6 4 2 0 led流水灯uchar code table1[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 显示段码值0~9uchar code table2[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位码uchar code table3[]={0x88,0x83,0xc6,0xa1,0x86,0x8e}; //共阳数码管显示***it key1=P3^0;***it key2=P3^1;***it key3=P3^2;***it key4=P3^3;***it key5=P3^4;//***it key6=P2^0;***it dula=P3^5;***it wela=P3^6;***it beep=P3^7;uchar temp[8]; //存储显示值的全局变量////////////////////////////////////////////////////////////////////////////////uchar keycount=0,keycount0=0,flag,flag0,flag1,flag2;uchar code tabledu[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};// 段码uchar code tablewe[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//位码uchar code yesno[]={0x6e,0x7b,0x6d,0x37,0x3f};uchar tempdata[10]; //存储显示值的全局变量uchar tempdata1[10];uchar tempdata2[10];uchar distable[8]={0};uchar distable1[8]={0};///////////////////////////////////////////////函数声明void delayms(uint); //ms延时void delay(uint);//us延时void beepon(uint,uint,uint,uint);//蜂鸣器调频void display();//数码管递增递减 void ledsm(); //led数码管显示函数uchar keyscan(void);//键盘扫描uchar keyscan0(void);uchar keypro(void);uchar keypro0(void);void cunchu1();void cunchu2();void display2();//数码管显示void displayk2();void display3();//void display4();//void display5();//void display6();void displayk3(); //void keyscan1();void keyscan2(); //void keyscan3();//void init0();void init1();//定时器初始化////////////////////////////////////////////////////////////////////////void main(){ ledsm();}//独立键1控制数码管递增减void keyscan1(){ if (key1==0) { delayms(10); if(key1==0) { char num=1; uint j; while(1) { j++; if(j==30) //检测当前数值显示了一小段时间后, //需要显示的数值加1,实现数据显示的变化 { j=0; num=num+2; if(num==101)//用于显示0~99 { num=98; while(1) { j++; if(j==30) { j=0; num=num-2; if(num==-2) { while(1) { wela=1; P0=0xff; wela=0; flag1=1; keyscan2(); } } } temp[0]=table1[num/10];//分解显示信息,//如要显示68,则68/10=6 68%10=8 temp[1]=table1[num%10]; display(); } } } temp[0]=table1[num/10];//分解显示信息,//如要显示68,则68/10=6 68%10=8 temp[1]=table1[num%10]; display(); } while(!key1); } }}//独立键2 控制输入设置密码void keyscan2(){ if(key2==0) { delayms(10); if(key2==0) { uchar num,i,j; uchar temp0[8]; beepon(2,100,80,200); init0(); while(1) { num=keypro(); if(num!=0xff) { if(i<8) { temp0=tabledu[num]; for(j=0;j<=i;j++) tempdata[7-i+j]=temp0[j]; } i++; } if(key3==0) //进入独立键3 控制显示密码 { for(j=0;j<8;j++)//清屏 tempdata[j]=0; flag1=2; displayk3(); //显示密码函数 keyscan3(); //进入 再次输入密码函数 } } } } }//再次输入密码 以及 密码错则进入key5 密码对则进入key6 void keyscan3(){ uchar num,i,j,n; uchar temp1[8]; beepon(2,100,80,200); init1(); n=0; while(n==0) { num=keypro0(); if(num!=0xff) { if(i<8) { temp1=tabledu[num]; for(j=0;j<=i;j++) tempdata2[7-i+j]=temp1[j]; } i++; } if(key4==0) //独立键4确定密码输入 控制密码比对 { if((distable[0]==distable1[0]) &&(distable[1]==distable1[1]) &&(distable[2]==distable1[2]) &&(distable[3]==distable1[3]) &&(distable[4]==distable1[4]) &&(distable[5]==distable1[5]) &&(distable[6]==distable1[6]) &&(distable[7]==distable1[7])) { beepon(1,100,80,200); //蜂鸣器响1次 while(1) { display4(); if(key6==0) //密码对 独立键6控制共阳数码管a~f 显示 { display6(); //共阳数码管a~f 显示函数 while(1); } } } else { for(j=0;j<8;j++)//清屏 tempdata2[j]=0; n=1; beepon(5,100,80,200); //蜂鸣器响5次 while(n==1) { for(j=0;j<8;j++)//清屏 tempdata2[j]=0; display5(); if(key5==0) //密码错 独立键5 控制再次显示密码 -->输入密码-->比对密码 { displayk3(); n=2; //显示密码函数 } } } } }} //led流水灯和数码管的奇数累加and偶数累减void ledsm(){ uchar k; for(k=0;k<9;k++) { P1=table0[k]; delayms(300) ; } beepon(1,100,80,200); while(1) { keyscan1(); }}////////////////ms延时void delayms(uint xms) { uint i,j; for(i=xms;i>0;i--) for(j=110;j>0;j--); }/////////////us延时void delay(uint x) { while(x--);}//////////////////////////////////蜂鸣器调频 void beepon(uint t1,uint t2,uint t3,uint t4){ uint TC1,TC2; for(TC1=0;TC1
for(i=0;i<3;i++) { dataport=0; //清空数据,防止有交替重影 dula=1; //段锁存 dula=0; dataport=tablewe; //取位码 wela=1; //位锁存 wela=0; dataport=yesno; //取显示数据,段码 dula=1; //段锁存 dula=0; delay(150); }}//密码输入错误no 显示函数void display5(){ uchar i; for(i=0;i<2;i++) { dataport=0; //清空数据,防止有交替重影 dula=1; //段锁存 dula=0; dataport=tablewe; //取位码 wela=1; //位锁存 wela=0; dataport=yesno[i+3]; //取显示数据,段码 dula=1; //段锁存 dula=0; delay(150); } }// //密码输入正确共阳数码管 显示函数void display6(){ uchar i; for(i=0;i<6;i++) { P0=table3; delayms(100); } }//定时器0初始化 void init0(){ TMOD|= 0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响 TH0=(65536-50000)/256; TL0=(65536-50000)%256; EA=1; //总中断打开 ET0=1; //定时器中断打开 TR0=1; //定时器开关打开}//定时器1初始化void init1(){ TMOD|= 0x10; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响 TH1=(65536-50000)/256; TL1=(65536-50000)%256; EA=1; //总中断打开 ET1=1; //定时器中断打开 TR1=1; //定时器开关打开}void timer0() interrupt 1 { TH0=(65536-2000)/256; //重新赋值 2ms TL0=(65536-2000)%256; display2(); // 调用数码管扫描}void timer1() interrupt 3 { TH1=(65536-2000)/256; //重新赋值 2ms TL1=(65536-2000)%256; displayk2(); // 调用数码管扫描}//键盘扫描函数uchar keyscan(void) { uchar cord_h,cord_l; KeyPort=0x0f; cord_h=KeyPort&0x0f; if(cord_h!=0x0f) { delayms(10); //去抖 if((KeyPort&0x0f)!=0x0f) { cord_h=KeyPort&0x0f; KeyPort=cord_h|0xf0; cord_l=KeyPort&0xf0; while((KeyPort&0xf0)!=0xf0); return(cord_h+cord_l); } } return(0xff); //返回该值}uchar keypro(void){ if(keycount==9) keycount=0; if(flag1==1) { if(keycount>0) cunchu1(); } switch(keyscan()) { case 0x7e:keycount++;flag=0x06;return 1;break; case 0x7d:keycount++;flag=0x66;return 4;break; case 0x7b:keycount++;flag=0x07;return 7;break; case 0x77:keycount++;flag=0x3f;return 0;break; case 0xbe:keycount++;flag=0x5b;return 2;break; case 0xbd:keycount++;flag=0x6d;return 5;break; case 0xbb:keycount++;flag=0x7f;return 8;break; case 0xb7:keycount++;flag=0x71;return 15;break; case 0xde:keycount++;flag=0x4f;return 3;break; case 0xdd:keycount++;flag=0x7d;return 6;break; case 0xdb:keycount++;flag=0x6f;return 9;break; case 0xd7:keycount++;flag=0x79;return 14;break; case 0xee:keycount++;flag=0x77;return 10;break; case 0xed:keycount++;flag=0x7c;return 11;break; case 0xeb:keycount++;flag=0x39;return 12;break; case 0xe7:keycount++;flag=0x5e;return 13;break; default:return 0xff;break; } }//第一次输入密码数据存储void cunchu1(){ switch(keycount) { case 1:distable[0]=flag;break; case 2:distable[1]=flag;break; case 3:distable[2]=flag;break; case 4:distable[3]=flag;break; case 5:distable[4]=flag;break; case 6:distable[5]=flag;break; case 7:distable[6]=flag;break; case 8:distable[7]=flag;break; default:break; }}uchar keyscan0(void) //键盘扫描函数,使用行列反转扫描法{ uchar cord_h,cord_l;//行列值中间变量 KeyPort=0x0f; //行线输出全为0 cord_h=KeyPort&0x0f; //读入列线值 if(cord_h!=0x0f) //先检测有无按键按下 { delayms(10); //去抖 if((KeyPort&0x0f)!=0x0f) { cord_h=KeyPort&0x0f; //读入列线值 KeyPort=cord_h|0xf0; //输出当前列线值 cord_l=KeyPort&0xf0; //读入行线值 while((KeyPort&0xf0)!=0xf0);//等待松开并输出 return(cord_h+cord_l);//键盘最后组合码值 } } return(0xff); //返回该值}uchar keypro0(void){ if(keycount0==9) keycount0=0; if(flag1==2) { if(keycount0>0) cunchu2(); } switch(keyscan0()) { case 0x7e:keycount0++;flag0=0x06;return 1;break; case 0x7d:keycount0++;flag0=0x66;return 4;break; case 0x7b:keycount0++;flag0=0x07;return 7;break; case 0x77:keycount0++;flag0=0x3f;return 0;break; case 0xbe:keycount0++;flag0=0x5b;return 2;break; case 0xbd:keycount0++;flag0=0x6d;return 5;break; case 0xbb:keycount0++;flag0=0x7f;return 8;break; case 0xb7:keycount0++;flag0=0x71;return 15;break; case 0xde:keycount0++;flag0=0x4f;return 3;break; case 0xdd:keycount0++;flag0=0x7d;return 6;break; case 0xdb:keycount0++;flag0=0x6f;return 9;break; case 0xd7:keycount0++;flag0=0x79;return 14;break; case 0xee:keycount0++;flag0=0x77;return 10;break; case 0xed:keycount0++;flag0=0x7c;return 11;break; case 0xeb:keycount0++;flag0=0x39;return 12;break; case 0xe7:keycount0++;flag0=0x5e;return 13;break; default:return 0xff;break; } }//第二次输入密码数据存储void cunchu2(){ switch(keycount0) { case 1:distable1[0]=flag0;break; case 2:distable1[1]=flag0;break; case 3:distable1[2]=flag0;break; case 4:distable1[3]=flag0;break; case 5:distable1[4]=flag0;break; case 6:distable1[5]=flag0;break; case 7:distable1[6]=flag0;break; case 8:distable1[7]=flag0;break; default:break; }}
#include#define uchar unsigned char// 宏#define uint unsigned int // 定#define dataport P0 //定义数据端口 程序中遇到dataport 则用P0 替换 义#define KeyPort P2 //定义数据端口 程序中遇到KeyPort 则用P2 替换/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////uchar code table0[9]={0xfe,0xfb,0xef,0xbf,0x7f,0xdf,0xf7,0xfd,0xff}; //1 3 5 7 8 6 4 2 0 led流水灯uchar code table1[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 显示段码值0~9uchar code table2[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位码uchar code table3[]={0x88,0x83,0xc6,0xa1,0x86,0x8e}; //共阳数码管显示***it key1=P3^0;***it key2=P3^1;***it key3=P3^2;***it key4=P3^3;***it key5=P3^4;//***it key6=P2^0;***it dula=P3^5;***it wela=P3^6;***it beep=P3^7;uchar temp[8]; //存储显示值的全局变量////////////////////////////////////////////////////////////////////////////////uchar keycount=0,keycount0=0,flag,flag0,flag1,flag2;uchar code tabledu[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};// 段码uchar code tablewe[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//位码uchar code yesno[]={0x6e,0x7b,0x6d,0x37,0x3f};uchar tempdata[10]; //存储显示值的全局变量uchar tempdata1[10];uchar tempdata2[10];uchar distable[8]={0};uchar distable1[8]={0};///////////////////////////////////////////////函数声明void delayms(uint); //ms延时void delay(uint);//us延时void beepon(uint,uint,uint,uint);//蜂鸣器调频void display();//数码管递增递减 void ledsm(); //led数码管显示函数uchar keyscan(void);//键盘扫描uchar keyscan0(void);uchar keypro(void);uchar keypro0(void);void cunchu1();void cunchu2();void display2();//数码管显示void displayk2();void display3();//void display4();//void display5();//void display6();void displayk3(); //void keyscan1();void keyscan2(); //void keyscan3();//void init0();void init1();//定时器初始化////////////////////////////////////////////////////////////////////////void main(){ ledsm();}//独立键1控制数码管递增减void keyscan1(){ if (key1==0) { delayms(10); if(key1==0) { char num=1; uint j; while(1) { j++; if(j==30) //检测当前数值显示了一小段时间后, //需要显示的数值加1,实现数据显示的变化 { j=0; num=num+2; if(num==101)//用于显示0~99 { num=98; while(1) { j++; if(j==30) { j=0; num=num-2; if(num==-2) { while(1) { wela=1; P0=0xff; wela=0; flag1=1; keyscan2(); } } } temp[0]=table1[num/10];//分解显示信息,//如要显示68,则68/10=6 68%10=8 temp[1]=table1[num%10]; display(); } } } temp[0]=table1[num/10];//分解显示信息,//如要显示68,则68/10=6 68%10=8 temp[1]=table1[num%10]; display(); } while(!key1); } }}//独立键2 控制输入设置密码void keyscan2(){ if(key2==0) { delayms(10); if(key2==0) { uchar num,i,j; uchar temp0[8]; beepon(2,100,80,200); init0(); while(1) { num=keypro(); if(num!=0xff) { if(i<8) { temp0=tabledu[num]; for(j=0;j<=i;j++) tempdata[7-i+j]=temp0[j]; } i++; } if(key3==0) //进入独立键3 控制显示密码 { for(j=0;j<8;j++)//清屏 tempdata[j]=0; flag1=2; displayk3(); //显示密码函数 keyscan3(); //进入 再次输入密码函数 } } } } }//再次输入密码 以及 密码错则进入key5 密码对则进入key6 void keyscan3(){ uchar num,i,j,n; uchar temp1[8]; beepon(2,100,80,200); init1(); n=0; while(n==0) { num=keypro0(); if(num!=0xff) { if(i<8) { temp1=tabledu[num]; for(j=0;j<=i;j++) tempdata2[7-i+j]=temp1[j]; } i++; } if(key4==0) //独立键4确定密码输入 控制密码比对 { if((distable[0]==distable1[0]) &&(distable[1]==distable1[1]) &&(distable[2]==distable1[2]) &&(distable[3]==distable1[3]) &&(distable[4]==distable1[4]) &&(distable[5]==distable1[5]) &&(distable[6]==distable1[6]) &&(distable[7]==distable1[7])) { beepon(1,100,80,200); //蜂鸣器响1次 while(1) { display4(); if(key6==0) //密码对 独立键6控制共阳数码管a~f 显示 { display6(); //共阳数码管a~f 显示函数 while(1); } } } else { for(j=0;j<8;j++)//清屏 tempdata2[j]=0; n=1; beepon(5,100,80,200); //蜂鸣器响5次 while(n==1) { for(j=0;j<8;j++)//清屏 tempdata2[j]=0; display5(); if(key5==0) //密码错 独立键5 控制再次显示密码 -->输入密码-->比对密码 { displayk3(); n=2; //显示密码函数 } } } } }} //led流水灯和数码管的奇数累加and偶数累减void ledsm(){ uchar k; for(k=0;k<9;k++) { P1=table0[k]; delayms(300) ; } beepon(1,100,80,200); while(1) { keyscan1(); }}////////////////ms延时void delayms(uint xms) { uint i,j; for(i=xms;i>0;i--) for(j=110;j>0;j--); }/////////////us延时void delay(uint x) { while(x--);}//////////////////////////////////蜂鸣器调频 void beepon(uint t1,uint t2,uint t3,uint t4){ uint TC1,TC2; for(TC1=0;TC1
for(i=0;i<3;i++) { dataport=0; //清空数据,防止有交替重影 dula=1; //段锁存 dula=0; dataport=tablewe; //取位码 wela=1; //位锁存 wela=0; dataport=yesno; //取显示数据,段码 dula=1; //段锁存 dula=0; delay(150); }}//密码输入错误no 显示函数void display5(){ uchar i; for(i=0;i<2;i++) { dataport=0; //清空数据,防止有交替重影 dula=1; //段锁存 dula=0; dataport=tablewe; //取位码 wela=1; //位锁存 wela=0; dataport=yesno[i+3]; //取显示数据,段码 dula=1; //段锁存 dula=0; delay(150); } }// //密码输入正确共阳数码管 显示函数void display6(){ uchar i; for(i=0;i<6;i++) { P0=table3; delayms(100); } }//定时器0初始化 void init0(){ TMOD|= 0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响 TH0=(65536-50000)/256; TL0=(65536-50000)%256; EA=1; //总中断打开 ET0=1; //定时器中断打开 TR0=1; //定时器开关打开}//定时器1初始化void init1(){ TMOD|= 0x10; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响 TH1=(65536-50000)/256; TL1=(65536-50000)%256; EA=1; //总中断打开 ET1=1; //定时器中断打开 TR1=1; //定时器开关打开}void timer0() interrupt 1 { TH0=(65536-2000)/256; //重新赋值 2ms TL0=(65536-2000)%256; display2(); // 调用数码管扫描}void timer1() interrupt 3 { TH1=(65536-2000)/256; //重新赋值 2ms TL1=(65536-2000)%256; displayk2(); // 调用数码管扫描}//键盘扫描函数uchar keyscan(void) { uchar cord_h,cord_l; KeyPort=0x0f; cord_h=KeyPort&0x0f; if(cord_h!=0x0f) { delayms(10); //去抖 if((KeyPort&0x0f)!=0x0f) { cord_h=KeyPort&0x0f; KeyPort=cord_h|0xf0; cord_l=KeyPort&0xf0; while((KeyPort&0xf0)!=0xf0); return(cord_h+cord_l); } } return(0xff); //返回该值}uchar keypro(void){ if(keycount==9) keycount=0; if(flag1==1) { if(keycount>0) cunchu1(); } switch(keyscan()) { case 0x7e:keycount++;flag=0x06;return 1;break; case 0x7d:keycount++;flag=0x66;return 4;break; case 0x7b:keycount++;flag=0x07;return 7;break; case 0x77:keycount++;flag=0x3f;return 0;break; case 0xbe:keycount++;flag=0x5b;return 2;break; case 0xbd:keycount++;flag=0x6d;return 5;break; case 0xbb:keycount++;flag=0x7f;return 8;break; case 0xb7:keycount++;flag=0x71;return 15;break; case 0xde:keycount++;flag=0x4f;return 3;break; case 0xdd:keycount++;flag=0x7d;return 6;break; case 0xdb:keycount++;flag=0x6f;return 9;break; case 0xd7:keycount++;flag=0x79;return 14;break; case 0xee:keycount++;flag=0x77;return 10;break; case 0xed:keycount++;flag=0x7c;return 11;break; case 0xeb:keycount++;flag=0x39;return 12;break; case 0xe7:keycount++;flag=0x5e;return 13;break; default:return 0xff;break; } }//第一次输入密码数据存储void cunchu1(){ switch(keycount) { case 1:distable[0]=flag;break; case 2:distable[1]=flag;break; case 3:distable[2]=flag;break; case 4:distable[3]=flag;break; case 5:distable[4]=flag;break; case 6:distable[5]=flag;break; case 7:distable[6]=flag;break; case 8:distable[7]=flag;break; default:break; }}uchar keyscan0(void) //键盘扫描函数,使用行列反转扫描法{ uchar cord_h,cord_l;//行列值中间变量 KeyPort=0x0f; //行线输出全为0 cord_h=KeyPort&0x0f; //读入列线值 if(cord_h!=0x0f) //先检测有无按键按下 { delayms(10); //去抖 if((KeyPort&0x0f)!=0x0f) { cord_h=KeyPort&0x0f; //读入列线值 KeyPort=cord_h|0xf0; //输出当前列线值 cord_l=KeyPort&0xf0; //读入行线值 while((KeyPort&0xf0)!=0xf0);//等待松开并输出 return(cord_h+cord_l);//键盘最后组合码值 } } return(0xff); //返回该值}uchar keypro0(void){ if(keycount0==9) keycount0=0; if(flag1==2) { if(keycount0>0) cunchu2(); } switch(keyscan0()) { case 0x7e:keycount0++;flag0=0x06;return 1;break; case 0x7d:keycount0++;flag0=0x66;return 4;break; case 0x7b:keycount0++;flag0=0x07;return 7;break; case 0x77:keycount0++;flag0=0x3f;return 0;break; case 0xbe:keycount0++;flag0=0x5b;return 2;break; case 0xbd:keycount0++;flag0=0x6d;return 5;break; case 0xbb:keycount0++;flag0=0x7f;return 8;break; case 0xb7:keycount0++;flag0=0x71;return 15;break; case 0xde:keycount0++;flag0=0x4f;return 3;break; case 0xdd:keycount0++;flag0=0x7d;return 6;break; case 0xdb:keycount0++;flag0=0x6f;return 9;break; case 0xd7:keycount0++;flag0=0x79;return 14;break; case 0xee:keycount0++;flag0=0x77;return 10;break; case 0xed:keycount0++;flag0=0x7c;return 11;break; case 0xeb:keycount0++;flag0=0x39;return 12;break; case 0xe7:keycount0++;flag0=0x5e;return 13;break; default:return 0xff;break; } }//第二次输入密码数据存储void cunchu2(){ switch(keycount0) { case 1:distable1[0]=flag0;break; case 2:distable1[1]=flag0;break; case 3:distable1[2]=flag0;break; case 4:distable1[3]=flag0;break; case 5:distable1[4]=flag0;break; case 6:distable1[5]=flag0;break; case 7:distable1[6]=flag0;break; case 8:distable1[7]=flag0;break; default:break; }}
|