導航:首頁 > 操作系統 > 基於單片機的按鍵

基於單片機的按鍵

發布時間:2022-12-09 21:48:10

單片機的獨立按鍵

#include<reg51.h> // 4*4 按鍵+數碼管模擬,可以參考。

#define uchar unsigned char

uchar temp;

int key1,key,disbuf;// 此表為 LED 的字模 0 1 2 3 4 5 6 7 8 9 a b c d e f

unsigned char code LED7Code[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};

unsigned char ledx[8];

bit s0,s1;

void delay(uchar z)

{

uchar i,j;

for(i=0;i<120;i++)

for(j=0;j<z;j++);

}

void scan() //要是按鍵了,掃描鍵盤編碼值

{

P1=0xF0;

delay(1);

temp=P1;

switch(temp)

{

case 0xe0: key1=0;

break;

case 0xd0: key1=1;

break;

case 0xb0: key1=2;

break;

case 0x70: key1=3;

break;

}

P1=0x0f;

delay(1);

temp=P1;

switch(temp)

{

case 0x0E: key=key1+0;

break;

case 0x0D: key=key1+4;

break;

case 0x0B: key=key1+8;

break;

case 0x07: key=key1+12;

break;

default : key=-1;

}

if((key1+1)&&(key+1)) disbuf=key;

}

void ejjc() //判斷是否按鍵

{

P1=0xF0;

if(P1!=0xF0) { scan();s0=1;}

else { s0=0; s1=1;}

}

void main()

{

uchar i;

while(1)

{

ejjc();

if(s0==1 && s1==1)

{

s0=0;s1=0;

for(i=0;i<8;i++)

{ ledx[i]=ledx[i+1]; ledx[8]=disbuf; }

}

P0=0xff;

P2=LED7Code[ledx[0]];

P0=0xfe;

delay(5);

P0=0xff;

P2=LED7Code[ledx[1]];

P0=0xfd;

delay(5);

P0=0xff;

P2=LED7Code[ledx[2]];

P0=0xfb;

delay(5);

P0=0xff;

P2=LED7Code[ledx[3]];

P0=0xf7;

delay(5);

P0=0xff;

P2=LED7Code[ledx[4]];

P0=0xef;

delay(5);

P0=0xff;

P2=LED7Code[ledx[5]];

P0=0xdf;

delay(5);

P0=0xff;

P2=LED7Code[ledx[6]];

P0=0xbf;

delay(5);

P0=0xff;

P2=LED7Code[ledx[7]];

P0=0x7f;

delay(5);

}

}

⑵ 單片機按鍵功能

按鍵按照結構原理可分為兩類,一類是觸點式開關按鍵,如機械式開關、導電橡膠式開關等;另一類是無觸點式開關按鍵,如電氣式按鍵,磁感應按鍵等。前者造價低,後者壽命長。目前,微機系統中最常見的是觸點式開關按鍵。


2.輸入原理



在單片機應用系統中,除了復位按鍵有專門的復位電路及專一的復位功能外,其它按鍵都是以開關狀態來設置控制功能或輸入數據的。當所設置的功能鍵或數字鍵按下時,計算機應用系統應完成該按鍵所設定的功能,鍵信息輸入是與軟體結構密切相關的過程。

對於一組鍵或一個鍵盤,總有一個介面電路與CPU相連。CPU可以採用查詢或中斷方式了解有無將鍵輸入,並檢查是哪一個鍵按下,將該鍵號送入累加器ACC,然後通過跳轉指令轉入執行該鍵的功能程序,執行完後再返回主程序

⑶ 51單片機 按鍵原理~

p2口A1 A2 A3 A4輸出4位供154解碼,解碼後Yx有效輸出低,相應三極體導通,Cx相應輸出高。當C1為高時,KEY檢測到高即C1對應鍵按下,其餘同理。

⑷ 基於單片機的單按鍵實現電機正反轉控制,如何實現最好有C語言程序代碼,主要是Main函數 謝謝

/*基於雙轉鏡片的步進電機控制的程序說明*/

