33. 4×4键盘及8位数码管显示构成的电子密码锁

发布者:fengting最新更新时间:2016-09-21 来源: eefocus关键字:4×4键盘  数码管显示  电子密码锁 手机看文章 扫描二维码
随时随地手机看文章
1.      实验任务 
用4×4组成0-9数字键及确认键。
用8位数码管组成显示电路提示信息,当输入密码时,只显示“8.”,当密码位数输入完毕按下确认键时,对输入的密码与设定的密码进行比较,若密码正确,则门开,此处用LED发光二极管亮一秒钟做为提示,同时发出“叮咚”声;若密码不正确,禁止按键输入3秒,同时发出“嘀、嘀”报警声;若在3秒之内仍有按键按下,则禁止按键输入3秒被重新禁止。
2.      电路原理图 

图4.33.1
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所示:
7

8

9


4

5

6


1

2

3

Del
0

 
 
Enter
  
  
  
  
  
  
  
  
图4.33.2
  
5.      C语言源程序 
#include  
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                               { 
                                if(getps!=ps
                                  { 
                                    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                               { 
                                if(getps!=ps
                                  { 
                                    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                               { 
                                if(getps!=ps
                                  { 
                                    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                               { 
                                if(getps!=ps
                                  { 
                                    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; 
    } 
}
关键字:4×4键盘  数码管显示  电子密码锁 引用地址:33. 4×4键盘及8位数码管显示构成的电子密码锁

上一篇:22. 电子琴
下一篇:24. 8X8 LED点阵显示技术

推荐阅读最新更新时间:2024-03-16 15:10

数码管动态显示1——7,循环右移
数码管动态显示1 7,循环右移 * 功 能:数码管动态显示1 7,循环右移 * * 芯片:Amega16L * * 时钟频率:内部4M * * 编译环境:ICC-AVR7 * #include iom16v.h #include macros.h #define uint unsigned int #define uchar unsigned char #define on_138 PORTC|=BIT(PC7) //on or off 138 #define off_138 PORTC&=~BIT(PC7) #pragma data:code uchar flash table ={0x3f,0x
[单片机]
<font color='red'>数码管</font>动态<font color='red'>显示</font>1——7,循环右移
PIC入门1,跑马灯和数码管显示实验
我使用的是爱晶3ePIC实验板,以下都是自己写的程序,只是为了纪念和学习交流使用,别无它意。在我的 相册里有板子的原理图。 跑马灯实验: 程序: //适合3epic实验板,是跑马灯程序 #include pic.h unsigned int i; //主函数 main() { TRISD=0X00; //D口为输出模式,接LED的正极 TRISE=0X00; //E口为输出输出模式,LED使能,接LED的负极 while(1) { PORTE=0X00; PORTD=0X01; //点亮第一个LED for(i=0;i 50000;i++); //延时 PORTD=0X02; //点亮第二个LED
[单片机]
STC89c52+DS1302时钟,数码管显示时间日期,可调节
最近在做数字电子时钟,也总结出来一些资料,在这分享给大家,DS1302时钟芯片。电脑仿真所需要的芯片有AT89C52,74HC138 排阻(因为C52单片机P0的IO口没有上拉电阻),74HC245 ,如果需要做实物,还得根据数码管的型号选择合适的电阻,DS1302芯片,按钮 1,工作原理 我们先了解我们所用的东西,STC89C52是8051单片机,这里就不多介绍了,然后就是DS1302时钟芯片, 这个是DS1302时钟芯片 这个是工作原理,我们经常用的DS1302与单片机的连接使用 2.实验思路 理解DS1302时钟芯片与单片机之间的数据传送,用的单总线的方式,所以会有时序图,还有读写图 表三是地址,如果读取某个分钟或
[单片机]
STC89c52+DS1302时钟,<font color='red'>数码管</font><font color='red'>显示</font>时间日期,可调节
单片机红外解码,短按开关灯,长按调光,数码管显示键值
//红外解码,实验板测试正常,8位数码管显示遥控编码(用户码,用户反码,右边3位数码管显示PWM值), //两片74hc573驱动8位共阴数码管 //CH-键短按开关灯,+键长按调光,数码管显示键值;长按调光的解码程序目前网上很难找到,我琢磨了很久才把程序调通//压缩包里有完整的程序代码,有逻辑分析仪测试的连发码的波形 单片机源程序如下: #include INCSTC89C52RC.H #include INCMY_SET.H #include INCIR_NEC.H //调用NEC解码头文件 #define DIGI_PORT P0 // 宏定义数码管端口,如果端口改变,只需修改这一句即可 #d
[单片机]
单片机红外解码,短按开关灯,长按调光,<font color='red'>数码管</font><font color='red'>显示</font>键值
51单片机数码管串行显示板制作
材料准备:共阴极SEG6个(小编做了4个)、SN74HC595N6个(小编用了4个)、插针、导线若干 SEG数码管显示 数码管串行显示原理图 74hc595管脚说明:单片机通过少量的端口串行控制多位数码管显示。 595结构图 595程序在单片机中的调用程序: /****************595时序及显示函数************************/ void display(void) //显示6位数据 { uchar i,dat; char j; //p=Date; for(j=5;j -1;j--) //6位数据依次循环 { dat=table ]; if(j==0){dat=0;} if(j
[单片机]
51单片机<font color='red'>数码管</font>串行<font color='red'>显示</font>板制作
C51---4.1 静态数码管显示
数码管引脚定义 原理图 74HC138 通过74HC138译码器的 P2_2 P2_3 P2_4 控制LED1-LED8 输出0为选中 例如 P2_2=1//低位 P2_3=0 P2_4=1//高位 101十进制为5 则第5位为有效 并且低电平有效。数码管为共阴极连接,所以LED5被选中 通过74HC138译码器选择LED 74HC245 74HC245为双向数据缓冲器 OE为低电平有效,芯片使能 A0-A7 与 B0-B7一一相连 DIR控制方向选择,高电平方向为A0- B0,低电平方向为B0- A0 代码 思路:通过74HC138选择LED1-8中的数码管,例如选择LED6 ,则控制 P
[单片机]
C51---4.1 静态<font color='red'>数码管</font><font color='red'>显示</font>
实用电子密码锁电路图
实用电子密码锁电路图 T1,T2构成定时供电开关,平时,T1的基极通过R1,S7接至电源。
[模拟电子]
实用<font color='red'>电子密码锁</font>电路图
单片机驱动数码管显示设计
数码管是非常常见的东西,他能显示数字,以及字母,应用非常的广泛,本文我来和大家谈谈如何用单片机来驱动数码管 数码管的结构 数码管由7个发光二极管组成,行成一个日字形,它门可以共阴极,也可以共阳极.通过解码电路得到的数码接通相应的发光二极而形成相应的字,这就是它的工作原理. 基本的半导体数码管是由7个条状的发光二极管(LED)按图1所示排列而成的,可实现数字"0~9"及少量字符的显示。另外为了显示小数点,增加了1个点状的发光二极管,因此数码管就由8个LED组成,我们分别把这些发光二极管命名为 "a,b,c,d,e,f,g,dp",排列顺序如下图1。 图1: 数码管引脚图及外形图 数码管的分类 数码管按各发光二极管
[单片机]
单片机驱动<font color='red'>数码管</font><font color='red'>显示</font>设计
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved