找回密码
 立即注册
楼主: ly1350

求助!关于独立按键检测的问题(问题解决了,但是疑问还在)

[复制链接]
  • 打卡等级:以坛为家I
  • 打卡总天数:301
  • 最近打卡:2025-05-07 00:54:31
已绑定手机

20

主题

329

回帖

1692

积分

金牌会员

积分
1692
发表于 2024-2-28 08:12:35 | 显示全部楼层
电子DI*** 发表于 2024-2-28 08:01
晚点我给你发一个好的按键检测函数

好的,谢谢。但是,我还想知道,我这种处理,除了浪费系统资源,按道理不应该死机啊
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:301
  • 最近打卡:2025-05-07 00:54:31
已绑定手机

20

主题

329

回帖

1692

积分

金牌会员

积分
1692
发表于 2024-2-28 08:13:05 | 显示全部楼层
zhude*** 发表于 2024-2-28 05:31
代码能全发出来么?不全不好找问题啊

以下是完整的代码。但是,一按按键就停止计数了。要去掉第255行的                Delay10ms();   
就运行正常。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:301
  • 最近打卡:2025-05-07 00:54:31
已绑定手机

20

主题

329

回帖

1692

积分

金牌会员

积分
1692
发表于 2024-2-28 08:14:42 | 显示全部楼层
zhude*** 发表于 2024-2-28 05:31
代码能全发出来么?不全不好找问题啊
  1. #include  <STC8H.H>
  2. #include  <intrins.h>
  3. #define   uchar         unsigned char
  4. #define   uint         unsigned int
  5. uchar dis[5]={0,0,':',0,0};
  6. uchar count=0,s=0,m=0,h=0;
  7. void Led_Init()
  8. {
  9.            P2M0 |= 0x7f; P2M1 &= ~0x7f;           //设置P2.0-P2.6为推挽输出       
  10.     P3M0 = (P3M0 & ~0x78) | 0x80; P3M1 &= ~0xf8; //设置P3.3-P3.6为高阻输入;p37为推挽输出
  11.                                      
  12.         P33=1;                                                   //DG1
  13.         P34=1;                                                          //DG2
  14.         P35=1;                                                          //DG3
  15.         P36=1;                                                          //DG4
  16.    
  17.         P37=0;                                                          //Pd
  18.         P20=0;                                                          //段A
  19.         P21=0;                                                          //段B
  20.         P22=0;                                                          //段C
  21.         P23=0;                                                          //段D
  22.         P24=0;                                                          //段E
  23.         P25=0;                                                          //段F
  24.         P26=0;                                                          //段G
  25. }
  26. void Delay1ms(void)        //@24.000MHz
  27. {
  28.         unsigned char data i, j;
  29.         _nop_();
  30.         i = 32;
  31.         j = 40;
  32.         do
  33.         {
  34.                 while (--j);
  35.         } while (--i);
  36. }
  37. void Delay10ms(void)        //@24.000MHz
  38. {
  39.         unsigned char data i, j;
  40.         i = 234;
  41.         j = 115;
  42.         do
  43.         {
  44.                 while (--j);
  45.         } while (--i);
  46. }
  47. void Display(unsigned char val[5])       
  48. {
  49.         unsigned char i=0;
  50.         for(i=0;i<5;i++)
  51.         {
  52.                 switch(val[i])
  53.                 {
  54.                         case 0 :
  55.                                         P20=1;                                                          
  56.                                         P21=1;                                                          
  57.                                         P22=1;                                                         
  58.                                         P23=1;                                                         
  59.                                         P24=1;                                                         
  60.                                         P25=1;                                                         
  61.                         break;
  62.                         case 1 :
  63.                                     P21=1;                                                          
  64.                             P22=1;
  65.                                         break;
  66.                         case 2 :
  67.                                         P20=1;                                                          //段A
  68.                                         P21=1;                                                          //段B
  69.                                         P22=0;                                                          //段C
  70.                                         P23=1;                                                          //段D
  71.                                         P24=1;                                                          //段E
  72.                                         P25=0;                                                          //段F
  73.                                         P26=1;                                                          //段G
  74.                                         break;
  75.                         case 3 :
  76.                                         P20=1;                                                          //段A
  77.                                         P21=1;                                                          //段B
  78.                                         P22=1;                                                          //段C
  79.                                         P23=1;                                                          //段D
  80.                                         P24=0;                                                          //段E
  81.                                         P25=0;                                                          //段F
  82.                                         P26=1;                                                          //段G
  83.                                         break;
  84.                         case  4 :
  85.                                         P20=0;                                                          //段A
  86.                                         P21=1;                                                          //段B
  87.                                         P22=1;                                                          //段C
  88.                                         P23=0;                                                          //段D
  89.                                         P24=0;                                                          //段E
  90.                                         P25=1;                                                          //段F
  91.                                         P26=1;                                                          //段G
  92.                                         break;
  93.                         case  5 :
  94.                                         P20=1;                                                          //段A
  95.                                         P21=0;                                                          //段B
  96.                                         P22=1;                                                          //段C
  97.                                         P23=1;                                                          //段D
  98.                                         P24=0;                                                          //段E
  99.                                         P25=1;                                                          //段F
  100.                                         P26=1;                                                          //段G
  101.                                         break;
  102.                         case  6 :
  103.                                         P20=1;                                                          //段A
  104.                                         P21=0;                                                          //段B
  105.                                         P22=1;                                                          //段C
  106.                                         P23=1;                                                          //段D
  107.                                         P24=1;                                                          //段E
  108.                                         P25=1;                                                          //段F
  109.                                         P26=1;                                                          //段G
  110.                                         break;
  111.                         case  7 :               
  112.                                         P20=1;                                                          //段A
  113.                                         P21=1;                                                          //段B
  114.                                         P22=1;                                                          //段C
  115.                                         P23=0;                                                          //段D
  116.                                         P24=0;                                                          //段E
  117.                                         P25=0;                                                          //段F
  118.                                         P26=0;                                                          //段G
  119.                                         break;
  120.                         case  8 :
  121.                                         P20=1;                                                          //段A
  122.                                         P21=1;                                                          //段B
  123.                                         P22=1;                                                          //段C
  124.                                         P23=1;                                                          //段D
  125.                                         P24=1;                                                          //段E
  126.                                         P25=1;                                                          //段F
  127.                                         P26=1;                                                          //段G
  128.                                         break;
  129.                         case 9 :
  130.                                         P20=1;                                                          //段A
  131.                                         P21=1;                                                          //段B
  132.                                         P22=1;                                                          //段C
  133.                                         P23=1;                                                          //段D
  134.                                         P24=0;                                                          //段E
  135.                                         P25=1;                                                          //段F
  136.                                         P26=1;                                                          //段G
  137.                                         break;
  138.                         case 'a' :
  139.                                         P20=1;                                                          //段A
  140.                                         P21=1;                                                          //段B
  141.                                         P22=1;                                                          //段C
  142.                                         P23=0;                                                          //段D
  143.                                         P24=1;                                                          //段E
  144.                                         P25=1;                                                          //段F
  145.                                         P26=1;                                                          //段G
  146.                                         break;
  147.                         case 'b' :
  148.                                         P20=0;                                                          //段A
  149.                                         P21=0;                                                          //段B
  150.                                         P22=1;                                                          //段C
  151.                                         P23=1;                                                          //段D
  152.                                         P24=1;                                                          //段E
  153.                                         P25=1;                                                          //段F
  154.                                         P26=1;                                                          //段G
  155.                                         break;
  156.                         case 'c' :
  157.                                         P20=1;                                                          //段A
  158.                                         P21=0;                                                          //段B
  159.                                         P22=0;                                                          //段C
  160.                                         P23=1;                                                          //段D
  161.                                         P24=1;                                                          //段E
  162.                                         P25=1;                                                          //段F
  163.                                         P26=0;                                                          //段G               
  164.                                         break;
  165.                         case 'd' :
  166.                                         P20=0;                                                          //段A
  167.                                         P21=1;                                                          //段B
  168.                                         P22=1;                                                          //段C
  169.                                         P23=1;                                                          //段D
  170.                                         P24=1;                                                          //段E
  171.                                         P25=0;                                                          //段F
  172.                                         P26=1;                                                          //段G
  173.                                         break;
  174.                         case 'e' :
  175.                                         P20=1;                                                          //段A
  176.                                         P21=0;                                                          //段B
  177.                                         P22=0;                                                          //段C
  178.                                         P23=1;                                                          //段D
  179.                                         P24=1;                                                          //段E
  180.                                         P25=1;                                                          //段F
  181.                                         P26=1;                                                          //段G
  182.                                         break;
  183.                         case 'f' :
  184.                                         P20=1;                                                          //段A
  185.                                         P21=0;                                                          //段B
  186.                                         P22=0;                                                          //段C
  187.                                         P23=0;                                                          //段D
  188.                                         P24=1;                                                          //段E
  189.                                         P25=1;                                                          //段F
  190.                                         P26=1;                                                          //段G
  191.                                         break;
  192.                        
  193.                     case ':' : P37=1;break;
  194.                         default : P26=1;                                                          //段G
  195.                 }
  196.                 switch(i)
  197.                 {
  198.                     case 0 :     P33=0;break;
  199.                         case 1 :     P34=0;break;
  200.                         case 2 :     P34=0;break;
  201.                         case 3 :     P35=0;break;
  202.                         case 4:                 P36=0;break;
  203.                 }
  204.                  Delay1ms();
  205.                  Led_Init();
  206.         }
  207. }
  208. void Timer1_Init(void)                //1毫秒@24.000MHz
  209. {
  210.         AUXR |= 0x40;                        //定时器时钟1T模式
  211.         TMOD &= 0x0F;                        //设置定时器模式
  212.         TL1 = 0x40;                                //设置定时初始值
  213.         TH1 = 0xA2;                                //设置定时初始值
  214.         TF1 = 0;                                //清除TF1标志
  215.         TR1 = 1;                                //定时器1开始计时
  216.         ET1=1;
  217.         EA=1;
  218. }
  219. void main()
  220. {
  221.         uchar i=0,f=0;
  222.         P3M0 &= ~0x04; P3M1 &= ~0x04;         //设置P32为标准io口
  223.         EX0=0;
  224.         P32=1;
  225.         Timer1_Init();
  226.         while(1)
  227.         {
  228.           if(P32==0)
  229.           {       
  230.                 Delay10ms();
  231.                 if(P32==0)
  232.                 {
  233.                          f++;
  234.                         while(!P32);
  235.                     
  236.                 }
  237.           }
  238.           if(f>=3) f=0;
  239.           if(count>=100)
  240.           {
  241.                   count=0        ;
  242.                 s+=1;
  243.           }
  244.           if(s>=60)
  245.           {
  246.                    s=0;
  247.                 m++;
  248.           }
  249.           if(m>=60)
  250.           {
  251.                 m=0;
  252.                 h++;
  253.           }
  254.           if(h>=24)h=0 ;
  255.           switch(f)
  256.           {
  257.                 case 0 :
  258.                          dis[0]=s/10;
  259.                           dis[1]=s%10;
  260.                           dis[3]=count/10;
  261.                           dis[4]=count%10;
  262.                         break;
  263.                   case 1 :
  264.                          dis[0]=h/10;
  265.                           dis[1]=h%10;
  266.                           dis[3]=m/10;
  267.                           dis[4]=m%10;
  268.                         break;
  269.                 case 2 :
  270.                          dis[0]=m/10;
  271.                           dis[1]=m%10;
  272.                           dis[3]=s/10;
  273.                           dis[4]=s%10;
  274.                         break;
  275.                 default : break;
  276.           }
  277.         }
  278. }
  279. void Timer1_Isr() interrupt 3
  280. {
  281.         Display(dis);
  282.         count++;
  283. }