/*FP20、FP21、FP22、FP23分別接步進電機的A、B、C、D四相*/
/*FP10、FP11、FP12分別接主機控制的ON/OFF(0/1)、方向(0正轉/1反轉)、循環變速(0有效)*/
/*變數定義*/
unsigned int motorenb=0;
unsigned int ccw=0;
unsigned int su_keyenb=0;
unsigned int su=2;
unsigned int su_cv=0;
unsigned int su_num=26;
unsigned int wfa=0;
/*變數定義結束*/
/*中斷函數*/
__interrupt ints (void) //中斷入口 ;1ms
{
unsigned int a,b,c,d;
FGIE=0;//關閉總中斷
if(FTC0IRQ) //一次定時1mS
{
FTC0IEN=0;//禁止TC1中斷
FTC0IRQ=0;//清中斷請求標志位
FTC0IEN=1;//開TC1中斷
if(motorenb==1)
{
su_cv++;
if(su_cv>=su_num)
{
su_cv=0;
if(ccw==1) //正轉
{
a=wfa;
a++;
if(a>7) a=0;
wfa=a;
}
else if(ccw==0)//反轉
{
a=wfa;
if(a==0) a=8;
a-=1;
wfa=a;
}
switch(a)
{
case 0: FP23=0;
FP22=0;
FP21=1;
FP20=1;
break;
case 1: FP23=0;
FP22=0;
FP21=1;
FP20=0;
break;
case 2: FP23=0;
FP22=1;
FP21=1;
FP20=0;
break;
case 3: FP23=0;
FP22=1;
FP21=0;
FP20=0;
break;
case 4: FP23=1;
FP22=1;
FP21=0;
FP20=0;
break;
case 5: FP23=1;
FP22=0;
FP21=0;
FP20=0;
break;
case 6: FP23=1;
FP22=0;
FP21=0;
FP20=1;
break;
case 7: FP23=0;
FP22=0;
FP21=0;
FP20=1;
break;
}
}
}
else P2=0X00;
}
}
/*主函數*/
void main(void)
{
FP20M=1;
FP21M=1;
FP22M=1;
FP23M=1;
FP10M=0;
FP12M=0;
P2UR=0XFF;
P1UR=0XFF;
/*TC0作為計時器*/
FTC0IEN=0;//禁止TC0中斷
FTC0ENB=0;//禁止TC0
FPWM0OUT=0;//禁止PWM1
FTC0OUT=0;//禁止TC0輸出
FALOAD0=1;//TC0自動重裝
FTC0CKS=0;//選用內部時鍾
FTC0RATE0=1;//設置TC0分頻為Fcpu/32
FTC0RATE1=1;
FTC0RATE2=0;
TC0C=0xF3;//給TC0賦初值,TC0C=256-(1mS*16M/4/32)
TC0R=0xF3;//給TC0賦自動重裝值
FTC0IRQ=0;//清TC0中斷標志位
FTC0IEN=1;//使能TC0中斷
FGIE=1;//開總中斷
FTC0ENB=1;//開TC0
while(1)
{
WDTR=0x5A;
if(FP10==0) motorenb=1;
else motorenb=0;
if(FP12==0)ccw=1;
else ccw=0;
if(FP11==1) su_keyenb=1;
if(su_keyenb==1)
{
if(FP11==0)
{
su_keyenb=0;
su++;
if(su>2) su=0;
switch(su)
{
case 0 : su_num=26;
break;
case 1 : su_num=14;
break;
case 2 : su_num=6;
break;
}
}
}
}
}
給你做個參考,我自己用的,試過了,你把IO口改下,定時器也改成你的型號的

⑸ 想做一個基於51單片機按鍵計數用LCD1602顯示的編程0-99

加上這些東西,將顯示語句換成1602_display(i)即可,
當然你可以將其改為只顯示2個數字
sbit rw=P1^4;
sbit rs=P1^3;
sbit lcden=P1^5;
#define db P2

void write_com(uchar com)//液晶屏寫命令

{
db=com;
rs=0;
rw = 0;
lcden=0;
Delay1ms(12);
lcden=1;
Delay1ms(12);
lcden=0;
}

void write_date(uchar date)//液晶屏寫數據
{
db=date;
rs=1;
rw = 0;
lcden=0;
Delay1ms(12);
lcden=1;
Delay1ms(12);
lcden=0;
}
void init2()//液晶屏初始化
{

rw=0;
write_com(0x38);
Delay1ms(12);
write_com(0x0f);
Delay1ms(12);
write_com(0x06);
Delay1ms(12);
write_com(0x01);
Delay1ms(12);
}

void 1602_display(uchar temp) //液晶顯示一個8 位二進制數
{
uchar A1,A2,A3;
A1=temp/100;//分離百位、十位、個位
A2=temp/10%10;
A3=A2t%10;
write_com(0x80);//第1行,第1字
write_date(A1+0x30);
Delay1ms(1);
write_date( A2+0x30);
Delay1ms(1);
write_date(A3+0x30);
Delay1ms(1);
}

