1. 实验任务 用4×4组成0-9数字键及确认键。 用8位数码管组成显示电路提示信息,当输入密码时,只显示“8.”,当密码位数输入完毕按下确认键时,对输入的密码与设定的密码进行比较,若密码正确,则门开,此处用LED发光二极管亮一秒钟做为提示,同时发出“叮咚”声;若密码不正确,禁止按键输入3秒,同时发出“嘀、嘀”报警声;若在3秒之内仍有按键按下,则禁止按键输入3秒被重新禁止。 2. 电路原理图 3. 系统板上硬件连线 (1). 把“单片机系统”区域中的P0.0-P0.7用8芯排线连接到“动态数码显示”区域中的ABCDEFGH端子上。 (2). 把“单片机系统“区域中的P2.0-P2.7用8芯排线连接到“动态数码显示”区域中的S1S2S3S4S5S6S7S8端子上。 (3). 把“单片机系统”区域中的P3.0-P3.7用8芯排线连接到“4×4行列式键盘”区域中的R1R2R3R4C1C2C3C4端子上。 (4). 把“单片机系统”区域中的P1.0用导线连接到“八路发光二极管模块”区域中的L2端子上。 (5). 把“单片机系统”区域中的P1.7用导线连接到“音频放大模块”区域中的SPK IN端子上。 (6). 把“音频放大模块”区域中的SPK OUT接到喇叭上。 4. 程序设计内容 (1). 4×4行列式键盘识别技术:有关这方面内容前面已经讨论过,这里不再重复。 (2). 8位数码显示,初始化时,显示“P ”,接着输入最大6位数的密码,当密码输入完后,按下确认键,进行密码比较,然后给出相应的信息。在输入密码过程中,显示器只显示“8.”。当数字输入超过6个时,给出报警信息。在密码输入过程中,若输入错误,可以利用“DEL”键删除刚才输入的错误的数字。 (3). 4×4行列式键盘的按键功能分布图如图4.33.2所示: 图4.33.2
5. 单片机C语言源程序
- #include <AT89X52.H>
-
- unsigned char ps[]={1,2,3,4,5};
-
- unsigned char code dispbit[]={0xfe,0xfd,0xfb,0xf7,
- 0xef,0xdf,0xbf,0x7f};
- unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f,0x66,
- 0x6d,0x7d,0x07,0x7f,0x6f,
- 0x77,0x7c,0x39,0x5e,0x79,0x71,
- 0x00,0x40,0x73,0xff};
- unsigned char dispbuf[8]={18,16,16,16,16,16,16,16};
- unsigned char dispcount;
- unsigned char flashcount;
- unsigned char temp;
- unsigned char key;
- unsigned char keycount;
- unsigned char pslen=5;
- unsigned char getps[6];
- bit keyoverflag;
- bit errorflag;
- bit rightflag;
- unsigned int second3;
- unsigned int aa,bb;
- unsigned int cc;
- bit okflag;
- bit alarmflag;
- bit hibitflag;
- unsigned char oka,okb;
-
- void main(void)
- {
- unsigned char i,j;
-
- TMOD=0x01;
- TH0=(65536-500)/256;
- TL0=(65536-500)%256;
- TR0=1;
- ET0=1;
- EA=1;
-
- while(1)
- {
- P3=0xff;
- P3_4=0;
- temp=P3;
- temp=temp & 0x0f;
- if (temp!=0x0f)
- {
- for(i=10;i>0;i--)
- for(j=248;j>0;j--);
- temp=P3;
- temp=temp & 0x0f;
- if (temp!=0x0f)
- {
- temp=P3;
- temp=temp & 0x0f;
- switch(temp)
- {
- case 0x0e:
- key=7;
- break;
- case 0x0d:
- key=8;
- break;
- case 0x0b:
- key=9;
- break;
- case 0x07:
- key=10;
- break;
- }
- temp=P3;
- P1_1=~P1_1;
- if((key>=0) && (key<10))
- {
- if(keycount<6)
- {
- getps[keycount]=key;
- dispbuf[keycount+2]=19;
- }
- keycount++;
- if(keycount==6)
- {
- keycount=6;
- }
- else if(keycount>6)
- {
- keycount=6;
- keyoverflag=1;//key overflow
- }
- }
- else if(key==12)//delete key
- {
- if(keycount>0)
- {
- keycount--;
- getps[keycount]=0;
- dispbuf[keycount+2]=16;
- }
- else
- {
- keyoverflag=1;
- }
- }
- else if(key==15)//enter key
- {
- if(keycount!=pslen)
- {
- errorflag=1;
- rightflag=0;
- second3=0;
- }
- else
- {
- for(i=0;i<keycount;i++)
- {
- if(getps[i]!=ps[i])
- {
- i=keycount;
- errorflag=1;
- rightflag=0;
- second3=0;
- goto a;
- }
- }
- errorflag=0;
- rightflag=1;
- a: i=keycount;
- }
- }
- temp=temp & 0x0f;
- while(temp!=0x0f)
- {
- temp=P3;
- temp=temp & 0x0f;
- }
- keyoverflag=0;//?????????
- }
- }
- P3=0xff;
- P3_5=0;
- temp=P3;
- temp=temp & 0x0f;
- if (temp!=0x0f)
- {
- for(i=10;i>0;i--)
- for(j=248;j>0;j--);
- temp=P3;
- temp=temp & 0x0f;
- if (temp!=0x0f)
- {
- temp=P3;
- temp=temp & 0x0f;
- switch(temp)
- {
- case 0x0e:
- key=4;
- break;
- case 0x0d:
- key=5;
- break;
- case 0x0b:
- key=6;
- break;
- case 0x07:
- key=11;
- break;
- }
- temp=P3;
- P1_1=~P1_1;
- if((key>=0) && (key<10))
- {
- if(keycount<6)
- {
- getps[keycount]=key;
- dispbuf[keycount+2]=19;
- }
- keycount++;
- if(keycount==6)
- {
- keycount=6;
- }
- else if(keycount>6)
- {
- keycount=6;
- keyoverflag=1;//key overflow
- }
- }
- else if(key==12)//delete key
- {
- if(keycount>0)
- {
- keycount--;
- getps[keycount]=0;
- dispbuf[keycount+2]=16;
- }
- else
- {
- keyoverflag=1;
- }
- }
- else if(key==15)//enter key
- {
- if(keycount!=pslen)
- {
- errorflag=1;
- rightflag=0;
- second3=0;
- }
- else
- {
- for(i=0;i<keycount;i++)
- {
- if(getps[i]!=ps[i])
- {
- i=keycount;
- errorflag=1;
- rightflag=0;
- second3=0;
- goto a4;
- }
- }
- errorflag=0;
- rightflag=1;
- a4: i=keycount;
- }
- }
- temp=temp & 0x0f;
- while(temp!=0x0f)
- {
- temp=P3;
- temp=temp & 0x0f;
- }
- keyoverflag=0;//?????????
- }
- }
-
- P3=0xff;
- P3_6=0;
- temp=P3;
- temp=temp & 0x0f;
- if (temp!=0x0f)
- {
- for(i=10;i>0;i--)
- for(j=248;j>0;j--);
- temp=P3;
- temp=temp & 0x0f;
- if (temp!=0x0f)
- {
- temp=P3;
- temp=temp & 0x0f;
- switch(temp)
- {
- case 0x0e:
- key=1;
- break;
- case 0x0d:
- key=2;
- break;
- case 0x0b:
- key=3;
- break;
- case 0x07:
- key=12;
- break;
- }
- temp=P3;
- P1_1=~P1_1;
- if((key>=0) && (key<10))
- {
- if(keycount<6)
- {
- getps[keycount]=key;
- dispbuf[keycount+2]=19;
- }
- keycount++;
- if(keycount==6)
- {
- keycount=6;
- }
- else if(keycount>6)
- {
- keycount=6;
- keyoverflag=1;//key overflow
- }
- }
- else if(key==12)//delete key
- {
- if(keycount>0)
- {
- keycount--;
- getps[keycount]=0;
- dispbuf[keycount+2]=16;
- }
- else
- {
- keyoverflag=1;
- }
- }
- else if(key==15)//enter key
- {
- if(keycount!=pslen)
- {
- errorflag=1;
- rightflag=0;
- second3=0;
- }
- else
- {
- for(i=0;i<keycount;i++)
- {
- if(getps[i]!=ps[i])
- {
- i=keycount;
- errorflag=1;
- rightflag=0;
- second3=0;
- goto a3;
- }
- }
- errorflag=0;
- rightflag=1;
- a3: i=keycount;
- }
- }
- temp=temp & 0x0f;
- while(temp!=0x0f)
- {
- temp=P3;
- temp=temp & 0x0f;
- }
- keyoverflag=0;//?????????
- }
- }
-
- P3=0xff;
- P3_7=0;
- temp=P3;
- temp=temp & 0x0f;
- if (temp!=0x0f)
- {
- for(i=10;i>0;i--)
- for(j=248;j>0;j--);
- temp=P3;
- temp=temp & 0x0f;
- if (temp!=0x0f)
- {
- temp=P3;
- temp=temp & 0x0f;
- switch(temp)
- {
- case 0x0e:
- key=0;
- break;
- case 0x0d:
- key=13;
- break;
- case 0x0b:
- key=14;
- break;
- case 0x07:
- key=15;
- break;
- }
- temp=P3;
- P1_1=~P1_1;
- if((key>=0) && (key<10))
- {
- if(keycount<6)
- {
- getps[keycount]=key;
- dispbuf[keycount+2]=19;
- }
- keycount++;
- if(keycount==6)
- {
- keycount=6;
- }
- else if(keycount>6)
- {
- keycount=6;
- keyoverflag=1;//key overflow
- }
- }
- else if(key==12)//delete key
- {
- if(keycount>0)
- {
- keycount--;
- getps[keycount]=0;
- dispbuf[keycount+2]=16;
- }
- else
- {
- keyoverflag=1;
- }
- }
- else if(key==15)//enter key
- {
- if(keycount!=pslen)
- {
- errorflag=1;
- rightflag=0;
- second3=0;
- }
- else
- {
- for(i=0;i<keycount;i++)
- {
- if(getps[i]!=ps[i])
- {
- i=keycount;
- errorflag=1;
- rightflag=0;
- second3=0;
- goto a2;
- }
- }
- errorflag=0;
- rightflag=1;
- a2: i=keycount;
- }
- }
- temp=temp & 0x0f;
- while(temp!=0x0f)
- {
- temp=P3;
- temp=temp & 0x0f;
- }
- keyoverflag=0;//?????????
- }
- }
- }
- }
- void t0(void) interrupt 1 using 0
- {
- TH0=(65536-500)/256;
- TL0=(65536-500)%256;
-
- flashcount++;
- if(flashcount==8)
- {
- flashcount=0;
- P0=dispcode[dispbuf[dispcount]];
- P2=dispbit[dispcount];
- dispcount++;
- if(dispcount==8)
- {
- dispcount=0;
- }
- }
-
- if((errorflag==1) && (rightflag==0))
- {
- bb++;
- if(bb==800)
- {
- bb=0;
- alarmflag=~alarmflag;
- }
- if(alarmflag==1)//sound alarm signal
- {
- P1_7=~P1_7;
- }
-
- aa++;
- if(aa==800)//light alarm signal
- {
- aa=0;
- P1_0=~P1_0;
- }
- second3++;
- if(second3==6400)
- {
- second3=0;
- errorflag=0;
- rightflag=0;
- alarmflag=0;
- bb=0;
- aa=0;
- }
- }
- else if((errorflag==0) && (rightflag==1))
- {
- P1_0=0;
- cc++;
- if(cc<1000)
- {
- okflag=1;
- }
- else if(cc<2000)
- {
- okflag=0;
- }
- else
- {
- errorflag=0;
- rightflag=0;
- P1_7=1;
- cc=0;
- oka=0;
- okb=0;
- okflag=0;
- P1_0=1;
- }
- if(okflag==1)
- {
- oka++;
- if(oka==2)
- {
- oka=0;
- P1_7=~P1_7;
- }
- }
- else
- {
- okb++;
- if(okb==3)
- {
- okb=0;
- P1_7=~P1_7;
- }
- }
- }
-
- if(keyoverflag==1)
- {
- P1_7=~P1_7;
- }
- }
复制代码 |