/************************************************************************************************* **** 调 试:周继承 **** Email: zhoujichengxi@163.com ************************************************************************************************* **** 1. MCU:at89s51 **** 2. 晶振:12MH **** 3. 2009.06. 完成 ************************************************************************************************* ************************************************************************************************/ #include<reg51.h> #define uchar unsigned char; #define uint unsigned int; void delay(void); void delay1(void); void right(void); write(void); uchar A[]={0,1,2,3,4,5}; uchar B1[]={0,0,0,0,0,0}; uchar B2[]={0,0,0,0,0,0}; uint key_data[]={0xe7,0xeb,0xed,0xee,0xd7,0xdb,0xdd,0xde,0xb7,0xbb,0xbd,0xbe}; char zhuan[12]={0,1,2,3,4,5,6,7,8,9,0x0a,0x0b};//键盘编号转化为对应的数字 uchar temp,temp1,i,y,c,c1; c=0; uint s,j; main() { EX1=1; PX1=1; IT1=1; c1=0; begin: s=5000; EA=1; ET0=1; TMOD=0x01; //定时器0为工作方式1 TH0=(65535-5000)/256; TL0=(65535-5000)%256; //初植 TR0=1;//启动定时器 P1=0xfe; while(1) {if(s==0) goto loop; y=write(); if(y!=0x0c) break; } B1[0]=y; while(1) {if(s==0) goto loop; y=write(); if(y!=0x0c) break; } B1[1]=y; while(1) {if(s==0) goto loop; y=write(); if(y!=0x0c) break; } B1[2]=y; while(1) {if(s==0) goto loop; y=write(); if(y!=0x0c) break; } B1[3]=y; while(1) {if(s==0) goto loop; y=write(); if(y!=0x0c) break; } B1[4]=y; while(1) {if(s==0) goto loop; y=write(); if(y!=0x0c) break; } B1[5]=y; TR0=0; P1=0xff; if(B1[0]==A[0]) {if(B1[1]==A[1]) {if(B1[2]==A[2]) {if(B1[3]==A[3]) {if(B1[4]==A[4]) {if(B1[5]==A[5]) P1=0x00; delay1(); right(); loop: TR0=0; P1=0xff; PCON=0x01; goto begin;}}}}} {P1=0xf0; delay1(); c1++; if(c1<3) goto begin; c1=0;//还原C1的值 for(i=0;i<100;i++) { P1=0xf0; delay(); P1=0xff; delay(); } P1=0xff; PCON=0x01;// 进入休眠 goto begin; } } /********************************************************************* **** 子 程 序:读取键值服务程序 **** 入口参数: **** 出口参数: **** 功能描述: **** 其他说明: **** 创 建 人:周继承 **** 日 期:2009.06.17 **** 版 本: **** 公司名称: **********************************************************************/ write()//键值输入子函数 { P0=0xf0;//送测试数据 if(P0!=0xf0)//回读看是否有变化,如有则有键下 {void delay();//有按键按下时延时去抖 if(P0!=0xf0)//再读是否有键按下 {P0=0xf0; // 再送测试数据 temp=P0;//保存行或列值 P0=0x0f;//数据反转 temp=P0|temp; P1=0xbe; for(i=0;i<16;i++) {if(temp==key_data) temp=zhuan; } P0=0xf0;//送测试数据 delay(); if(P0==0xf0) { P1=0xfe; return(temp);}//如果有键按下返回键值 } } return(0x0c);//如果没有键按下返回无效值 }/********************************************************************* **** 子 程 序:延时去抖 **** 入口参数: **** 出口参数: **** 功能描述: **** 其他说明: **** 创 建 人:周继承 **** 日 期:2009.06.17 **** 版 本:v1.0 **** 公司名称: **********************************************************************/ void delay(void)//延时去抖 { for(j=0;j<3000;j++); } /********************************************************************* **** 子 程 序:定时中断0 **** 入口参数: **** 出口参数: **** 功能描述: **** 其他说明: **** 创 建 人:周继承 **** 日 期:2009.06.17 **** 版 本:v1.0 **** 公司名称: **********************************************************************/ void timer0() interrupt 1//延时用于控制密码输入时间 {TMOD=0x01; //定时器0为工作方式1 TH0=(65535-5000)/256; TL0=(65535-5000)%256;//初植 TR0=1;//启动定时器 s--; } /********************************************************************* **** 子 程 序:读取密码正确状态服务程序 **** 入口参数: **** 出口参数: **** 功能描述: **** 其他说明: **** 创 建 人:周继承 **** 日 期:2009.06.17 **** 版 本: **** 公司名称: **********************************************************************/ void right()//正确情况下子函数 { c=0; c1=0; TR0=0; P1=0xff; loop5: s=5000; EA=1; ET0=1; TMOD=0x01; //定时器0为工作方式1 TH0=(65535-5000)/256; TL0=(65535-5000)%256; //初植 TR0=1;//启动定时器 P1=0xfe; while(1) { y=write(); if(y==0x0a) goto loop2; if(y==0x0b) goto loop3; if(s==0) break; } P1=0xff; goto loop4; loop2: P1=0xfc; //kai mem delay1(); P1=0xff; goto loop4; loop3: P1=0x00; delay1(); s=5000; EA=1; ET0=1; TMOD=0x01; //定时器0为工作方式1 TH0=(65535-5000)/256; TL0=(65535-5000)%256; //初植 TR0=1;//启动定时器 P1=0xfe; while(1) {if(s==0) goto loop4; y=write(); if(y!=0x0c) break; } B1[0]=y; while(1) {if(s==0) goto loop4; y=write(); if(y!=0x0c) break; } B1[1]=y; while(1) {if(s==0) goto loop4; y=write(); if(y!=0x0c) break; } B1[2]=y; while(1) {if(s==0) goto loop4; y=write(); if(y!=0x0c) break; } B1[3]=y; while(1) {if(s==0) goto loop4; y=write(); if(y!=0x0c) break; } B1[4]=y; while(1) {if(s==0) goto loop4; y=write(); if(y!=0x0c) break; } B1[5]=y; P1=0x00; delay1(); P1=0xff; /********************************/ s=5000; EA=1; ET0=1; TMOD=0x01; //定时器0为工作方式1 TH0=(65535-5000)/256; TL0=(65535-5000)%256; //初植 TR0=1;//启动定时器 P1=0xfe; while(1) {if(s==0) goto loop4; y=write(); if(y!=0x0c) break; } B2[0]=y; while(1) {if(s==0) goto loop4; y=write(); if(y!=0x0c) break; } B2[1]=y; while(1) {if(s==0) goto loop4; y=write(); if(y!=0x0c) break; } B2[2]=y; while(1) {if(s==0) goto loop4; y=write(); if(y!=0x0c) break; } B2[3]=y; while(1) {if(s==0) goto loop4; y=write(); if(y!=0x0c) break; } B2[4]=y; while(1) {if(s==0) goto loop4; y=write(); if(y!=0x0c) break; } B2[5]=y; /* for(i=0;i<6;i++) { while(1) { if(s==0) goto loop4; y=write(); if(y!=0x0c) break; } B2=y; }*/ P1=0x00; delay1(); P1=0xff; for(i=0;i<6;i++) {if(B1==B2) c++; } if(c<5) {P1=0xf0; delay1(); c1++; if(c1<3) goto loop5; for(i=0;i<100;i++) { P1=0xf0; delay(); P1=0xff; delay(); } goto loop4; } for(i=0;i<6;i++) A=B1; P1=0x55; delay1();
loop4: TR0=0; P1=0xff; } /********************************************************************* **** 子 程 序: **** 入口参数: **** 出口参数: **** 功能描述: **** 其他说明: **** 创 建 人:周继承 **** 日 期:2009.06.17 **** 版 本: **** 公司名称: **********************************************************************/ void EXT1() interrupt 2 {PCON=0x00; } /*问题有两个不能理解: *1,为什么读取键值的时候不能用循环,循环 for(i=0;i<6;i++) { while(1) { if(s==0) goto loop4; y=write(); if(y!=0x0c) break; } B2=y; } 使用时跳出break后不再循环for(i=0;i<6;i++) 2,为什么把原始密码更改为有6的后就不能识别密码了,希望大家给点意见,共同进步!周继承在此感谢!QQ:551684929*/
[此贴子已经被作者于2009-6-27 11:03:16编辑过]
|