⑹ 請幫我寫一個基於51單片機按鍵指示程序 c語言!!!!

;程序如下:
ORG 0000H
MOV C, P1.7
ANL C, P1.6
ANL C, P1.5
ANL C, P1.4
MOV P1.0, C
SJMP 0000H
-----------------------------
#include <reg51.h>
main()
{
unsigned int aaa;
while(1) {
aaa = P1;
aaa = aaa / 16;
if (aaa < 15) P1 = 0xfe;
else P1 = 0xff;
}
}
;完

⑺ 單片機按鍵怎麼實現長按和短按和組合鍵功能

是在實物開發板上實現嗎?
長按和短按很好實現,當檢測到有按鍵按下了,就開始計時,用定時器,檢測到按鍵松開了,停止計時,然後根據計時的時間長短,確定是長按還是短按,比如,時間小於0.5秒為短按,超過3秒為長按,其餘時間為無效,不夠長按時間,就為無效按鍵,也不算是短按的。這樣可以排除是隨意按鍵的可能。
組合鍵就好辦了,檢測到同時按兩個,三個,就為組合鍵,至於是什麼功能,那由你自己定義了。

⑻ 單片機實現按鍵功能函數

#include<reg51.h>
#defineucharunsignedchar
uchardat;
sbitkey1=P1^0;
sbitkey2=P1^1;
sbitkey3=P1^2;
main()
{
bitflag=0;
while(1)
{
if(key1==0)
{
while(key1==0);
flag=~flag;
}
if(key2==0)
{
while(key2==0);
if(flag)dat++;
}
if(key3==0)
{
while(key3==0);
if(flag(dat--);
}
P0=dat;
}
}

⑼ 單片機按鍵進行菜單選擇的編程思想

有以下幾種情況:
1.循環查詢按鍵。當按鍵按第一次時間,進入第一層循環查詢語句內部,執行恢復。不跳出該層循環,繼續查詢按鍵。當第二次按下時間,進入第二層循環查詢語句內部,執行暫停。循環結束。若想反復暫停和恢復,就在外面再加一層while(1)類似的死循環,反復執行其內部的兩層循環查詢語句。
2.用一個標志變數,記住按鍵的狀態。初始化為個值,如「暫停」,按鍵之後檢查標志變數,是「暫停」就執行「恢復」,再讓它變為「恢復」說明當前已經執行了恢復。反之亦然。
3.掉電暫停。這樣需要按鍵能觸發cpu工作。所以,需要按鍵接到外部中斷上面。中斷後可以恢復cpu工作。在中斷中再判斷是否要讓cpu掉電與否。
不知道這種方法你能接受不?還是用外部中斷。此按鍵觸發中斷後,關掉所有其他的中斷,也即ea=0(最好先用個變數記住ea,方便恢復),然後就一直在中斷中等待該按鍵第二次按下再恢復ea,最後退出中斷。

⑽ 基於51單片機的按鍵計數設計,4位,0到9999

數碼管有四位一體的,只用一個就行了,你這用兩個二位一體的數碼管,電路就顯得有些亂。
還有,你那數碼管的段控端少接一條導線,就是數碼管的G端也要連線哪。
更重要的是,共陽數碼管位控端用三極體驅動,當寫程序掃描時,數碼管不亮。

閱讀全文

與基於單片機的按鍵相關的資料

熱點內容
dvd光碟存儲漢子演算法 瀏覽:757
蘋果郵件無法連接伺服器地址 瀏覽:962
phpffmpeg轉碼 瀏覽:671
長沙好玩的解壓項目 瀏覽:142
專屬學情分析報告是什麼app 瀏覽:564
php工程部署 瀏覽:833
android全屏透明 瀏覽:732
阿里雲伺服器已開通怎麼辦 瀏覽:803
光遇為什麼登錄時伺服器已滿 瀏覽:301
PDF分析 瀏覽:484
h3c光纖全工半全工設置命令 瀏覽:141
公司法pdf下載 瀏覽:381
linuxmarkdown 瀏覽:350
華為手機怎麼多選文件夾 瀏覽:683
如何取消命令方塊指令 瀏覽:349
風翼app為什麼進不去了 瀏覽:778
im4java壓縮圖片 瀏覽:362
數據查詢網站源碼 瀏覽:150
伊克塞爾文檔怎麼進行加密 瀏覽:890
app轉賬是什麼 瀏覽:163