复制代码

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:301
  • 最近打卡:2025-05-07 00:54:31
已绑定手机

20

主题

329

回帖

1692

积分

金牌会员

积分
1692
发表于 2024-2-28 08:28:07 | 显示全部楼层
我这个菜鸟写的程序,有点不好意思往上发
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:301
  • 最近打卡:2025-05-07 00:54:31
已绑定手机

20

主题

329

回帖

1692

积分

金牌会员

积分
1692
发表于 2024-2-28 09:31:21 | 显示全部楼层
目前我自己的解决方法是:
设置一个变量temp,记录两次按键端口检测为低之间的时间,如果大于20ms,就认定不是抖动。经测试,去抖问题解决了。
但是,我的疑问还在,为什么用软件延时,程序就死机呢?还是没搞明白
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:301
  • 最近打卡:2025-05-07 00:54:31
已绑定手机

20

主题

329

回帖

1692

积分

金牌会员

积分
1692
发表于 2024-2-28 09:33:32 | 显示全部楼层
本帖最后由 ly1350 于 2024-2-28 09:37 编辑

我的解决办法:(修改部分)
  1. void main()
  2. {
  3.         uchar i=0,f=0,temp=0;
  4.         P3M0 &= ~0x04; P3M1 &= ~0x04;         //设置P32为标准io口
  5.         P32=1;
  6.         Timer1_Init();
  7.         while(1)
  8.         {
  9.           if((P32==0)&&(temp==0))                  
  10.                 temp=count;
  11.                   else if((P32==0)&&(count-temp)>20)
  12.                 {
  13.                          f++;
  14.                         while(!P32);
  15.                     
  16.                 }
复制代码



回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:395
  • 最近打卡:2025-05-06 17:50:26

0

主题

336

回帖

1506

积分

金牌会员

积分
1506
发表于 2024-3-12 12:04:37 | 显示全部楼层
Delay10ms这个函数你用的是STCISP软件生成的,STC8H单片机应该用Y6指令集,你用的是Y5指令集了
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:301
  • 最近打卡:2025-05-07 00:54:31
已绑定手机

20

主题

329

回帖

1692

积分

金牌会员

积分
1692
发表于 2024-3-12 16:01:21 | 显示全部楼层
xxxe*** 发表于 2024-3-12 12:04
Delay10ms这个函数你用的是STCISP软件生成的,STC8H单片机应该用Y6指令集,你用的是Y5指令集了 ...

我这个思路不对。用定时器搞
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:81
  • 最近打卡:2025-05-06 09:41:01

0

主题

15

回帖

542

积分

高级会员

积分
542
发表于 2024-3-12 16:09:59 | 显示全部楼层
本帖最后由 zhaoliang3399 于 2024-3-12 16:15 编辑

你的定时器太忙了,1ms中断里调用的Display(dis)子程序大于1ms,你觉的你的主程序里10MS的延时还有时间进行吗,1ms的中断里加一个1ms的软延时你想想吧,你后用改的是用定时器计数,所以就可以了
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:301
  • 最近打卡:2025-05-07 00:54:31
已绑定手机

20

主题

329

回帖

1692

积分

金牌会员

积分
1692
发表于 2024-3-12 20:20:42 | 显示全部楼层
zhaolia*** 发表于 2024-3-12 16:09
你的定时器太忙了,1ms中断里调用的Display(dis)子程序大于1ms,你觉的你的主程序里10MS的延时还有时间进行 ...

我写的是标准的菜鸟程序
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-7 14:28 , Processed in 0.124728 second(s), 106 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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