找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机计数器 写一个循环程序,求思路

[复制链接]
跳转到指定楼层
楼主
ID:932820 发表于 2021-6-16 12:04 来自手机 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
计数器模拟。

要求: (1)计数器有3个控制按钮1号、2号、3号,1个计数按钮A。

(2)按完1号按钮,再按A钮,计数暑进入加计数状态,最大计到(5+组号) 2, 时间间隔为0.5s。

按完2号按钮后,再按A按钮,计数器进入减计数状态,从(5+组号) 2开始减计数,时间、间隔为0.5s.

按完3号按钮后,再按A按钮,计数器保持显示“Pp”字样。



另外 :要求按下任意一个按钮时,都会从头计数

问一下各位大神怎么写循环程序?
  1. #include <reg51.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. sbit P10=P1^0;
  5. sbit P11=P1^1;
  6. sbit P12=P1^2;
  7. sbit P13=P1^3;
  8. uchar segcode[]={0x3F,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};   
  9. uchar bitcode[]={0x01,0x02};

  10. uchar keycode1,keycode2;
  11. unsigned char Num[2];   
  12. void delayms(uint m)      
  13. {
  14. unsigned int n;
  15.         while(m--)
  16.         {
  17.                 for(n=0;n<113;n++);
  18.         }
  19. }
  20. void numobuf(int i)
  21. {
  22.          Num[1]=i/10;
  23.          Num[0]=i%10;
  24. }
  25. void display(void)
  26. {
  27.         unsigned int i;
  28.         for(i=0;i<2;i++)
  29.                 {
  30.                         P2=bitcode[i];
  31.                         P0=segcode[Num[i]];
  32.                         delayms(1);
  33.                 }
  34.         
  35. }
  36. void display2(void)
  37. {
  38.         unsigned int i;
  39.         for(i=0;i<2;i++)
  40.                 {
  41.                         P2=bitcode[i];
  42.                         P0=0x73;
  43.                         delayms(1);
  44.                 }
  45.         
  46. }




  47. uchar keyscan1(void)
  48. {
  49.         keycode1=0;
  50.         if(P10==0)
  51.         {
  52.                 delayms(10);
  53.                 if(P10==0)
  54.                 {
  55.                         while(P10==0);
  56.                         keycode1=1;
  57.                 }
  58.         }
  59.         if(P11==0)
  60.         {
  61.                 delayms(10);
  62.                 if(P11==0)
  63.                 {
  64.                         while(P11==0);
  65.                         keycode1=2;
  66.                 }
  67.         }
  68.         if(P12==0)
  69.         {
  70.                 delayms(10);
  71.                 if(P12==0)
  72.                 {
  73.                         while(P12==0);
  74.                         keycode1=3;
  75.                 }
  76.         }
  77.         return keycode1;
  78. }
  79. uchar keyscan2(void)
  80. {
  81.         keycode2=0;
  82.         if(P13==0)
  83.         {
  84.                 delayms(10);
  85.                 if(P13==0)
  86.                 {
  87.                         while(P13==0);
  88.                         keycode2=1;
  89.                 }
  90.         }

  91.         return keycode2;
  92. }

  93. main()
  94. {
  95.         int a=0;
  96.         int i=0;
  97.         int j=0;
  98.         while(1)
  99.         {
  100.                 P0=segcode[0];
  101.                 keycode1=0;
  102.                 keycode2=0;
  103.                 a=keyscan1();
  104.                 if(a==1)
  105.                 {
  106.                         
  107.                         while(keyscan2()==0);
  108.                         for(i=0;i<36;i++)
  109.                         {
  110.                                 for(j=0;j<25;j++)
  111.                                 {        
  112.                                         numobuf(i);
  113.                                         display();
  114.                                         delayms(10);
  115.                                 }
  116.                         }
  117.                         
  118.                 }
  119.                 if(a==2)
  120.                 {
  121.                         while(keyscan2()==0);
  122.                         for(i=36;i>0;i--)
  123.                         {
  124.                                 for(j=0;j<25;j++)
  125.                                 {        
  126.                                 numobuf(i);
  127.                                 display();
  128.                                 delayms(10);
  129.                                 }
  130.                         }
  131.                         
  132.                 }
  133.                 if(a==3)
  134.                 {
  135.                         while(keyscan2()==0);
  136.                         while(1)
  137.                         {
  138.             
  139.                                 display2();
  140.                                 delayms(1);
  141.                         }        
  142.                 }
  143.         
  144.         }

  145. }
复制代码

7072FAB6-A754-4038-A710-8ED1A3A946C2.jpeg (1.16 MB, 下载次数: 24)

7072FAB6-A754-4038-A710-8ED1A3A946C2.jpeg
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:839835 发表于 2021-6-17 16:05 | 只看该作者
给你一个思路,定义三个标志位,分别对应计数1,2,3.比如按下按键1,再按下按键a,flag1 =1;
在主循环判断
if(flag1==1)
{
     数据清零;
     开始计数
}
if(flag2==1)
{
     数据清零;
     开始计数
}
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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