找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1129|回复: 5
打印 上一主题 下一主题
收起左侧

单片机C语言程序 什么地方该用延时函数?

[复制链接]
跳转到指定楼层
楼主
ID:1080265 发表于 2023-5-30 13:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
      自己写的一个密码锁,4*4键盘,8盏灯,4位数密码,感觉大概逻辑还简单。先输入设置密码,同时对应亮起相应的灯提示有在输入,因为只有8盏灯,所以密码只能设置1~8。后输入密码进行解锁操作,此时只需4个LED灯按顺序从左到右亮起,提示输入了几位了。最后检查判断。      烧录到板子上感觉应该是执行太快了,输入了几位马上跳最后密码正确了。请问各位同志,哪些地方该调用延时函数?或者应该添加新的按键作为结束输入的功能?

单片机C语言源程序如下:
  1. #include<STC12C5A60S2.h>
  2. #include<LCD1602.h>
  3. #include<Key_scan.h>              //返回键盘值1~16
  4. #define uchar        unsigned char
  5. #define uint        unsigned int


  6. void Delay_ms(uint time)   //延时函数
  7. {
  8.         uint i,j;
  9.         for(i = 0;i < time;i ++)
  10.                 for(j = 0;j < 930;j ++);
  11. }

  12. void pass(void)                                   //通过后的跑马灯效果
  13. {
  14. void Delay_ms(uint time);
  15. int temp;
  16. temp=0xaa;
  17. while(1)
  18. {
  19.    P0=temp;     
  20.    Delay_ms(800);  
  21.    temp=_crol_(temp,1);                             
  22. }               
  23. }
  24. int current_led=0;
  25. int last_led=0;
  26. int main()
  27. {  int key,password[4]={0,0,0,0};           //键盘值;原始密码
  28.    int i=0,input[4]={0};                                //循环次数变量;输入的密码
  29.    for(i=0;i<4;i++)//输入设置密码
  30.      {
  31.          key=Key_scan();
  32.             password[i]=key;
  33.          switch(key)
  34.          {
  35.             case 1:P00=0;break;
  36.         case 2:P01=0;break;
  37.         case 3:P02=0;break;
  38.         case 4:P03=0;break;
  39.         case 5:P04=0;break;
  40.         case 6:P05=0;break;
  41.         case 7:P06=0;break;
  42.         case 8:P07=0;break;
  43.      }
  44.          Delay_ms(5000);
  45.             }  P0=1;                                                  //输入完4位数密码,灯全灭
  46.    for(i=0;i<4;i++){    //输入密码进行解锁
  47.      key=Key_scan();
  48.          if(key!=0)                                                  //键盘有输入,灯顺序亮起
  49.          {
  50.            current_led++;
  51.            switch(current_led)
  52.            {
  53.             case 1:P00=0;break;
  54.         case 2:P01=0;break;
  55.         case 3:P02=0;break;
  56.         case 4:P03=0;break;
  57.         case 5:P04=0;break;
  58.         case 6:P05=0;break;
  59.         case 7:P06=0;break;
  60.         case 8:P07=0;break;
  61.            }
  62.           }
  63.          input[i]=key;                                           //将键盘值输入
  64.          }
  65.         
  66.         for(i=0;i<4;i++){                                                                        //最后检查密码是否正确
  67.           if(input[i]==password[i])
  68.              pass();
  69.           else
  70.              P0=0;Delay_ms(500);
  71.                  P0=1;Delay_ms(500);
  72.                 }
  73. return 0;         
  74. }
复制代码



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:883242 发表于 2023-5-30 16:05 | 只看该作者
在Key_scan()里面加延迟。
回复

使用道具 举报

板凳
ID:1080265 发表于 2023-5-30 16:15 | 只看该作者
Hephaestus 发表于 2023-5-30 16:05
在Key_scan()里面加延迟。

我的意思是主函数里哪里该调用延迟函数使得全过程流畅可分辨。
回复

使用道具 举报

