dongfang 发表于 2025-11-17 14:27:42

想借鉴一下梁老师的t12烙铁里的按键程序,B寄存器的使用问题

想借鉴一下梁老师的t12烙铁里的按键程序,使用了B寄存器,我用的是stc32g12k128单片机,stc32g12k128头文件没有发现B寄存器的声明,我把stc8h里,B寄存器的声明,考到了stc32g的头文件,编译正常,但按键无法使用,不知什么原因,请高手解答,难道stc32g里没有B 寄存器。

梁工 发表于 2025-11-17 16:12:53

STC32G也是有B寄存器的,见下面的定义,你看下你的定义是否一致。我的程序是使用STC8H8K64U,你改为STC32G12K128,你看下你的IO是否改变。如果IO完全一样,应该是不用改程序的。

sfr B= 0xF0;

/*   B:0xf0*/
sbit B0 = B^0;
sbit B1 = B^1;
sbit B2 = B^2;
sbit B3 = B^3;
sbit B4 = B^4;
sbit B5 = B^5;
sbit B6 = B^6;
sbit B7 = B^7;

dongfang 发表于 2025-11-17 18:44:14

梁工 发表于 2025-11-17 16:12
STC32G也是有B寄存器的,见下面的定义,你看下你的定义是否一致。我的程序是使用STC8H8K64U,你改为STC32G1 ...
谢谢梁老师,stc32g头文件有B寄存器的定义,但没有位的定义,问题找到了,我漏下了将蜂鸣器关闭计数值置零,

                  while (1)
      {      


                if(KEYJ>=50)
                        {                        
                              KEYJ=0;
                              ReadKey();
                        }
                if(KeyCode != 0)
                        {
                              if(KeyCode == K1_PRESS)               
                                        {
                                                
                                                BPj=0;
                                                BEEP=1;      
                                        }
                              KeyCode = 0;
                        }
                if(BPj>150)
                        {
                              BEEP=0;      
                        }
               
                if(bmq1!=bmq)
                        {
                              bmq1=bmq;
                              sprintf(S,"%3d",bmq);
                              LCD_A24(100,30,S,15,0,3);   //显示12*24字符串      
                        }                                                                        
      }
梁老师还有一个问题,现在是不管长按短按只要是抬起按钮,蜂鸣器就响一下,理论上短按抬起蜂鸣器响,我长按超过1秒钟应该是KeyCode = K1_HOLD;,因为这一项while没有写,应该长按蜂鸣器不响,我没有在你的程序中找到长按的使用程序,长按没用吗,这样怎么区分长按短按呢

梁工 发表于 2025-11-17 23:04:57

dongfang 发表于 2025-11-17 18:44
谢谢梁老师,stc32g头文件有B寄存器的定义,但没有位的定义,问题找到了,我漏下了将蜂鸣器关闭计数值置零 ...

这个版本提供了长按键码但没有使用。
另外的版本用于电池供电,长按1秒显示电池电压2秒。
你可以将这个键码用于任意用途。
if(KeyCode != 0)
{
      if(KeyCode == K1_PRESS)         //短按释放,允许-禁止PID
   {
          B_PID_enable = ~B_PID_enable;
          if(B_PID_enable)    WorkTime = 300; //工作限时,秒
          else                     WorkTime = 0;
       }
       else if(KeyCode == K1_HOLD)      //长按超过1秒
      {
                   //任意用途
      }
      KeyCode = 0;
}

QQ624353765 发表于 2025-11-18 07:18:50

好好的内存你不用,非要用寄存器,这会导致程序出错

dongfang 发表于 2025-11-26 08:48:12

梁工 发表于 2025-11-17 23:04
这个版本提供了长按键码但没有使用。
另外的版本用于电池供电,长按1秒显示电池电压2秒。
你可以将这个键 ...

梁老师你好,按键程序有一个问题,短按执行短按程序,但长按时既执行长按程序又执行短按程序,原因我分析应该是长按时就执行长按程序,当松开时又执行一次短按程序,我尝试在长按程序加了等待松开,但还不行,只有将上一次原始按键状态KeyState=0既
if(KeyCode != 0)
                                {
                                        if(KeyCode == K1_PRESS)         //短按释放,允许-禁止PID
                                               {
                                                                szj++;
                                                                if(szj>4)szj=0;
                                                                szgx=1;
                                                                BEEP=1;                                               //任意用途
                                                                BPj=0;
                                               }
                                       else if(KeyCode == K1_HOLD)      //长按超过1秒
                                               {
                                                                BEEP=1;                                               //任意用途
                                                                BPj=0;
                                                       KeyState=0;
                                                       while(!P34);                                                       
                                               }
                                        KeyCode = 0;
                                }

但这样有等待时间,打乱主循环,梁老师你有什么好方法吗,
下面是按键扫描程序是你是原程序吗

       
void        ReadKey(void)        //50ms call
{
        u8        i;
        i = KeyState;
        B0 = P34;
        KeyState = ~B & 0x01;
        i = (i ^ KeyState) & i & 0x01;        //键释放
        if(KeyCode != K1_HOLD)
        {
        if(i != 0)        KeyCode = K1_PRESS;
        }
        if(KeyState != 0)                //有键按着
        {
                if(++KeyHoldCnt >= 100)        KeyHoldCnt = 100;
                if(KeyHoldCnt == 20)                //M键长按1秒
                {
                        KeyCode = K1_HOLD;
                }
        }
        else KeyHoldCnt = 0;
}

梁工 发表于 2025-11-26 10:57:36

dongfang 发表于 2025-11-26 08:48
梁老师你好,按键程序有一个问题,短按执行短按程序,但长按时既执行长按程序又执行短按程序,原因我分析 ...

那你要改成释放执行按键,这样就是:短按释放,长按。
页: [1]
查看完整版本: 想借鉴一下梁老师的t12烙铁里的按键程序,B寄存器的使用问题