找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1337|回复: 7
收起左侧

为什么这个51单片机密码锁代码放到我的板子上出来的结果不对呢?

[复制链接]
ID:435271 发表于 2018-11-28 20:49 | 显示全部楼层 |阅读模式
为什么这个代码放到我的板子上出来的结果不对呢??
  1. #include <reg52.h>
  2. #include <intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. #define w 6
  6. sbit LCD1602_E=P2^7;
  7. sbit LCD1602_RW=P2^5;
  8. sbit LCD1602_RS=P2^6;
  9. sbit Scl=P3^4;
  10. sbit Sda=P3^5;
  11. sbit Key=P3^6;
  12. sbit ALAM=P2^1;
  13. sbit YY=P2^4;
  14. sbit open_led=P2^2;
  15. bit operation=0;
  16. bit pass=0;
  17. bit ReInputEn=0;
  18. bit s3_keydown=0;
  19. bit key_disable=0;
  20. uchar countt0,second;
  21. void delay(uint x);
  22. uchar code a[]={0xfe,0xfd,0xfb,0xf7}; //???????????
  23. uchar code start_line[]="password:      ";
  24. uchar code name[]="Coded Management";
  25. uchar code Correct[] ="   correct   ";
  26. uchar code Error[]   ="    error    ";
  27. uchar code codepass[]="    pass     ";
  28. uchar code LockOpen[]="    true     ";
  29. uchar code SetNew[]="SetNewWordEnable";
  30. uchar code input[]="input:      ";
  31. uchar code ResetOK[]="ResetPassWordOK";
  32. uchar code initword[]="Init PassWord...";
  33. uchar code Er_try[]="error,try again!";
  34. uchar code again[]="input again:   ";
  35. uchar InputData[6]; //?????????????
  36. uchar CurrentPassWord[]={1,3,1,4,2,0};
  37. uchar TempPassWord[6];
  38. uchar N=0;
  39. uchar ErrorCont;
  40. uchar CorrectCont;
  41. uchar ReInputCont;
  42. uchar num,flag=0;
  43. uchar code initpassword[6]={1,2,3,4,5,6};
  44. void Delay5Ms()
  45. {
  46. unsigned int TempCyc=5552;
  47. while(TempCyc--);
  48. }
  49. void Delay400Ms()
  50. {
  51. unsigned char TempCycA=5;
  52. unsigned char TempCycB;
  53. while(TempCycA--)
  54. {
  55.   TempCycB=7269;
  56.   while(TempCycB--);
  57. }
  58. }
  59. void mDelay(uint t)
  60. {
  61. uchar i;
  62. while(t--)
  63. {
  64.   for(i=0;i<125;i++)
  65.    {;}
  66. }
  67. }
  68. void delay(uint x)
  69. {
  70. uint i,j;
  71. for(i=x;i>0;i--)
  72.   for(j=110;j>0;j--);
  73. }
  74. void Nop()
  75. {
  76.    _nop_();
  77.    _nop_();
  78.    _nop_();
  79.    _nop_();
  80. }
  81. void Start()
  82. {
  83. Sda=1;
  84. Scl=1;
  85. Nop();
  86. Sda=0;
  87. Nop();
  88. }
  89. void Stop()
  90. {
  91. Sda=0;
  92. Scl=1;
  93. Nop();
  94. Sda=1;
  95. Nop();
  96. }
  97. void Ack()
  98. {
  99. Sda=0;
  100. Nop();
  101. Scl=1;
  102. Nop();
  103. Scl=0;
  104. }
  105. void NoAck()
  106. {
  107. Sda=1;
  108. Nop();
  109. Scl=1;
  110. Nop();
  111. Scl=0;
  112. }
  113. void Send(uchar Data)
  114. {
  115. uchar Bitcounter=8;
  116. uchar temp;
  117. do
  118. {
  119.   temp=Data;
  120.   Scl=0;
  121.   Nop();
  122.   if((temp&0x80)==0x80)
  123.   {
  124.    Sda=1;
  125.   }
  126.   else Sda=0;
  127.   Scl=1;
  128.   temp=Data<<1;
  129.   Data=temp;
  130.   Bitcounter--;
  131. }while(Bitcounter);
  132. Scl=0;
  133. }
  134. uchar Read(void)
  135. {
  136. uchar temp=0;
  137. uchar temp1=0;
  138. uchar Bitcounter=8;
  139. Sda=1;
  140. do
  141. {
  142.   Scl=0;
  143.   Nop();
  144.   Scl=1;
  145.   Nop();
  146.   if(Sda)
  147.   temp=temp|0x01;
  148.   else
  149.   temp=temp&0xfe;
  150.   if(Bitcounter-1)
  151.   {
  152.    temp1=temp<<1;
  153.    temp=temp1;
  154.   }
  155.   Bitcounter--;
  156. }while(Bitcounter);
  157.    return (temp);
  158. }
  159. void WrToROM(uchar Data[],uchar Address,uchar Num)
  160. {
  161. uchar i;
  162. uchar *PData;
  163. PData=Data;
  164. for(i=0;i<Num;i++)
  165. {
  166.   Start();
  167.   Send(0xa0);
  168.   Ack();
  169.   Send(Address+i);
  170.   Ack();
  171.   Send(*(PData+i));
  172.   Ack();
  173.   Stop();
  174.   mDelay(20);
  175. }
  176. }
  177. void RdFromROM(uchar Data[],uchar Address,uchar Num)
  178. {
  179. uchar i;
  180. uchar *PData;
  181. PData=Data;
  182. for(i=0;i<Num;i++)
  183. {
  184.   Start();
  185.   Send(0xa0);
  186.   Ack();
  187.   Send(Address+i);
  188.   Ack();
  189.   Start();
  190.   Send(0xa1);
  191.   Ack();
  192.   *(PData+i)=Read();
  193.   Scl=0;
  194.   NoAck();
  195.   Stop();
  196. }
  197. }
  198. #define yi 0x80
  199. #define er 0x80+0x40
  200. void write_1602com(uchar com)
  201. {
  202. LCD1602_E = 0;     
  203. LCD1602_RS = 0;
  204. LCD1602_RW = 0;

  205. P0= com;   
  206. delay(1);
  207. LCD1602_E = 1;         
  208. delay(5);   
  209. LCD1602_E = 0;;
  210. }
  211. void write_1602data(uchar dat)
  212. {
  213. LCD1602_E = 0;
  214. LCD1602_RS = 1;
  215. LCD1602_RW = 0;
  216. P0= dat;
  217. delay(1);
  218. LCD1602_E = 1;  
  219. delay(5);
  220. LCD1602_E = 0;
  221. }
  222. void lcd_init()
  223. {
  224. write_1602com(0x38);
  225. write_1602com(0x0c);
  226. write_1602com(0x06);
  227. write_1602com(0x01);
  228. }
  229. unsigned char coding (unsigned char m)
  230. {
  231. unsigned char k;
  232. switch(m)
  233. {
  234.    case(0x18):k=1;break;
  235.    case(0x28):k=2;break;
  236.    case(0x48):k=3;break;
  237.    case(0x88):k='A';break;
  238.    case(0X14):k=4;break;
  239.    case(0X24):k=5;break;
  240.    case(0X44):k=6;break;
  241.    case(0X84):k='B';break;
  242.    case(0X12):k=7;break;
  243.    case(0X22):k=8;break;
  244.    case(0X42):k=9;break;
  245.    case(0X82):k='C';break;
  246.    case(0X11):k='*';break;
  247.    case(0X21):k=0;break;
  248.    case(0x41):k='#';break;
  249.    case(0x81):k='D';break;
  250. }
  251. return k;
  252. }
  253. unsigned char keynum()
  254. {
  255. unsigned char row,col,i;
  256. P1=0xf0;
  257. if((P1&0xf0)!=0xf0)
  258. {
  259.   Delay5Ms();
  260.   Delay5Ms();
  261.   if((P1&0xf0)!=0xf0)
  262.   {
  263.    row=P1^0xf0;
  264.    i=0;
  265.    P1=a[i];
  266.    while(i<4)
  267.    {
  268.     if((P1&0xf0)!=0xf0)
  269.     {
  270.      col=~(P1&0xf0);
  271.      break;
  272.     }
  273.     else
  274.     {
  275.      i++;
  276.      P1=a[i];
  277.     }
  278.    }
  279.   }
  280.   else
  281.   {
  282.    return 0;
  283.   }
  284.   while((P1&0xf0)!=0xf0)
  285.   return (row|col);
  286. }
  287. else return 0;
  288. }
  289. void OneAlam()
  290. {
  291.   ALAM=0;
  292.   Delay5Ms();
  293.   ALAM=1;
  294. }
  295. void TwoAlam()
  296. {      
  297. ALAM=0;
  298. Delay5MS();
  299. ALAM=1;
  300. Delay5Ms();
  301. ALAM=0;
  302. Delay5Ms();
  303. ALAM=1;
  304. }
  305. void ThreeAlam()
  306. {
  307. ALAM=0;
  308. Delay5MS();
  309. ALAM=1;
  310. Delay5Ms();
  311. ALAM=0;
  312. Delay5Ms();
  313. ALAM=1;
  314. Delay5Ms();
  315. ALAM=0;
  316. Delay5Ms();
  317. ALAM=1;
  318. }
  319. void DisplayOne()
  320. {
  321. write_1602com(yi+5+N);
  322. write_1602data('*');
  323. }
  324. void DisplayOne()
  325. {
  326. write_1602com(yi+5+N);
  327. write_1602data('*');
  328. }
  329. void DisplayChar()
  330. {
  331. uchar i;
  332. if(pass==1)
  333. {
  334.   write_1602com(er);
  335.   for(i=0;i<16;i++)
  336.   {
  337.    write_1602data(LockOpen[i]);
  338.   }
  339. }
  340.   else
  341.   {
  342.    if(N==0)
  343.    {
  344.     write_1602com(er);
  345.     for(i=0;i<16;i++)
  346.     {
  347.      write_1602data(Error[i]);
  348.     }
  349.    }
  350.    else
  351.    {
  352.     write_1602com(er);
  353.     for(i=0;i<16;i++)
  354.     {
  355.      write_1602data(start_line[i]);
  356.     }
  357.    }
  358.   }
  359. }
  360. void DisplayInput()
  361. {
  362. unsigned char i;
  363. if(CorrectCont==1)
  364. {
  365.   write_1602com(er);
  366.   for(i=0;i<16;i++)
  367.   {
  368.    write_1602data(input[i]);
  369.   }
  370. }
  371. }
  372. void ResetPassWord()
  373. {
  374. uchar i,j;
  375. if(pass==0)
  376. {
  377.   pass=0;
  378.   DisplayChar();
  379.   ThreeAlam();
  380. }
  381. else
  382. {
  383.   if(ReInputEn==1)
  384.   {
  385.    if(N==6)
  386.    {
  387.     ReInputCont++;
  388.     if(ReInputCont==2)
  389.     {
  390.      for(i=0;i<6;)
  391.      {
  392.       if(TempPassWord[i]==InputData[i])
  393.        i++;
  394.       else
  395.       {
  396.        write_1602com(er);
  397.        for(j=0;j<16;j++)
  398.        {
  399.         write_1602data(Error[j]);
  400.        }
  401.        ThreeAlam();
  402.        pass=0;
  403.        ReInputEn=0;
  404.        ReInputCont=0;
  405.        DisplayChar();
  406.        break;
  407.       }
  408.      }
  409.      if(i==6)
  410.      {
  411.       write_1602com(er);
  412.       for(j=0;j<16;j++)
  413.       {
  414.        write_1602data(ResetOK[j]);
  415.       }
  416.       TwoAlam();
  417.       WrToROM(TempPassWord,0,6);
  418.       ReInputEn=0;
  419.      }
  420.      ReInputCont=0;
  421.      CorrectCont=0;
  422.     }
  423.     else
  424.     {
  425.      OneAlam();
  426.      write_1602com(er);
  427.      for(j=0;j<16;j++)
  428.      {
  429.       write_1602data(again[j]);
  430.      }
  431.      for(i=0;i<6;i++)
  432.      {
  433.       TempPassWord[i]=InputData[i];
  434.      }
  435.     }
  436.     N=0;
  437.    }
  438.   }
  439. }
  440. }
  441. void Alam_KeyUnable()
  442. {
  443. P1=0X00;
  444. {
  445.   ALAM=~ALAM;
  446.   Delay5Ms();
  447. }
  448. }
  449. void Cancel()
  450. {
  451. uchar i,j;
  452. write_1602com(er);
  453. for(j=0;j<16;j++)
  454. {
  455.   write_1602data(start_line[j]);
  456. }
  457. TwoAlam();
  458. for(i=0;i<6;i++)
  459. {
  460.   InputData[i]=0;
  461. }
  462. Key=1;
  463. ALAM=1;
  464. flag=0;
  465. operation=0;
  466. pass=0;
  467. ReInputEn=0;
  468. ErrorCont=0;
  469. CorrectCont=0;
  470. ReInputCont=0;
  471. open_led=1;
  472. s3_keydown=0;
  473. key_disable=0;
  474. N=0;
  475. }
  476. void Ensure()
  477. {
  478. uchar i,j;
  479. RdFromROM(CurrentPassWord,0,6);
  480. if(N==6)
  481. {
  482.   if(ReInputEn==0)
  483.   {
  484.    for(i=0;i<6;)
  485.    {
  486.     if(CurrentPassWord[i]==InputData[i])
  487.     {
  488.      i++;
  489.     }
  490.     else
  491.     {
  492.      ErrorCont++;
  493.      if(ErrorCont==3)
  494.      {
  495.       write_1602com(er);
  496.       for(i=0;i<16;i++)
  497.       {
  498.        write_1602data(Error[i]);
  499.       }
  500.       do
  501.       Alam_KeyUnable();
  502.       while(1);
  503.      }
  504.      else
  505.      {
  506.       TR0=1;
  507.       key_disable=1;
  508.       pass=0;
  509.       break;
  510.      }
  511.     }
  512.    }
  513.    if(i==6)
  514.    {
  515.     CorrectCont++;
  516.     if(CorrectCont==1)
  517.     {
  518.      write_1602com(er);
  519.      for(j=0;j<16;j++)
  520.      {
  521.       write_1602data(LockOpen[i]);
  522.      }
  523.      TwoAlam();
  524.      Key=0;
  525.      flag=1;
  526.      pass=1;
  527.      TR0=0;
  528.      open_led=0;
  529.      for(j=0;j<100;j++)
  530.      {
  531.       InputData[i]=0;
  532.      }
  533.     }
  534.     else
  535.     {
  536.      write_1602com(er);
  537.      for(j=0;j<16;j++)
  538.      {
  539.       write_1602data(SetNew[j]);
  540.      }
  541.      TwoAlam();
  542.      ReInputEn=1;
  543.      CorrectCont=0;
  544.     }
  545.    }
  546.    else
  547.    {
  548.     if((InputData[0]==1)&&(InputData[1]==3)&&(InputData[2]==1)&&(InputData[3]==4)&&(InputData[4]==2)&&(InputData[5]==0))
  549.     {
  550.      WrToROM(initpassword,0,6);
  551.      write_1602com(er);
  552.      for(j=0;j<16;j++)
  553.      {
  554.       write_1602data(initword[j]);
  555.      }
  556.      TwoAlam();
  557.      Delay400Ms();
  558.      TwoAlam();
  559.      N=0;
  560.     }
  561.    else
  562.    {
  563.     write_1602com(er);
  564.     for(j=0;j<16;j++)
  565.     {
  566.      write_1602data(Error[j]);
  567.     }
  568.     ThreeAlam;
  569.     pass=0;
  570.    }
  571.   }
  572. }
  573.   else
  574.     {
  575.      write_1602com(er);
  576.      for(j=0;j<16;j++)
  577.      {
  578.       write_1602data(Er_try[j]);
  579.      }
  580.      ThreeAlam;
  581.     }
  582.    }
  583.    else
  584.    {
  585.       
  586.     write_1602com(er);
  587.     for(j=0;j<16;j++)
  588.     {
  589.      write_1602data(Error[j]);
  590.     }
  591.     ThreeAlam;
  592.     pass=0;
  593.    }
  594.    N=0;
  595.    operation=1;
  596. }
  597. void main()
  598. {
  599. unsigned char KEY,NUM;
  600. unsigned char i,j;
  601. P1=0XFF;
  602. TMOD=0X11;
  603. TL0=0XB0;
  604. TH0=0X3C;
  605. EA=1;
  606. ET0=1;
  607. TR0=0;
  608. Delay400Ms();
  609. lcd_init();
  610. write_1602com(yi);
  611. for(i=0;i<16;i++)
  612. {
  613.   write_1602data(name[i]);
  614. }
  615. write_1602com(er);
  616. for(i=0;i<16;i++)
  617. {
  618.   write_1602data(start_line[i]);
  619. }
  620. write_1602com(er+9);
  621. write_1602com(0x0f);
  622. Delay5Ms();
  623. N=0;
  624. while(1)
  625. {
  626.   if(key_disable==1)
  627.    Alam_KeyUnable();
  628.   else
  629.    ALAM=1;
  630.   flag=0;
  631.   if(flag==1)
  632.   {
  633.    YY=0;
  634.    num++;
  635.    if(num>20)
  636.    {
  637.     flag=0;
  638.     num=0;
  639.    }
  640.   }
  641.   KEY=keynum();
  642.   if(KEY!=0)
  643.   {
  644.    if(key_disable==1)
  645.    {
  646.     second=0;
  647.    }
  648.    else
  649.    {
  650.     NUM=coding(KEY);
  651.     {
  652.      switch(NUM)
  653.      {
  654.       case ('A'):  ;break;
  655.       case ('B'):     ;break;
  656.       case ('C'):  ;break;
  657.       case ('D'):
  658.       ResetPassWord();break;
  659.       case ('*'):Cancel();break;
  660.       case ('#'):Ensure();break;
  661.       default:
  662.       {
  663.        write_1602com(er);
  664.        for(i=0;i<16;i++)
  665.        {
  666.         write_1602data(input[i]);
  667.        }
  668.        operation=0;
  669.        if(N<6)
  670.        {
  671.         OneAlam();
  672.         for(j=0;j<=N;j++)
  673.         {
  674.          write_1602com(er+6+j);
  675.          write_1602data('*');
  676.         }
  677.         InputData[N]=NUM;
  678.         N++;
  679.        }
  680.        else
  681.        {
  682.         N=6;
  683.         break;
  684.        }
  685.       }
  686.      }
  687.     }
  688.    }
  689.   }
  690. }
  691. }
  692. void time0_int(void) interrupt 1
  693. {
  694. TL0=0XB0;
  695. TH0=0X3C;
  696. countt0++;
  697. if(countt0==20)
  698. {
  699.   countt0=0;
  700.   second++;
  701.   if(pass==1)
  702.   {
  703.    if(second==1)
  704.    {
  705.     open_led=1;
  706.     TR0=0;
  707.     TL0=0XB0;
  708.     TH0=0X3C;
  709.     second=0;
  710.    }
  711.   }
  712.   else
  713.   {
  714.    if(second==3)
  715.    {
  716.     TR0=0;
  717.     second=0;
  718.     key_disable=0;
  719.     s3_keydown=0;
  720.     TL0=0XB0;
  721.     TH0=0X3C;
  722.    }
  723.    else
  724.     TR0=1;
  725.   }
  726. }
  727. }