地板
ID:161164 发表于 2023-5-30 18:18 | 只看该作者
violet233 发表于 2023-5-30 16:15
我的意思是主函数里哪里该调用延迟函数使得全过程流畅可分辨。

由于你的代码逻辑混乱引致按键体验不好
解决方法
1. 慢方法,理顺逻辑,全写代码
2. 快方法,僭建代码,在Bug上运行
以下是方法2的改正代码
  1. #include<STC12C5A60S2.h>
  2. #include<LCD1602.h>
  3. #include<Key_scan.h>              //返回键盘值1~16
  4. #define uchar        unsigned char
  5. #define uint        unsigned int

  6. void Delay_ms(uint time)   //延时函数
  7. {
  8.         uint i,j;
  9.         for(i = 0; i < time; i ++)
  10.                 for(j = 0; j < 930; j ++);
  11. }

  12. void pass(void)                                   //通过后的跑马灯效果
  13. {
  14.         void Delay_ms(uint time);
  15.         int temp;
  16.         temp=0xaa;
  17.         while(1)
  18.         {
  19.                 P0=temp;
  20.                 Delay_ms(800);
  21.                 temp=_crol_(temp,1);
  22.         }
  23. }
  24. int current_led=0;
  25. int last_led=0;
  26. int main()
  27. {
  28.         int key,password[4]= {0,0,0,0};          //键盘值;原始密码
  29.         int i=0,input[4]= {0};                               //循环次数变量;输入的密码
  30.         while(1)
  31.         {
  32.                 for(i=0; i<4;) //输入设置密码
  33.                 {
  34.                         key=Key_scan();
  35.                         password[i]=key;
  36.                         switch(key)
  37.                         {
  38.                                 case 1:P00=0;i++;break;
  39.                                 case 2:P01=0;i++;break;
  40.                                 case 3:P02=0;i++;break;
  41.                                 case 4:P03=0;i++;break;
  42.                                 case 5:P04=0;i++;break;
  43.                                 case 6:P05=0;i++;break;
  44.                                 case 7:P06=0;i++;break;
  45.                                 case 8:P07=0;i++;break;
  46.                         }
  47.                 }
  48.                 P0=1;                                                  //输入完4位数密码,灯全灭
  49.                 for(i=0; i<4;)   //输入密码进行解锁
  50.                 {
  51.                         key=Key_scan();
  52.                         if(key!=0)                                                  //键盘有输入,灯顺序亮起
  53.                         {
  54.                                 current_led++;
  55.                                 switch(current_led)
  56.                                 {
  57.                                         case 1:P00=0;break;
  58.                                         case 2:P01=0;break;
  59.                                         case 3:P02=0;break;
  60.                                         case 4:P03=0;break;
  61.                                         case 5:P04=0;break;
  62.                                         case 6:P05=0;break;
  63.                                         case 7:P06=0;break;
  64.                                         case 8:P07=0;break;
  65.                                 }
  66.                                 input[i]=key;                                           //将键盘值输入
  67.                                 i++;
  68.                         }
  69.                 }

  70.                 for(i=0; i<4; i++)                                                                       //最后检查密码是否正确
  71.                 {
  72.                         if(input[i]==password[i])
  73.                                 pass();
  74.                         else
  75.                                 P0=0;
  76.                         Delay_ms(500);
  77.                         P0=1;
  78.                         Delay_ms(500);
  79.                 }               
  80.         }
  81.         return 0;
  82. }
复制代码



回复

使用道具 举报

5#
ID:123289 发表于 2023-5-31 10:41 | 只看该作者
【什么地方该用延时函数】与【C语言】无关!
与设计者为了达成目的,对时序的理解有关。
大多情况下,是为了适应硬件的需求。
例如:按键会有弹动,AD采样需要时间,显示需要以秒为单位……。
回复

使用道具 举报

6#
ID:1080265 发表于 2023-6-1 18:11 | 只看该作者
lkc8210 发表于 2023-5-30 18:18
由于你的代码逻辑混乱引致按键体验不好
解决方法
1. 慢方法,理顺逻辑,全写代码

真心感谢,对萌新来说能成功实现效果真的是很振奋人心!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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