矩阵键盘模拟密码锁

2020-01-30 14:12发布

  1. /*********************************************************************
  2. 文件名:矩阵键盘密码锁.c
  3. 晶振频率:12MHz
  4. 内容:模拟密码锁,密码固化到ROM 不能通过按键输入更改
  5. 键值分布图:
  6. 0        4        8        12
  7. 1        5        9        13
  8. 2        6        10        14
  9. 3        7        11        15
  10. **********************************************************************/
  11. #include<reg52.h>
  12. #define uchar unsigned char
  13. #define uint unsigned int
  14. #define dataPort P0
  15. #define keyPort P1

  16. uchar tempdata[8];
  17. uchar code weima[]={
  18. 0xfe,0xfd,0xfb,0xf7,
  19. 0xef,0xdf,0xbf,0x7f};
  20. uchar code duanma[]={
  21. 0x3f,0x06,0x5b,0x4f,
  22. 0x66,0x6d,0x7d,0x07,
  23. 0x7f,0x6f,0x77,0x7c,
  24. 0x39,0x5e,0x79,0x71};
  25. uchar code password[8]={
  26. 1,2,3,4,5,6,7,8};

  27. sbit dula=P2^2;
  28. sbit wela=P2^3;

  29. uchar keyScan(void);
  30. uchar keyPro(void);
  31. void delayUs2x(uchar);
  32. void delayMs(uchar);
  33. void Init_T0(void);
  34. void display(uchar,uchar);

  35. void main(void)
  36. {
  37.         uchar num,i,j;
  38.         uchar temp[8];
  39.         bit flag;
  40.         Init_T0();
  41.         while(1)
  42.         {
  43.                 num=keyPro();
  44.                 if(num!=0xff)
  45.                 {
  46.                         if(i==0)
  47.                                 for(j=0;j<8;j++)        //清屏
  48.                                         tempdata[j]=0;
  49.                         if(i<8)
  50.                         {
  51.                                 temp[i]=duanma[num];
  52.                                 for(j=0;j<=i;j++)
  53.                                         tempdata[7-i+j]=temp[j];
  54.                         }
  55.                         i++;
  56.                         if(i==9)
  57.                         {
  58.                                 i=0;
  59.                                 flag=1;
  60.                                 for(j=0;j<8;j++)
  61.                                         flag=flag&&(temp[j]==duanma[password[j]]);
  62.                                 for(j=0;j<8;j++)        //清屏
  63.                                         tempdata[j]=0;
  64.                                 if(flag)
  65.                                 {
  66.                                         tempdata[0]=0x3f;//0
  67.                                         tempdata[1]=0x73;//P
  68.                                         tempdata[2]=0x79;//E
  69.                                         tempdata[3]=0x54;//n
  70.                                 }
  71.                                 else
  72.                                 {
  73.                                         tempdata[0]=0x79;//E
  74.                                         tempdata[1]=0x50;//r
  75.                                         tempdata[2]=0x50;//r
  76.                                 }
  77.                         }
  78.                 }
  79.         }
  80. }

  81. uchar keyScan(void)
  82. {
  83.         uchar cord_h,cord_l;
  84.         keyPort=0x0f;        //行作为输入线,列作为输出线
  85.         cord_l=keyPort&0x0f;
  86.         if(cord_l!=0x0f)
  87.         {
  88.                 delayMs(10);
  89.                 if(cord_l!=0x0f)
  90.                         cord_l=keyPort&0x0f;
  91.                 keyPort=cord_l|0xf0;
  92.                 cord_h=keyPort&0xf0;
  93.                 while(cord_h!=0xf0);
  94.                 return (cord_l+cord_h);
  95.         }
  96.         return 0xff;
  97. }

  98. uchar keyPro(void)
  99. {
  100.         switch(keyScan())
  101.         {
  102.                 case 0x7e:return 0;break;
  103.                 case 0x7d:return 1;break;
  104.                 case 0x7b:return 2;break;
  105.                 case 0x77:return 3;break;
  106.                 case 0xbe:return 4;break;
  107.                 case 0xbd:return 5;break;
  108.                 case 0xbb:return 6;break;
  109.                 case 0xb7:return 7;break;
  110.                 case 0xde:return 8;break;
  111.                 case 0xdd:return 9;break;
  112.                 case 0xdb:return 10;break;
  113.                 case 0xd7:return 11;break;
  114.                 case 0xee:return 12;break;
  115.                 case 0xed:return 13;break;
  116.                 case 0xeb:return 14;break;
  117.                 case 0xe7:return 15;break;
  118.                 default :return 0xff;break;
  119.         }
  120. }

  121. void Init_T0(void)
  122. {
  123.         TMOD|=0x01;
  124.         TH0=(65536-2000)/256;
  125.         TL0=(65536-2000)%256;

  126.         EA=1;
  127.         ET0=1;
  128.         TR0=1;
  129. }

  130. void T0_isr(void)interrupt 1
  131. {
  132.         TH0=(65536-2000)/256;
  133.         TL0=(65536-2000)%256;

  134.         display(0,8);
  135. }

  136. void delayUs2x(uchar Us)
  137. {
  138.         while(Us--);
  139. }

  140. void delayMs(uchar Ms)
  141. {
  142.         while(Ms--)
  143.         {
  144.                 delayUs2x(245);
  145.                 delayUs2x(245);
  146.         }
  147. }

  148. void display(uchar firstBit,uchar num)
  149. {
  150.         uchar i;
  151.        
  152.         dataPort=0;
  153.         dula=1;
  154.         dula=0;

  155.         dataPort=weima[i+firstBit];
  156.         wela=1;
  157.         wela=0;

  158.         dataPort=tempdata[i];
  159.         dula=1;
  160.         dula=0;

  161.         i++;
  162.         if(i==num)
  163.                 i=0;
  164. }
复制代码
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
5条回答
一匹狼
1楼-- · 2020-01-30 18:58
 精彩回答 2  元偷偷看……
一匹狼
2楼-- · 2020-01-30 23:10
错误发生在第98行
改成
  1. if((keyPort&0xf0)!=0xf0)
复制代码
  1. uchar keyScan(void)
  2. {
  3.         uchar cord_h,cord_l;
  4.         keyPort=0x0f;        //行作为输入线,列作为输出线
  5.         cord_l=keyPort&0x0f;
  6.         if(cord_l!=0x0f)
  7.         {
  8.                 delayMs(10);
  9.                 if(cord_l!=0x0f)
  10.                         cord_l=keyPort&0x0f;
  11.                 keyPort=cord_l|0xf0;
  12.                 cord_h=keyPort&0xf0;
  13.                 while((keyPort&0xf0)!=0xf0);
  14.                 return (cord_l+cord_h);
  15.         }
  16.         return 0xff;
  17. }
复制代码
一匹狼
3楼-- · 2020-01-30 23:58
矩阵键盘密码锁
一匹狼
4楼-- · 2020-01-31 03:20
矩阵键盘密码锁(方法二)
hbmyhuwei
5楼-- · 2020-01-31 05:42
好东东,谢谢分享!

一周热门 更多>