复制代码



回复

使用道具 举报

ID:435271 发表于 2018-11-28 21:36 | 显示全部楼层
自己当一楼
回复

使用道具 举报

ID:164602 发表于 2018-11-29 08:12 | 显示全部楼层
你放一大段程序,谁有空看呢?
问题不明确嘛!
这个程序原来用的什么板子,电路是怎样的,你现在的板子是什么,电路是怎样的?你说的不对,是什么不对,哪里不对?
是你有问题呢,没有相关的重要信息,别人是没法帮你的。

评分

参与人数 1黑币 +30 收起 理由
yousunny + 30 赞一个!

查看全部评分

回复

使用道具 举报

ID:121900 发表于 2018-11-29 09:16 | 显示全部楼层
注意你的实际电路是否有问题
回复

使用道具 举报

ID:435621 发表于 2018-11-29 12:34 | 显示全部楼层
太长的代码了,还没有注释,你的书写习惯要改,这种东西除了你自己,其他人看着太吃力了
回复

使用道具 举报

ID:435271 发表于 2018-12-3 21:01 | 显示全部楼层
杨卫国 发表于 2018-11-29 12:34
太长的代码了,还没有注释,你的书写习惯要改,这种东西除了你自己,其他人看着太吃力了

好嘞问题我已经解决了谢谢你
回复

使用道具 举报

ID:435271 发表于 2018-12-3 21:01 | 显示全部楼层
HC6800-ES-V2.0 发表于 2018-11-29 08:12
你放一大段程序,谁有空看呢?
问题不明确嘛!
这个程序原来用的什么板子,电路是怎样的,你现在的板子是 ...

好嘞 谢谢你
回复

使用道具 举报

ID:435271 发表于 2018-12-3 21:02 | 显示全部楼层
wy5879368 发表于 2018-11-29 09:16
注意你的实际电路是否有问题

好的 感谢
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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