❶ 求關於單片機按鍵的程序
void _Key(void)
{
if(!Key) //有按鍵按下
{
Delay(500); 延時
if(!Key) //還是按下狀態,即長擊
{
Disp("2");
}
else //否則就是短擊
{
Disp("1");
}
}
else //沒有按鍵按下
{
Disp("3");
}
}
大概思路是這樣,延遲函數自己掌握,一般還要加消抖(也就是較短的延時後再判斷一次按鍵狀態)
❷ 51單片機中按鍵程序用C怎麼寫
這個太簡單了吧,記住寫程序定時器要一直跑,建立一個時基,像個手錶的時間一樣要一直跑,即有time_125us,time_1ms,time_100ms,time_1s,time_1min,time_1hour等時間變數建立時基一直走。其它程序可以分時掃描也可以輪流掃描,不能停留死等,像電腦里的程序一樣表面看起來各個程序是一直運行的,即各個程序中不能有delay_1ms之類的函數,如果要定時應該申請一個變數在時基里處理,如等待2s可以這么寫
if(step==0){
time=2,time_100ms=0,step=1;}
if((step==1)&&(time==0)){//2s到
//等待2s後要執行的代碼
}
在時基時每1s把time減1,減到0為止即if(time)time--;
對按鍵的寫法一般用採集的方法如按鍵後IO為低
if(!IO){
//低電平,有按鍵
key_time++;
if((key_time==100)&&(!key_flag)){
//已經賦值了就不再賦值了
key_flag=1;
key_flag_bak=1;
}
else{
//無按鍵
key_time=0;
key_flag_bak=0;
}
if(key_flag&&(!key_flag_bak)){
//有按鍵並松開,即松開響應
time=2;
//亮2s
key_flag=0;//把鍵值清0
}
if(time){
LED_ON;//燈亮
}
else
LED_OFF;
❸ 51單片機匯編語言按鍵如何編程
編程時,要把整個程序,分解成一個一個模塊。
一個模塊,只包括一個功能。
那麼,KEY 模塊:
讀出按鍵、消除抖動、讀取鍵值,返回鍵值。
鍵值包括:00H、08H... 20H,FFH(無鍵)。
這個 KEY 模塊,到這就完了。
按鍵如何處理,則是另外的模塊。
樓主流程圖,包羅萬象,好像是個主程序。不好弄。
❹ 51單片機C語言編程如何實現長按按鍵實現數值的累加
這個可以用定時器來做,比如檢查某鍵,按鍵時間超過2秒後一個變數開始累加知道鍵釋放為止。實現方法如下:
#include<reg51.h>
#define
uint
unsigned
int
#define
uchar
unsigned
char
uint
v=0,time=0;
sbit
key=P1^0;
void
t0isr()
interrupt
1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
time++;
if((key==0)&&(time>40)v++;
//如果按鍵時間超過2秒且鍵未釋放,變數+1
if(key==1)time=0;
//如果鍵釋放,時間復位
}
main()
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TR0=1;
ET0=1;
EA=1;
while(1);
}
❺ 51單片機獨立按鍵部分編程問題
你好:
程序是這么運行的:
先在心中想像獨立按鍵的結構,沒按下時,P3外接上拉電阻,所以輸入總是1,按鍵按下時,倒地,對應按鍵的IO輸入為0.
然後,先置IO為輸入,沒按下時讀出全是1,0xff,當有按鍵按下時,讀入為0了,所以用if(KeyPort!=0xff)來判斷是否有輸入,然後消抖一下,繼而繼續判斷是否還在輸入,如果還在輸入說明不是抖動引起而是認為引起,之後讀取P3口的低5為數據(估計是你的獨立按鍵的介面吧),並賦值給keyvalue;while((KeyPort & 0x1f)!=0x1f)這句的意思是如果一直按著,P3輸入的數據肯定不變,那麼條件為真,死循環,如果松開,P3全為1了,此時是等於0x1f的,所以結束循環,進行按鍵處理。
最後,是按鍵的核心,當P3.0按下,那麼對應值是11111110,那麼keyvalue的值是11110=0x1e,如果P3.1按下,那麼對應值是11111101,那麼keyvalue的值是11101=0x1d,以此類推,5個按鍵對應你題目中5個值。
不懂回復。
希望我的回答能幫助到你。
❻ 51單片機匯編語言編程獨立按鍵
四個按鍵,定義如下:
KEY1 BIT P3.0
KEY2 BIT P3.1
KEY3 BIT P3.2
KEY4 BIT P3.3
按鍵處理程序:
;-----------------------------------
READ_KEY:
JB KEY1, K2
CALL DELAY
JB KEY1, K2
JNB KEY1, $
PUSH ACC
INC 75H
MOV A, 75H
CJNE A, #10, ZINT01
MOV 75H, #0
ZINT01:
POP ACC
JMP K_EXIT
;---------------
K2: JB KEY2, K3
CALL DELAY
JB KEY2, K3
JNB KEY2, $
PUSH ACC
INC 76H
MOV A, 76H
CJNE A, #10, ZINT01
MOV 76H, #0
ZINT01:
POP ACC
JMP K_EXIT
;---------------
K3: JB KEY3, K4
CALL DELAY
JB KEY3, K4
JNB KEY3, $
PUSH ACC
DEC 75H
MOV A, 75H
CJNE A, #255, ZINT03
MOV 75H, #9
ZINT03:
POP ACC
JMP K_EXIT
;---------------
K4: JB KEY4, K_EXIT
CALL DELAY
JB KEY4, K_EXIT
JNB KEY4, $
PUSH ACC
DEC 76H
MOV A, 76H
CJNE A, #255, ZINT04
MOV 76H, #9
ZINT04:
POP ACC
K_EXIT:
RET
;---------------
DELAY:
DJNZ R7, $
DJNZ R7, $
RET
;-----------------------------------
❼ 現實單片機按鍵編程
是否要實現在線編程ISP?
有ISP功能的MCU編程可以看做兩部分,好像:電腦的BIOS與硬碟程序,你設置好BIOS以處理你要實現的編程功能,那麼硬碟程序就交給用戶去實現了!
也就是說,你要寫好2k~8k的ISP引導碼即可!
❽ 單片機C語言按鍵開關程序
#include<reg52.h>
#defineuintunsignedint
#defineucharunsignedchar
voiddelay_ms(uint);
sbitled0=P0^0;
sbitled1=P0^1;
sbitkey1=P3^2;
sbitkey2=P3^3;
voidmain()
{
uchari=0;
ucharj=0;
while(1)
{
if(key1==0)//按鍵1
{
delay_ms(10);
if(key1==0)
{
i++;
i=i%2;
switch(i)
{
case0:led0=1;break;//關小燈
case1:led0=0;break;//開小燈
default:break;
}
}
while(!key1);
}
if(key2==0)//按鍵2
{
delay_ms(10);
if(key2==0)
{
j++;
j=j%2;
switch(j)
{
case0:led1=1;break;//關小燈
case1:led1=0;break;//開小燈
default:break;
}
}
while(!key2);
}
}
}
voiddelay_ms(uintz)//延時子程序
{
uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
❾ 51單片機如何用一個按鍵控制一段程序的運行與停止
1、創建項目文件。
6、當按下一個按鍵時,關閉燈,整個程序運行,再按一次,程序停止。
❿ C51單片機編程,按鍵控制流水燈
#include "reg51.h"
unsigned char led[]={0xfe,0xfd,0xfb,0xf7}; //LED燈的花樣數據
void delay(unsigned char time){ //延時函數
unsigned int j=15000;
for(;time>0;time--)
for(;j>0;j--);
}
void main(){
bit dir=0,run=0; //標志位定義及初始化
char i;
while(1){
switch (P0 & 0x0f){ //讀取鍵值
case 0x0e:run=1;break; //K1動作,設run=1
case 0x0d:run=0,dir=0;break; // K2動作,設run=dir=0
case 0x0b:dir=1;break; //K3動作,設dir=1
case 0x07:dir=0;break; //K4動作,設dir=0
}
if (run) //若run=dir=1,自上而下流動
if(dir)
for(i=0;i<=3;i++){
P2=led[i];
delay(200);
}
else
for(i=3;i>=0;i--){ //run=1,dir=0,自下而上流動
P2=led[i];
delay(200);
}
else P2=0xff; //若run=0,全部燈滅
}
}