找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2412|回复: 0
收起左侧

单片机设计键盘密码锁源程序

[复制链接]
ID:220345 发表于 2017-7-20 20:10 | 显示全部楼层 |阅读模式
利用矩阵键盘设计密码锁
单片机源程序如下:
  1. /*----------------------------------
  2.   名称:矩阵键盘模拟密码锁
  3.   编写:szjcdz
  4.   内容:模拟密码锁,密码固化到ROM 不能通过按键输入更改
  5. ------------------------------------------------*/
  6. #include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义


  7. #define DataPort P0 //定义数据端口 程序中遇到DataPort 则用P0 替换
  8. #define KeyPort P3
  9. sbit LATCH1=P2^6;//定义锁存使能端口 段锁存
  10. sbit LATCH2=P2^7;//                 位锁存

  11. unsigned char code DuanMa[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
  12.                                                    0x77,0x7c,0x39,0x5e,0x79,0x71};// 显示段码值0~F
  13. unsigned char code WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位码
  14. unsigned char TempData[8]; //存储显示值的全局变量
  15. unsigned char code password[8]={1,2,3,4,5,6,7,8};
  16. //可以更改此密码做多组测试

  17. void DelayUs2x(unsigned char t);//us级延时函数声明
  18. void DelayMs(unsigned char t); //ms级延时
  19. void Display(unsigned char FirstBit,unsigned char Num);//数码管显示函数
  20. unsigned char KeyScan(void);//键盘扫描
  21. unsigned char KeyPro(void);
  22. void Init_Timer0(void);//定时器初始化
  23. /*------------------------------------------------
  24.                     主函数
  25. ------------------------------------------------*/
  26. void main (void)
  27. {
  28. unsigned char num,i,j;                  
  29. unsigned char temp[8];
  30. bit Flag;
  31. Init_Timer0();

  32. while (1)         //主循环
  33.   {


  34. num=KeyPro();
  35. if(num!=0xff)
  36.    {
  37.    if(i==0)
  38.     {
  39.          for(j=0;j<8;j++)//清屏
  40.          TempData[j]=0x00;
  41.         }
  42.    if(i<8)
  43.      {
  44.       temp[i]=DuanMa[num];//把按键值输入到临时数组中
  45.           for(j=0;j<=i;j++)         //通过一定顺序把临时数组中
  46.                           //的值赋值到显示缓冲区,从右往左输入
  47.          TempData[7-i+j]=temp[j];
  48.       }
  49.         i++;   //输入数值累加
  50.         if(i==9)//正常等于8即可,由于我们需要空一个用于清屏,
  51.                         //清屏时的按键不做输入值
  52.           {
  53.           i=0;
  54.           Flag=1;//先把比较位置1
  55.           for(j=0;j<8;j++)//循环比较8个数值,
  56.                                       //如果有一个不等 则最终Flag值为0
  57.              Flag=Flag&&(temp[j]==DuanMa[password[j]]);
  58.                  //比较输入值和已有密码
  59.           for(j=0;j<8;j++)//清屏
  60.          TempData[j]=0x00;
  61.       if(Flag)//如果比较全部相同,标志位置1
  62.            {
  63.              TempData[0]=0x3f; // "o"
  64.          TempData[1]=0x73; // "p"
  65.                  TempData[2]=0x79; // "E"
  66.                  TempData[3]=0x54; // "n"
  67.                  //说明密码正确,输入对应操作 显示"open"
  68.                 }
  69.           else
  70.             {
  71.                  TempData[0]=0x79; // "E"
  72.          TempData[1]=0x50; // "r"
  73.                  TempData[2]=0x50; // "r"
  74.                  //否则显示"Err"
  75.                 }

  76.           }
  77.     }       
  78.   }
  79. }
  80. /*------------------------------------------------
  81. uS延时函数,含有输入参数 unsigned char t,无返回值
  82. unsigned char 是定义无符号字符变量,其值的范围是
  83. 0~255 这里使用晶振12M,精确延时请使用汇编,大致延时
  84. 长度如下 T=tx2+5 uS
  85. ------------------------------------------------*/
  86. void DelayUs2x(unsigned char t)
  87. {   
  88. while(--t);
  89. }
  90. /*------------------------------------------------
  91. mS延时函数,含有输入参数 unsigned char t,无返回值
  92. unsigned char 是定义无符号字符变量,其值的范围是
  93. 0~255 这里使用晶振12M,精确延时请使用汇编
  94. ------------------------------------------------*/
  95. void DelayMs(unsigned char t)
  96. {
  97.      
  98. while(t--)
  99. {
  100.      //大致延时1mS
  101.      DelayUs2x(245);
  102.          DelayUs2x(245);
  103. }
  104. }
  105. /*------------------------------------------------
  106. 显示函数,用于动态扫描数码管
  107. 输入参数 FirstBit 表示需要显示的第一位,如赋值2表示从第三个数码管开始显示
  108. 如输入0表示从第一个显示。
  109. Num表示需要显示的位数,如需要显示99两位数值则该值输入2
  110. ------------------------------------------------*/
  111. void Display(unsigned char FirstBit,unsigned char Num)
  112. {
  113.       static unsigned char i=0;
  114.           

  115.            DataPort=0x00;   //清空数据,防止有交替重影
  116.        LATCH1=1;     //段锁存
  117.        LATCH1=0;

  118.        DataPort=WeiMa[i+FirstBit]; //取位码
  119.        LATCH2=1;     //位锁存
  120.        LATCH2=0;

  121.        DataPort=TempData[i]; //取显示数据,段码
  122.        LATCH1=1;     //段锁存
  123.        LATCH1=0;
  124.       
  125.            i++;
  126.        if(i==Num)
  127.               i=0;


  128. }
  129. /*------------------------------------------------
  130.                     定时器初始化子程序
  131. ------------------------------------------------*/
  132. void Init_Timer0(void)
  133. {
  134. TMOD |= 0x01;          //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响                     
  135. //TH0=0x00;              //给定初值
  136. //TL0=0x00;
  137. EA=1;            //总中断打开
  138. ET0=1;           //定时器中断打开
  139. TR0=1;           //定时器开关打开
  140. }
  141. /*------------------------------------------------
  142.                  定时器中断子程序
  143. ------------------------------------------------*/
  144. void Timer0_isr(void) interrupt 1
  145. {
  146. TH0=(65536-2000)/256;                  //重新赋值 2ms
  147. TL0=(65536-2000)%256;

  148. Display(0,8);       // 调用数码管扫描

  149. }

  150. /*------------------------------------------------
  151. 按键扫描函数,返回扫描键值
  152. ------------------------------------------------*/
  153. unsigned char KeyScan(void)  //键盘扫描函数,使用行列反转扫描法
  154. {
  155. unsigned char cord_h,cord_l;//行列值中间变量
  156. KeyPort=0x0f;            //行线输出全为0
  157. cord_h=KeyPort&0x0f;     //读入列线值
  158. if(cord_h!=0x0f)    //先检测有无按键按下
  159. {
  160.   DelayMs(10);        //去抖
  161.   if((KeyPort&0x0f)!=0x0f)
  162.   {
  163.     cord_h=KeyPort&0x0f;  //读入列线值
  164.     KeyPort=cord_h|0xf0;  //输出当前列线值
  165.     cord_l=KeyPort&0xf0;  //读入行线值

  166.     while((KeyPort&0xf0)!=0xf0);//等待松开并输出

  167.     return(cord_h+cord_l);//键盘最后组合码值
  168.    }
  169.   }return(0xff);     //返回该值
  170. }
  171. /*------------------------------------------------
  172. 按键值处理函数,返回扫键值
  173. ……………………

  174. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
矩阵键盘密码锁.zip (18.69 KB, 下载次数: 8)


评分

参与人数 1黑币 +5 收起 理由
qq976521265 + 5 很给力!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表