Ⅰ 各位大神,大家好:用51单片机c语言,STC89c52。怎么实现一个按键,按一次
这个可以通过定时器来实现,比如当按键时间小于2秒时,按一次加1,当超过2秒时,没50毫秒加1实现连加功能。例程如下:
#include<reg51.h>
unsigned int a;
unsigned char times;
sbit key=P1^0;
void t0isr() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
times++;
if(times>40)
{
Ⅱ c语言按键控制程序
if(keypress==true)检测有键按下 {delay_us(50); 延迟50us,软件滤波防抖动 if(keypress==true) 检测有键被按下 key_value=P1;提取键值 {switch(key_value) 识别是那个键被按下了 case 0x01: XXX;break; case 0x02:XXX;BREAK;进入对应工步或者动作即可。 ...... } } }
Ⅲ c语言键盘按键触发怎么表示
可以用FlexibleButton表示。
FlexibleButton 是一个基于标准 C 语言的小巧灵活的按键处理库,支持单击、连击、短按、长按、自动消抖,可以自由设置组合按键,可用于中断和低功耗场景。
该按键库解耦了具体的按键硬件结构,理论上支持轻触按键与自锁按键,并可以无限扩展按键数量。另外,FlexibleButton 使用扫描的方式一次性读取所有所有的按键状态,然后通过事件回调机制上报按键事件。
核心的按键扫描代码仅有三行,没错,就是经典的 三行按键扫描算法。使用 C 语言标准库 API 编写,也使得该按键库可以无缝兼容任意的处理器平台,并且支持任意 OS 和 non-OS(裸机编程)。
快速体验:
FlexibleButton 库中提供了一个测试例程 ./examples/demo_rtt_iotboard.c,该例程基于 RT-Thread OS 进行测试,硬件平台选择了 RT-Thread IoT Board Pandora v2.51 开发板。
当然你可以选择使用其他的 OS,或者使用裸机测试,只需要移除 OS 相关的特性即可。
如果你使用自己的硬件平台,只需要将 FlexibleButton 库源码和例程加入你既有的工程下即可。
DEMO 程序说明:
该示例程序可以直接在 RT-Thread stm32l475-atk-pandora BSP 中运行,可以在该 BSP 目录下,使用 menuconfig 获取本软件包。
Ⅳ 如何用C语言写一个按键按一次数值就加一的程式呀
#include <stdio.h>
#include <stdlib.h>
void main()
{
char p[4];
int n=0;
while ( 1 ){
p[0] = getch(); // 即时监视按键
if (p[0] == 0x1b) break; // 如果 Esc 则退出
if (p[0] >= '0' && p[0] <= '9') n++; // 是数字则累加1
}
printf("\n Number of digits =%d",n);
}
Ⅳ 51单片机C语言按键被重复执行
程序有些啰嗦,
voidmain()
{
while(1)key();//调用按键服务函数
}
voidkey()
{
if(S1==0)testone();
elseif(S2==0)testhold();
elseif(S3==0)noteup();
elseif(S4==0)notedown();
}
Ⅵ 如何用C语言实现按键功能
主要就是按键检测,防抖呗。
首先给出检测按键代码:(我这个事4*4键盘。具体你要根据实际情况编写)
uchar TestKey()
{
uchar cord_h,cord_l;
P6=0x0f;
cord_h=P6&0x0f;
if(cord_h!=0x0f)
{
Delay_Xms(1);
if(cord_h!=0x0f)
{
cord_h=P6&0x0f;
P6=cord_h|0xf0;
cord_l=P6&0xf0;
return(cord_h+cord_l);
}
}return(0xff);
}
--------------------------------------
然后你在Main函数里编写循环,检测按键然后做你想做的事情。。。
while(1)
{
key=TestKey();//调用键盘扫描,
switch(key)
{
case 0x7e:P4=0xa1;break;//0 按下相应的键显示相对应的码值
case 0x7d:Show1Menu();break;//1
case 0x7b:P4=0x83;break;//2
case 0x77:P4=0x88;break;//3
case 0xbe:P4=0x99;break;//4
case 0xbd:P4=0x90;break;//5
case 0xbb:P4=0x82;break;//6
case 0xb7:P4=0xb0;break;//7
case 0xde:P4=0xc0;break;//8
case 0xdd:P4=0x80;break;//9
case 0xdb:P4=0x92;break;//a
case 0xd7:P4=0xa4;break;//b
case 0xee:P4=0xc6;break;//c
case 0xed:P4=0xf8;break;//d
case 0xeb:P4=0x99;break;//e
case 0xe7:P4=0xf9;break;//f
}
}
Ⅶ c语言怎样判断键盘按键的按下、释放
C语言判断键盘按下和释放,是通过检测该键的状态来实现的。如果是单一的一个按键,那么直接检测该键是“1”还是“0”,就可以确定是按下还是释放。如果是矩阵键盘,那么需要发送扫描码,再检测输入值,来判断键盘中键的状态。以下举例说明:
bitkeychk()//单一按键检测
{
if(P1.0==0)//如果键按下
{
delay();//延时去抖
if(P1.0==0)return(1);//返回键状态
}
return(0);
}
unsignedcharkbscan(void)//矩阵扫描按键检测
{
unsignedcharsccode,recode;
P1=0x0f;//发0扫描,列线输入
if((P2&0x0f)!=0x0f)//有键按下
{
delay(20);//延时去抖动
if((P1&0x0f)!=0x0f)
{
sccode=0xef;//逐行扫描初值
while((sccode&0x01)!=0)
{
P1=sccode;
if((P1&0x0f)!=0x0f)
{
recode=(P1&0x0f)|0xf0;
while((P1&0x0f)!=0x0f);//等待键抬起
return((~sccode)+(~recode));
}
else
sccode=(sccode<<1)|0x01;
}
}
}
return0;//无键按下,返回0
}
Ⅷ 急求:我编的c语言控制程序,如何更改触发方式(按键判断改为高低电平判断),而保持原程序执行结果。
新建工程
首先新建工程,并加以简单配置,可以参考我的分享:《IAR如何建立工程》,如下为硬件电路图:
PICTL
PICTL可以控制Px口中断触发信号:上升沿触发、下降沿触发。由于按键在未按下时处于高电平,按下后为低电平,松开后又为高电平,所以会产生下降沿触发信号,配置为下降沿触发即可:
PICTL |= BIT0; //falling edge
IEN1
除了配置引脚,还需要开启端口引脚中断使能,如下所示开启PO口中断使能:
IEN1 |= BIT5; //P0 interrupt
PxIFG
在开启中断前需要先清除中断标志,以免误入中断造成系统混乱。
P0IFG &= ~BIT4;
系统中断使能
学习51都知道,在任何中断操作时,都需要开启系统中断:
EA = 1; //system interrupt open
中断函数书写
#pragma vector = P0INT_VECTOR
__interrupt void P0_isr(void)
{
wg_waitUs(10);
P0IFG &= ~BIT4;
P0IF &= ~BIT4;
P1_0 = ~P1_0; //led1 trigger
}
其中wg_waitUs()是延时函数,起到按键消抖作用。
代码框架
void wg_ledInit(void)
{
P1DIR |= BIT0;
P1 |= BIT0;
}
void wg_btnInit(void)
{
P0IEN |= BIT4; // P0.4 button input
PICTL |= BIT0; //falling edge
IEN1 |= BIT5; //P0 interrupt
P0IFG &= ~BIT4;
EA = 1; //system interrupt open
}
void wg_waitUs(uint16 ration)
{
while (ration--)
{
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
}
}
void main(void)
{
wg_ledInit();
wg_btnInit();
//loop
for(;;)
{
;//
}
}
#pragma vector = P0INT_VECTOR
__interrupt void P0_isr(void)
{
wg_waitUs(10);
P0IFG &= ~BIT4;
P0IF &= ~BIT4;
P1_0 = ~P1_0; //led1 trigger
}
Ⅸ C语言中单按键控制流水灯亮灭
enum{
按着,
松开,
};
std::vector<int> light,
把你的灯仿佛light 然后判断当前的状况,每次触发按着的时候就让 light当前的状态变成关灯,light的下一个灯变成开起