想借鉴一下梁老师的t12烙铁里的按键程序,B寄存器的使用问题
想借鉴一下梁老师的t12烙铁里的按键程序,使用了B寄存器,我用的是stc32g12k128单片机,stc32g12k128头文件没有发现B寄存器的声明,我把stc8h里,B寄存器的声明,考到了stc32g的头文件,编译正常,但按键无法使用,不知什么原因,请高手解答,难道stc32g里没有B 寄存器。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;
梁工 发表于 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没有写,应该长按蜂鸣器不响,我没有在你的程序中找到长按的使用程序,长按没用吗,这样怎么区分长按短按呢 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;
}
好好的内存你不用,非要用寄存器,这会导致程序出错 梁工 发表于 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;
}
dongfang 发表于 2025-11-26 08:48
梁老师你好,按键程序有一个问题,短按执行短按程序,但长按时既执行长按程序又执行短按程序,原因我分析 ...
那你要改成释放执行按键,这样就是:短按释放,长按。
页:
[1]