⑴ c51單片機按鍵
1.設置一個狀態變數,如flag,定義flag=0為開狀態,flag=1為關狀態。
2.因為是按鍵(不是開關),所以實際上單片機讀取的應該是脈沖形式的輸入。設按鍵接單片機P01引腳,故可採用以下程序實現按鍵掃描
if(P01==0)//按下按鍵,進入下降沿
{
delay2();//20ms延時去按鍵前抖動
while(P01==0);//等待上升沿到 來,即按鍵彈起
flag=~flag;//flag取反,實現狀態切換
}
void delay2()//20ms延時子程序
{
unsigned char i,k;
for(i=0;i<100;i++)
for(k=0;k<100;k++);
}
註:根據按鍵的具體接法,若按下按鍵向單片機輸入低電平,則採用以上程序;若按下按鍵向單片機輸入高電平,則將兩處P01==0均改為P01==1。
⑵ 單片機按鍵顯示
你這個不顯示0才怪,你這個會一直在MAIN 段循環,不會執行下面的程序。你用鍵盤掃描程序吧!掃描到那個按鍵按下就跳轉到相應的顯示程序,再返回到鍵盤上面程序。
還有你按下1到F1這一段沒有錯,但是在這一段以後馬上又返回到第一段程序去顯示0了。呵呵,多想想吧!!
⑶ 單片機按鍵
ORG 0000H
AJMP MAIN
ORG 000BH
AJMP GT0
ORG 0080H
MAIN:MOV P0,#00H ;滅燈
MOV IE,#82H ;開中斷
MOV SCON,#00H ;串列發送模式
MOV TMOD,#01H ; T0方式1定時
MOV TH0,#3CH ;50毫秒初值
MOV TL0,#0B0H
MOV DPTR,#TAB ;表地址入口
CLR A
MOV 30H,A ;小時
MOV 31H,A ; 分鍾
MOV 32H,A ; 秒
MOV 33H,#1 ; 星期
MOV 34H,A ; 二進制加一演示
MOV R0,#20 ; 1秒中斷次數
SETB TR0 ; 啟動T0
M0:LCALL JIAN ; 調用查鍵
LCALL XIANSHI ;調用顯示
SJMP M0
GT0:PUSH ACC
MOV TH0,#3CH
MOV TL0,#0B6H ;重新賦值佔了6個機器周期,0B0H改為0B6H
DJNZ R0,RET0 ;不夠20次返回
MOV R0,#20
INC 32H ; 秒加一
INC 34H ;二進制演示加一,到255加一為0
MOV SBUF,34H ;串列發送
JNB TI,$ ;等待發送結束
CLR TI ;清楚發送標志
MOV A,32H
CJNE A,#60,RET0 ;比較秒是否到60
MOV 32H,#0 ;到60改為0
INC 31H ;分鍾加一
MOV A,31H
CJNE A,#60,RET0 ;比較分鍾是否到60
MOV 31H,#0 ; 到60改為0
INC 30H ;小時加一
MOV A,30H
CJNE A,#24,RET0 ;比較小時是否到24
MOV 30H,#0 ;到24改為0
INC 33H ;星期加一
MOV A,33H
CJNE A,#8,RET0 ;比較星期是否到8
MOV 33H,#1 ;到8改為1
RET0:POP ACC
RETI
XIANSHI:MOV A,30H ;小時顯示程序段
MOV B,#10
DIV AB
MOVC A,@A+DPTR ;十位
MOV P1,A
SETB P0.0 ;共陽極數碼管
DJNZ R1,$
CLR P0.0
MOV A,B
MOVC A,@A+DPTR ;個位
MOV P1,A
SETB P0.1
DJNZ R1,$
CLR P0.1
MOV A,31H ;分鍾顯示程序段
MOV B,#10
DIV AB
MOVC A,@A+DPTR ; 十位
MOV P1,A
SETB P0.2
DJNZ R1,$
CLR P0.2
MOV A,B
MOVC A,@A+DPTR ;個位
MOV P1,A
SETB P0.3
DJNZ R1,$
CLR P0.3
MOV A,32H ;秒顯示程序段
MOV B,#10
DIV AB
MOVC A,@A+DPTR ;十位
MOV P1,A
SETB P0.4
DJNZ R1,$
CLR P0.4
MOV A,B
MOVC A,@A+DPTR ;個位
MOV P1,A
SETB P0.5
DJNZ R1,$
CLR P0.5
MOV A,33H ;星期顯示程序段
MOVC A,@A+DPTR
MOV P1,A
SETB P0.6
DJNZ R1,$
CLR P0.6
RET
JIAN:PUSH ACC
PUSH PSW
JB P2.0,M1 ;查鍵,改分鍾數
J0:LCALL XIANSHI ;調顯示
JNB P2.0,J0 ;按鍵松開了才加一
INC 31H
MOV A,31H
CJNE A,#60,RET1 ;分鍾加到60就歸零
MOV 31H,#0
SJMP RET1
M1:JB P2.1,M2 ;修改小時鍵
J1:LCALL XIANSHI
JNB P2.1,J1
INC 30H
MOV A,30H
CJNE A,#24,RET1 ;小時加到24就歸零
MOV 30H,#0
M2:JB P2.2,RET1 ; 修改星期鍵
J2:LCALL XIANSHI
JNB P2.2,J2
INC 33H
MOV A,33H
CJNE A,#8,RET1 ;星期加到8就改為1
MOV 33H,#1
RET1:POP PSW
POP ACC
RET
TAB:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
END
⑷ 單片機按鍵問題
1.中斷方式(這個比較可靠)
一般程序按鍵按下後
燈亮
然後按鍵松開燈還是亮的
採用的是邊沿檢測,即有電平跳變就改變輸出。
如果想按鍵按住的時候燈亮,不按的時候燈不亮
採用電平觸發,即當電平維持是正或者負的時候才穩定輸出。
2.也可以用查詢方式
比如
一般程序按鍵按下後
燈亮
然後按鍵松開燈還是亮的
if(P1^1==0)
//判斷是否按下鍵盤
{
delay10ms();
//延時,軟體去干擾
if(P1^1==0)
//確認按鍵按下
{
count++;
//按鍵計數加1
if(count==1)
//第一次按下亮,第二次按下滅
{
count=0;
//將count清零
}
}
while(P1^1==0);//按鍵鎖定.
}
P1^2=count;//輸出顯示
如果想按鍵按住的時候燈亮,不按的時候燈不亮
if(P1^1==1)
{
P1^2=1;
while(P1^1);
P1^2=0;
}
P1^1是按鍵採集管腳,P1^2是輸出顯示管腳。當然,前面得加去抖動。
你試試。
⑸ 求問下單片機開發板上的獨立按鍵是哪幾個
單片機開發板上的獨立按鍵是哪幾個,不同板子位置是不一樣的,但一般而言,出來4*4矩陣鍵盤之外的其他按鍵都是獨立按鍵。