當前位置:首頁 » 編程語言 » 單片機鍵盤c語言

單片機鍵盤c語言

發布時間: 2022-08-06 16:18:04

⑴ 單片機鍵盤去抖動c語言程序!!!

使用這個到板子裡面:

  • #include <reg52.h>

  • sbit ADDR0 = P1^0;

  • sbit ADDR1 = P1^1;

  • sbit ADDR2 = P1^2;

  • sbit ADDR3 = P1^3;

  • sbit ENLED = P1^4;

  • sbit KEY1 = P2^4;

  • sbit KEY2 = P2^5;

  • sbit KEY3 = P2^6;

  • sbit KEY4 = P2^7;

  • unsigned char code LedChar[] = { //數碼管顯示字元轉換表0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E};

  • void delay();

  • void main(){

  • bit keybuf = 1; //按鍵值暫存,臨時保存按鍵的掃描值

  • bit backup = 1; //按鍵值備份,保存前一次的掃描值

  • unsigned char cnt = 0; //按鍵計數,記錄按鍵按下的次數

  • ENLED = 0; //選擇數碼管 DS1 進行顯示

  • ADDR3 = 1;

  • ADDR2 = 0;

  • ADDR1 = 0;

  • ADDR0 = 0;

  • P2 = 0xF7; //P2.3 置 0,即 KeyOut1 輸出低電平

  • P0 = LedChar[cnt]; //顯示按鍵次數初值

  • while (1){

  • keybuf = KEY4; //把當前掃描值暫存

  • if (keybuf != backup){ //當前值與前次值不相等說明此時按鍵有動作

  • delay(); //延時大約 10ms

  • if (keybuf == KEY4){ //判斷掃描值有沒有發生改變,即按鍵抖動

  • if (backup == 0){ //如果前次值為 0,則說明當前是彈起動作

  • cnt++; //按鍵次數+1

  • //只用 1 個數碼管顯示,所以加到 10 就清零重新開始

  • if (cnt >= 10){

  • cnt = 0;

    }

    P0 = LedChar[cnt]; //計數值顯示到數碼管上

    }

  • backup = keybuf; //更新備份為當前值,以備進行下次比較
    }
    }
    }
    }

  • /* 軟體延時函數,延時約 10ms */

  • void delay(){

  • unsigned int i = 1000;

  • while (i--);
    }

⑵ 關於單片機c語言4*4小鍵盤程序

借用一下你的程序~
char
keypad_scan()
{
char
key,i;
P2=0xf0;
//定義高四位輸出,低四位輸入
while(P2!=0xf0)

//等待按鍵按下
do
{
for(i=0;i<3;i++)
{
P2=ksp[i];
//掃描出是哪一行(列)
-->但錯了,變成賦值運算了~
if(P2!=ksp[i])
//掃描出是哪一列(行)
-->但錯了~
{
delay();//延時消抖後再判斷該行有無鍵按下
key=P2;
//掃描出按鍵
-->本可以到這里了就可以直接得出按鍵值的~~~~
if(key!=ksp[i])
return
(key);
}
}
}while(1);
//是死循環,退不出來~~~
}
思路很好~~編得有點亂~~~

⑶ 單片機中獨立鍵盤和矩陣鍵盤如何一起使用 請用C語言寫個程序說明,謝謝。

這個很好處理呀,比如以下舉例,獨立+矩陣,實現獨立按鍵相當於類似SHIFT作用的效果。
#include<reg51.h>
#define uchar unsigned char
uchar tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //0到f
uchar keyval,num;
sbit skey=P1^0; //獨立鍵P1.0
void delay(uchar a)
{
uchar i,j;
for(i=0;i<a;i++)
for(j=0;j<125;j++);
}
uchar kbscan(void) //矩陣鍵掃描程序
{
unsigned char sccode,recode;
P3=0x0f; //發0掃描,列線輸入
if ((P3 & 0x0f) != 0x0f) //有鍵按下
{
delay(20); //延時去抖動
if ((P3&0x0f)!= 0x0f)
{
sccode = 0xef; //逐行掃描初值
while((sccode&0x01)!=0)
{
P3=sccode;
if((P3&0x0f)!=0x0f)
{
recode=(P3&0x0f)|0xf0;
while((P3&0x0f)!=0x0f);//等待鍵抬起
return((~sccode)+(~recode));
}
else
sccode=(sccode<<1)|0x01;
}
}
}
return 0; //無鍵按下,返回0
}
void getkey(void)
{
unsigned char key;
key=kbscan();
if(key==0)
{
return;
}
switch(key)
{
case 0x11:keyval=7;break;
case 0x12:keyval=4;break;
case 0x14:keyval=1;break;
case 0x18:keyval=10;break;
case 0x21:keyval=8;break;
case 0x22:keyval=5;break;
case 0x24:keyval=2;break;
case 0x28:keyval=0;break;
case 0x41:keyval=9;break;
case 0x42:keyval=6;break;
case 0x44:keyval=3;break;
case 0x48:keyval=11;break;
case 0x81:keyval=12;break;
case 0x82:keyval=13;break;
case 0x84:keyval=14;break;
case 0x88:keyval=15;break;
default:keyval=0xff;break;
}
//以下處理獨立按鍵
if(skey==0)
{
if(keyval!=0xff)keyval+=16; //如果獨立鍵按下,鍵值加16
while(skey==0); //等待獨立鍵釋放
}
}
void t0isr() interrupt 1
{
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
switch(num)
{
case 0:P2=0x01;break;
case 1:P2=0x02;break;
case 2:P2=0x04;break;
case 3:P2=0x08;break;
default:break;
}
if(keyval<16) P0=~tab[keyval]; //獨立鍵未按正常顯示
else P0=~(tab[keyval]|0x80); //獨立鍵按下顯示+DP
num++;
num&=0x03;
}
main()
{
TMOD=0x01;
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
TR0=1;
ET0=1;
EA=1;
while(1)
{
getkey();
}
}

⑷ 51單片機矩陣鍵盤(c語言) 求大神啊~

uchar
KeyScan(void)
{
static
uchar
k=0;
//由於函數在調用結束時k值已返回給函數,k作為局部變數即可
/////////
uchar
Trg,Trg1,Trg2,Cont1,Cont2;
uchar
ReadData1,ReadData2;
/////////
P3=0x0f;
ReadData1=P3^0x0f;
Trg1=ReadData1&(ReadData1^Cont1);
//觸發鍵
Cont1=ReadData1;
//長按鍵
/////////
P3=0xf0;
ReadData2=P3^0xf0;
Trg2=ReadData2&(ReadData2^Cont2);
Cont2=ReadData2;
Trg=Trg1+Trg2;
////////
switch(Trg)
{
case
0x81:{k=1;break;}
case
0x41:{k=2;break;}
case
0x21:{k=3;break;}
case
0x11:{k=4;break;}
case
0x82:{k=5;break;}
case
0x42:{k=6;break;}
case
0x22:{k=7;break;}
case
0x12:{k=8;break;}
case
0x84:{k=9;break;}
case
0x44:{k=10;break;}
case
0x24:{k=11;break;}
case
0x14:{k=12;break;}
case
0x88:{k=13;break;}
case
0x48:{k=14;break;}
case
0x28:{k=15;break;}
case
0x18:{k=16;break;}
default:{k=0;break;}
}
return(k);
}
//在主函數裡面直接調用keyboard()函數,直接返回鍵值;
然後在數碼管顯示。
好好的研究下這個鍵盤程序,
這種方式很程序很精煉、簡單
絕對可以調出來。

⑸ 鍵盤 單片機程序C語言

我吧我做的給你 我作成了

uchar KeyScan(void)//鍵盤掃描、、傳出鍵盤碼()鍵盤碼要先定義
{
uint8 temp,keyvalue;
keyup=1;//上下左右 中
keydown=1;
keyright=1;
keyleft=1;
keyok=1;
Keyboard_P2=0xff;
temp=Keyboard_P2;
temp=temp&0xf8;
//temp=0xb8;
if(temp!=0xf8)
{
Delay(50);//防抖動
if(temp!=0xf8)
{
switch(temp)
{
case 0x78: keyvalue= key_left;break;
case 0xb8: keyvalue=key_up; break;
case 0xd8: keyvalue=key_down; break;
case 0xe8: keyvalue=key_right; break;
case 0xf0: keyvalue=key_ok; break;
}
while(temp!=0xf8)
{
temp=Keyboard_P2;//防止按著不放
temp=temp&0xf8;
}
return keyvalue;
}

}

}

⑹ 求一段51單片機按鍵C語言程序詳解

P1.0、P1.1都控制 LED
試試下面程序:

#include <reg51.h>
sbit led = P1^0;
sbit key = P1^7;
void main()
{
while(1) led = key;
}

P1.1知道用

⑺ 通過鍵盤往單片機中輸入任意數字的C語言程序

我這有個AVR的矩陣鍵盤的識別程序、其中PORTA就相當於51里的P0一樣的埠的表示、PINA也是指的PORTA口、和PORTA的區別是PINA只能讀!其他都一樣的和51
/********************************************************
實驗七: 矩陣式鍵盤實驗
說明: 按按鍵K1-K16 數碼管顯示0-F的鍵碼
注意: K17-K19為獨立按鍵,使用這個程序是沒有反應的

CPU型號: ATMEGA128A
晶振頻率: 8MHZ
日期: 2011-3-12
聯系方法: [email protected]
********************************************************/
#include <iom128v.h>
#include <macros.h>
#define uchar unsigned char
#define uint unsigned int
void Delayus(uint US); //微秒延時子程序
void Delayms(uint MS); //毫秒延時子程序
uchar key_scan(void);
void init_io(void);
//共陽數碼管數字碼
uchar led_discode[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff};

uchar key_val=0;
//主函數
void main (viod)
{
uchar key_io;
init_io();
while(1)
{
PORTD=0XF0;
Delayms(5);
key_io=PIND & 0xf0;
if(key_io !=0xf0)
{
PORTD=0XF0;
Delayms(1);
key_io=PIND & 0xf0;
if(key_io !=0xf0)
{
key_val=key_scan();
key_val |= key_io;
}
switch(key_val)
{
case 0xee: key_val=0x00; break; //按鍵K1

case 0xde: key_val=0x01; break; //按鍵K2

case 0xbe: key_val=0x02; break; //按鍵K3

case 0x7e: key_val=0x03; break; //按鍵K4

case 0xed: key_val=0x04; break; //按鍵K5

case 0xdd: key_val=0x05; break; //按鍵K6

case 0xbd: key_val=0x06; break; //按鍵K7

case 0x7d: key_val=0x07; break; //按鍵K8

case 0xeb: key_val=0x08; break; //按鍵K9

case 0xdb: key_val=0x09; break; //按鍵K10

case 0xbb: key_val=0x0a; break; //按鍵K11

case 0x7b: key_val=0x0b; break; //按鍵K12

case 0xe7: key_val=0x0c; break; //按鍵K13

case 0xd7: key_val=0x0d; break; //按鍵K14

case 0xb7: key_val=0x0e; break; //按鍵K15

case 0x77: key_val=0x0f; break; //按鍵K16
} // switch(key_val)
} // if(key_io !=0xf0)

PORTD=0XF0;
//等待松開按鍵
key_io=PIND & 0xf0;
while(key_io !=0xf0)
{
key_io=PIND & 0xf0;
}
PORTC=led_discode[key_val]; //顯示按鍵碼
} // while(1)
}
void init_io(void)
{
DDRA=0XFF;//設置A口味輸出
PORTA=0XFF;

DDRB=0XFf;;//設置B口味輸出
PORTB=0XFF; //數碼管位控制

DDRC=0XFF; //數碼管段控制
PORTC=0X00;

DDRD=0X0F; //鍵盤介面
PORTD=0XF0;

DDRF=0X0E;
PORTF=0X0E;
PORTF&=0XF7; //鎖存關閉LED顯示

DDRB |=0X10; //PB4設為輸出
PORTB|=0X10; //關閉PB4外接的LED
}
uchar key_scan(void)
{
uchar m,temp=0xf7;
for(m=0;m<4;m++)
{
PORTD=temp | 0xf0;
Delayms(1);
if((PIND & 0XF0)!=0XF0)
return(temp & 0x0f);
temp>>=1;
}
}
/****************************************************
函數名稱: Delayus
功 能: 延時指定微秒(8M晶振)
參 數: US--延時的微秒數(大約,不是很精確,MS越大越准確)
返回值 : 無
/****************************************************/
void Delayus(uint US)
{
uint i;
US=US*5/4;
for( i=0;i<US;i++);
}
/****************************************************
函數名稱: Delayms
功 能: 延時指定毫秒(8M晶振)
參 數: MS--延時的毫秒數
返回值 : 無
通過軟體模擬反復實驗得到的數值
/****************************************************/
void Delayms(uint MS)
{
uint i,j;
for( i=0;i<MS;i++)
for(j=0;j<1141;j++);
}

⑻ 單片機鍵盤去抖動c語言程序!!!

這按鍵去抖,本來就不可能完全消除抖動,只是說能消除絕大部分抖動情況
你知道,毛刺出現的時間一定是多長么?你按下的時間也一定是多長么?
你能將這兩個時間精確到us級別么?哪怕是精確到us級別,仍然有極端現象出現
何況,這個兩個時間本身就是不確定的,我們只是找出這兩個時間的最可能范圍
將兩個時間的范圍進行區別
如果你還是覺得程序不合理,那麼好吧,你可以用一個數學的方法去研究和推導
直到你找到一個更高級的演算法,那麼你就可以改進它了
不過,一個51單片機,誰還會為幾乎可以忽略的事件,而專門浪費一大堆程序空間,
耗費一大段指令周期來實現這個演算法?
俗話說得好:過猶不及就是這個道理

熱點內容
tampermonkey腳本 發布:2025-01-22 18:53:17 瀏覽:116
windows7共享文件夾 發布:2025-01-22 18:53:17 瀏覽:478
如何調節安卓手機的內存 發布:2025-01-22 18:49:30 瀏覽:638
佳能相機存儲卡怎麼取消 發布:2025-01-22 18:40:59 瀏覽:568
天貓寶貝上傳 發布:2025-01-22 18:35:09 瀏覽:544
ipad如何登錄金鏟鏟安卓賬號 發布:2025-01-22 18:32:09 瀏覽:319
加密溝通 發布:2025-01-22 18:31:22 瀏覽:555
win7ftp用戶名和密碼設置 發布:2025-01-22 17:46:48 瀏覽:221
三表聯查的sql語句 發布:2025-01-22 17:27:13 瀏覽:418
安卓怎麼解壓分卷壓縮 發布:2025-01-22 17:24:59 瀏覽:721