找回密码
 立即注册
查看: 65|回复: 6

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

[复制链接]
  • 打卡等级:常住居民II
  • 打卡总天数:88
  • 最近打卡:2025-12-13 21:09:54

46

主题

32

回帖

616

积分

高级会员

积分
616
发表于 2025-11-17 14:27:42 | 显示全部楼层 |阅读模式
想借鉴一下梁老师的t12烙铁里的按键程序,使用了B寄存器,我用的是stc32g12k128单片机,stc32g12k128头文件没有发现B寄存器的声明,我把stc8h里,B寄存器的声明,考到了stc32g的头文件,编译正常,但按键无法使用,不知什么原因,请高手解答,难道stc32g里没有B 寄存器。
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:253
  • 最近打卡:2025-12-17 11:28:25

84

主题

7156

回帖

1万

积分

超级版主

积分
15260
发表于 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;
回复

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:88
  • 最近打卡:2025-12-13 21:09:54

46

主题

32

回帖

616

积分

高级会员

积分
616
发表于 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没有写,应该长按蜂鸣器不响,我没有在你的程序中找到长按的使用程序,长按没用吗,这样怎么区分长按短按呢

点评

这个版本提供了长按键码但没有使用。 另外的版本用于电池供电,长按1秒显示电池电压2秒。 你可以将这个键码用于任意用途。 if(KeyCode != 0) { if(KeyCode == K1_PRESS) //短按释放,允许-禁止PID  详情 回复 发表于 2025-11-17 23:04
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:253
  • 最近打卡:2025-12-17 11:28:25

84

主题

7156

回帖

1万

积分

超级版主

积分
15260
发表于 2025-11-17 23:04:57 | 显示全部楼层
dong*** 发表于 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;
}
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:492
  • 最近打卡:2025-12-16 21:17:24
已绑定手机

270

主题

393

回帖

2166

积分

金牌会员

积分
2166
发表于 2025-11-18 07:18:50 | 显示全部楼层
好好的内存你不用,非要用寄存器,这会导致程序出错
回复

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:88
  • 最近打卡:2025-12-13 21:09:54

46

主题

32

回帖

616

积分

高级会员

积分
616
发表于 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
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:253
  • 最近打卡:2025-12-17 11:28:25

84

主题

7156

回帖

1万

积分

超级版主

积分
15260
发表于 2025-11-26 10:57:36 | 显示全部楼层
dong*** 发表于 2025-11-26 08:48
梁老师你好,按键程序有一个问题,短按执行短按程序,但长按时既执行长按程序又执行短按程序,原因我分析 ...

那你要改成释放执行按键,这样就是:短按释放,长按。
回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-12-18 19:51 , Processed in 0.109189 second(s), 77 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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