找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3088|回复: 1
收起左侧

单片机按键密码锁源代码

[复制链接]
ID:85764 发表于 2015-7-15 23:08 | 显示全部楼层 |阅读模式
电路图:http://www.51hei.com/f/51hei-5.pdf


源代码:
  1. #include <reg52.h>
  2. #define uchar unsigned char
  3. #define uint  unsigned int

  4. #define KeyPort P1

  5. sbit Dula=P2^2;   //段选
  6. sbit Wela=P2^3;   //位选
  7. sbit Led =P2^0;

  8. uchar code smg_du[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};   //段码
  9. uchar code smg_we[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};      //位码
  10. uchar password[8];
  11. uchar dis_smg[8];
  12. bit Flag=0;

  13. uchar KeyScan(void);
  14. uchar KeyPro(void);

  15. /**********************************************************************************
  16. *************************  延 时 函 数   ******************************************
  17. ***********************************************************************************/
  18. void delayus(uchar t)
  19. {
  20. while(--t);
  21. }

  22. void delayms(uchar t)
  23. {
  24. while(t--)
  25. {
  26.   delayus(245);
  27.   delayus(245);
  28. }
  29. }

  30. /**********************************************************************************
  31. *************************  显 示 函 数   ******************************************
  32. ***********************************************************************************/
  33. void Display(uchar Firstbit ,uchar Num)
  34. {
  35. static uchar i;

  36. P0=0x00;
  37. Dula=1;Dula=0;

  38. P0=smg_we[i+Firstbit];
  39. Wela=1;Wela=0;

  40. P0=dis_smg[i];
  41. Dula=1;Dula=0;

  42. i++;
  43. if(i==Num)
  44.   i=0;
  45. }

  46. /**********************************************************************************
  47. ***************************  定时初始化   ******************************************
  48. ***********************************************************************************/
  49. void Timer0_Init(void)
  50. {
  51. TMOD|=0X01;
  52. TR0=1;
  53. ET0=1;
  54. EA=1;
  55. }

  56. /**********************************************************************************
  57. *************************  设 置 密 码   ******************************************
  58. ***********************************************************************************/
  59. void SetPassword(uchar KeyNum)
  60. {
  61. static uchar i=0;
  62. uchar j,n;
  63. uchar tempcode[8];
  64. if((KeyNum>=0)&&(KeyNum<=9))
  65. {
  66.   Led=1;
  67.   if(i==0)
  68.   {      
  69.    for(j=0;j<8;j++)
  70.    tempcode[j]=0;
  71.   }
  72.   if(i<8)
  73.   {
  74.    tempcode[i]=smg_du[KeyNum];
  75.    for(j=0;j<=i;j++)
  76.      dis_smg[7-i+j]=tempcode[j];
  77.   }
  78.   i++;
  79.   if(i==8)
  80.    i=0;
  81. }
  82. if(KeyNum==15)      //密码修改确认键
  83. {
  84.   KeyNum=0xff;
  85.   for(n=0;n<8;n++)
  86.   {
  87.     password[n]=tempcode[n];
  88.     dis_smg[n]=0;
  89.   }
  90.   dis_smg[0]=0x3f;
  91.   dis_smg[1]=0x76;
  92.   Flag=0;
  93.   i=0;      //静态变量清零,下次进入时可以从新开始
  94. }
  95. }

  96. /**********************************************************************************
  97. *************************  输 入 密 码   ******************************************
  98. ***********************************************************************************/
  99. void KeyControl(uchar Keynum)
  100. {
  101. static uchar i=0;
  102. uchar j;
  103. uchar temp[8];
  104. bit flag;
  105. if((Keynum>=0)&&(Keynum<=9))    //数字输入按键
  106. {
  107.   Led=0;
  108.   if(i==0)
  109.   {   
  110.    
  111.    for(j=0;j<8;j++)
  112.    dis_smg[j]=0;
  113.   }
  114.   if(i<8)
  115.   {
  116.    temp[i]=smg_du[Keynum];
  117.    for(j=0;j<=i;j++)
  118.     dis_smg[7-i+j]=temp[j];
  119.   }
  120.   i++;
  121.   if(i==8)
  122.    i=0;
  123. }
  124. if(Keynum==15)       //确认键
  125. {
  126.   Keynum=0xff;
  127.   flag=1;
  128.   for(j=0;j<8;j++)
  129.   {
  130.    flag=flag&&(temp[j]==password[j]);//比较八位密码数字是否全正确
  131.    dis_smg[j]=0;
  132.   }
  133.   if(flag)
  134.   {
  135.     dis_smg[0]=0x3f; // "o"
  136.           dis_smg[1]=0x73; // "p"
  137.     dis_smg[2]=0x79; // "E"
  138.     dis_smg[3]=0x37; // "n"
  139.   }
  140.   else
  141.   {
  142.     dis_smg[0]=0x79; // "E"
  143.           dis_smg[1]=0x50; // "r"
  144.     dis_smg[2]=0x50; // "r"
  145.   }
  146.   i=0;   //清零,准备下次输入密码
  147. }
  148. if(Keynum==14)        //修改密码键
  149. {
  150.   Flag=1;
  151.   for(i=0;i<8;i++)
  152.   {
  153.    dis_smg[i]=0x40;
  154.   }
  155.   i=0;      //静态变量清零,下次进入时可以从新开始
  156. }
  157. }

  158. /**********************************************************************************
  159. *************************  控 制 函 数   ******************************************
  160. ***********************************************************************************/
  161. void Dominate(void)
  162. {
  163. uchar keynum;
  164. keynum=KeyPro();
  165. if(keynum!=0xff)
  166. {
  167.   if(Flag==0)
  168.    KeyControl(keynum);
  169.   else
  170.    SetPassword(keynum);
  171. }
  172. }

  173. /**********************************************************************************
  174. *************************   main 函 数   ******************************************
  175. ***********************************************************************************/
  176. void main()
  177. {
  178. Timer0_Init();
  179. while(1)
  180. {
  181.    Dominate();
  182. }
  183. }

  184. /**********************************************************************************
  185. ************************* 中断服务函数   ******************************************
  186. ***********************************************************************************/
  187. void Timer0(void) interrupt 1
  188. {
  189. TH0=0XF8;
  190. TL0=0X30; //2ms

  191. Display(0,8);
  192. }

  193. /**********************************************************************************
  194. *************************  按 键 扫 描(反复式扫描法)   **************************
  195. ***********************************************************************************/
  196. uchar KeyScan(void)
  197. {
  198. uchar cord_h,cord_l;
  199. KeyPort=0x0f;
  200. cord_l=KeyPort&0x0f;
  201. if(cord_l!=0x0f)
  202. {
  203.   delayms(10);
  204.   if((KeyPort&0x0f)!=0x0f)
  205.   {
  206.    cord_l=KeyPort&0x0f;
  207.    KeyPort=cord_l|0xf0;
  208.    cord_h=KeyPort&0xf0;
  209.    while((KeyPort&0xf0)!=0xf0);

  210.    return (cord_h+cord_l);
  211.   }
  212. }return (0xff);
  213. }

  214. uchar KeyPro(void)
  215. {
  216.   switch(KeyScan())
  217.   {
  218.     case 0x7e:return 0;break;//0 按下相应的键显示相对应的码值
  219.     case 0x7d:return 1;break;//1
  220.     case 0x7b:return 2;break;//2
  221.     case 0x77:return 3;break;//3
  222.     case 0xbe:return 4;break;//4
  223.     case 0xbd:return 5;break;//5
  224.     case 0xbb:return 6;break;//6
  225.     case 0xb7:return 7;break;//7
  226.     case 0xde:return 8;break;//8
  227.     case 0xdd:return 9;break;//9
  228.     case 0xdb:return 10;break;//a
  229.     case 0xd7:return 11;break;//b
  230.     case 0xee:return 12;break;//c
  231.     case 0xed:return 13;break;//d
  232.     case 0xeb:return 14;break;//e
  233.     case 0xe7:return 15;break;//f
  234.     default:return 0xff;break;
  235.   }
  236. }
复制代码



回复

使用道具 举报

ID:96742 发表于 2015-11-23 08:49 | 显示全部楼层
那原始密码是多少?程序一进去的是输入密码而不是设置密码
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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