找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 506|回复: 2
收起左侧

要怎么把单片机四位数的密码锁改成七位数?附程序

[复制链接]
ID:1119231 发表于 2024-5-4 15:28 来自手机 | 显示全部楼层 |阅读模式
  1. #include <reg51.h>
  2. typedef unsigned char u8;
  3. typedef unsigned int u16;

  4. //sbit 特殊功能位声明:声明某特殊功能寄存器中的一位
  5. #define key P1 //按键io口
  6. sbit fen=P3^0; //蜂鸣器io口
  7. sbit rs=P3^1; //LCD控制口
  8. sbit rw=P3^2;
  9. sbit e=P3^3;
  10. sbit led=P3^4; //LED灯io口

  11. //bit 位变量声明:定义一个位变量的值
  12. u8 keyz=17,j=0,biao1=0,a=10,b=10,c=10,d=10;
  13. bit biao=0;
  14. u16 zh;

  15. u8 shu[]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,
  16. 0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f};
  17. u8 zi[]={"lnput password:"};
  18. u8 num[]={"0123456789ABCDEF"};


  19. void delay(u16 i){
  20. while(i--);
  21. }

  22. /*蜂鸣器*/
  23. void Fen(u8 a,b) //蜂鸣器发声函数
  24. {
  25. u8 i,j;
  26. for(i=0;i<a;i++)
  27. {
  28. for(j=0;j<100;j++)
  29. {fen=~fen;delay(b);}
  30.   }
  31. }


  32. /*LCD*/
  33. void writecom(u8 com){//LCD写指令
  34. rs=0;
  35. rw=0;
  36. e=0;
  37. P0=com;
  38. delay(5);
  39. e=1;
  40. e=0;
  41. }

  42. void writedat(u8 dat){//LCD写数据
  43. rs=1;
  44. rw=0;
  45. e=0;
  46. P0=dat;
  47. delay(5);
  48. e=1;
  49. e=0;
  50. }

  51. void initlcd(){ //LCD初始化函数
  52. writecom(0x38); //显示模式设置
  53. writecom(0x0c);
  54. writecom(0x06);

  55. }

  56. void xian(){ //LCD显示数字函数
  57. writedat(num[keyz]);
  58. if(a==10){a=keyz; } //对abcd,四位数的单独赋值
  59. else if(b==10){b=keyz;}
  60. else if(c==10){c=keyz;}
  61. else{d=keyz;}
  62. if(j!=3){j++;}biao=0;

  63. }

  64. /*键盘*/
  65. void Key(){u8 a=0; //矩形式键盘函数

  66. if(key!=0x0f){delay(1000);
  67. if(key!=0x0f){
  68. key=0x0f;
  69. switch(key){
  70. case 0x07: keyz=0;biao=1;break;
  71. case 0x0b: keyz=1;biao=1;break;
  72. case 0x0d: keyz=2;biao=1;break;
  73. case 0x0e: keyz=3;biao=1;break;
  74. }
  75. key=0xf0;
  76. switch(key){
  77. case 0x70: keyz=keyz;biao=1;break;
  78. case 0xb0: keyz=keyz+4;biao=1;break;
  79. case 0xd0: keyz=keyz+8;biao=1;break;
  80. case 0xe0: keyz=keyz+12;biao=1;break;
  81. }

  82. }
  83. while((a<50)&&(key!=0xf0)){a++;delay(10000);}
  84. }
  85. }

  86. void shi(){u8 i; // 按键值判断函数
  87. if(biao&&keyz!=15){ //判断标志位biao是否为1,为1则有按键操作并且按键的值不等于15

  88. writecom(0x80+0x40+j); //数字显示位置进行累加操作
  89. if(j<0){j=0;} //数字显示位置边界
  90. switch(keyz){ //switch判断按键并执行对应操作
  91. case 0:xian(); break;
  92. case 1:xian(); break;
  93. case 2:xian(); break;
  94. case 3:xian(); break;
  95. case 4:xian(); break;
  96. case 5:xian(); break;
  97. case 6:xian(); break;
  98. case 7:xian(); break;
  99. case 8:xian(); break;
  100. case 9:xian(); break;
  101. case 10:writedat(num[keyz]);

  102. j++;biao=0;break;
  103. case 11:writedat(num[keyz]);

  104. j++;biao=0;break;
  105. case 12:
  106. biao1=0; //重置标志位biao1,上锁
  107. biao=0;break;
  108. case 13:writecom(0x01);delay(1000); //全屏清除
  109. for(i=0;i<sizeof(zi);i++){
  110. writecom(0x80+i);
  111. writedat(zi[i]);}
  112. j=0;biao=0;break;
  113. case 14:  //对当前数字位删除的操作
  114. writedat(' ');
  115. j--;
  116. writecom(0x80+0x40+j);writedat(' ');
  117. biao=0;break;
  118. case 15: //确定按键
  119. j++;biao=0;break;
  120.   }
  121. }
  122. if(keyz==15){  //判断按键值如果等于15,便视为按下确定键
  123. writecom(0x01);delay(1000);
  124. zh=a*1000+b*100+c*10+d; //将ABCD,四位数合并并进行判断是否为正确密码
  125. if(zh==1234){ //设密码为1234
  126. j=0;
  127. biao1=1; //将biao1标志位置1便为密码正确
  128. keyz=17;  //使按键值跳出最大值15便不会循坏显示
  129. }
  130. else{
  131. j=0;
  132. biao1=0; //反之密码错误
  133. keyz=17;
  134. Fen(20,200);  //蜂鸣器报警
  135. }
  136. zh=0;a=10,b=10,c=10,d=10; //重置ABCD变量
  137. for(i=0;i<sizeof(zi);i++){
  138. writecom(0x80+i);
  139. writedat(zi[i]); }
  140. }
  141. }

  142. void main(){u8 i; led=1;
  143. initlcd(); //LCD初始化函数
  144. for(i=0;i<sizeof(zi);i++){
  145. writecom(0x80+i);
  146. writedat(zi[i]); }
  147. while(1){
  148.   Key(); //定义键盘函数
  149. shi(); //按键判断函数,灯亮或报警
  150. P2=shu[keyz]; //数码管显示当前输入值
  151. if(biao1==1){ led=0;  //判断标志位biao1 为1则密码正确显示ok
  152. writecom(0x80+0x40+10);
  153. writedat('O');
  154. writecom(0x80+0x41+10);
  155. writedat('K'); }

  156. else if(biao1==0){led=1; //biao1为0则显示密码错误显示no
  157. writecom(0x80+0x40+10);
  158. writedat('N');
  159. writecom(0x80+0x41+10);
  160. writedat('O');}
  161.   }
  162. }
复制代码
回复

使用道具 举报

ID:110875 发表于 2024-5-5 12:46 | 显示全部楼层
改程序就行了
回复

使用道具 举报

ID:69038 发表于 2024-5-6 07:26 | 显示全部楼层
  1. if(key!=0x0f){
  2. key=0x0f;
  3. switch(key){
  4. case 0x07: keyz=0;biao=1;break;
  5. case 0x0b: keyz=1;biao=1;break;
  6. case 0x0d: keyz=2;biao=1;break;
  7. case 0x0e: keyz=3;biao=1;break;
  8. }
  9. key=0xf0;
  10. switch(key){
  11. case 0x70: keyz=keyz;biao=1;break;
  12. case 0xb0: keyz=keyz+4;biao=1;break;
  13. case 0xd0: keyz=keyz+8;biao=1;break;
  14. case 0xe0: keyz=keyz+12;biao=1;break;
  15. }

  16. }
复制代码

这段代码会不会是个寂?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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