Ⅰ 各位大神,大家好:用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的下一個燈變成開起