找回密码
 立即注册
楼主: ly1***

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

[复制链接]
  • TA的每日心情
    慵懒
    3 小时前
  • 签到天数: 89 天

    [LV.6]常住居民II

    14

    主题

    207

    回帖

    734

    积分

    高级会员

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

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

    使用道具 举报

  • TA的每日心情
    慵懒
    3 小时前
  • 签到天数: 89 天

    [LV.6]常住居民II

    14

    主题

    207

    回帖

    734

    积分

    高级会员

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

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

    使用道具 举报

  • TA的每日心情
    慵懒
    3 小时前
  • 签到天数: 89 天

    [LV.6]常住居民II

    14

    主题

    207

    回帖

    734

    积分

    高级会员

    积分
    734
     楼主| 发表于 2024-2-28 08:14:42 | 显示全部楼层
    zhudean11 发表于 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. }
    复制代码

    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    慵懒
    3 小时前
  • 签到天数: 89 天

    [LV.6]常住居民II

    14

    主题

    207

    回帖

    734

    积分

    高级会员

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

    使用道具 举报

  • TA的每日心情
    慵懒
    3 小时前
  • 签到天数: 89 天

    [LV.6]常住居民II

    14

    主题

    207

    回帖

    734

    积分

    高级会员

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

    使用道具 举报

  • TA的每日心情
    慵懒
    3 小时前
  • 签到天数: 89 天

    [LV.6]常住居民II

    14

    主题

    207

    回帖

    734

    积分

    高级会员

    积分
    734
     楼主| 发表于 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.                 }
    复制代码



    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    10 小时前
  • 签到天数: 72 天

    [LV.6]常住居民II

    0

    主题

    209

    回帖

    468

    积分

    中级会员

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

    使用道具 举报

  • TA的每日心情
    慵懒
    3 小时前
  • 签到天数: 89 天

    [LV.6]常住居民II

    14

    主题

    207

    回帖

    734

    积分

    高级会员

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

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

    使用道具 举报

  • TA的每日心情
    开心
    5 天前
  • 签到天数: 32 天

    [LV.5]常住居民I

    0

    主题

    7

    回帖

    276

    积分

    中级会员

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

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

    使用道具 举报

  • TA的每日心情
    慵懒
    3 小时前
  • 签到天数: 89 天

    [LV.6]常住居民II

    14

    主题

    207

    回帖

    734

    积分

    高级会员

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

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

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-5-17 22:09 , Processed in 0.074409 second(s), 63 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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