當前位置:首頁 » 編程語言 » 獨立按鍵c語言程序
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

獨立按鍵c語言程序

發布時間: 2022-12-10 01:57:19

㈠ 獨立鍵盤用一個按鍵,控制一個燈的亮滅,用c語言怎麼寫程序

sbit KEY = P0^1;
sbit LED = P0^2;

int keyscan(void)
{
bit keyval=0;
if(KEY)
{
delay(30);//延時消抖
if(KEY)
{
keyval = ~keyval; //值取反

if(keyval )
{
LED = 1;//led亮
}
else
{
LED = 0;//led滅
}
}
}
}

㈡ 獨立按鍵C語言編程

#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[]=
{
0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f,
};
sbit key1=P3^4;

uchar num=0;
void delay(uint z);
void main()
{
while(1)
{
P2=0xfe;
P0=table[num];
delay(50);

if(key1==0)
{
while(!key1);
num++;
};

if(num==10)
{
num=0;
};
}
}

void delay(uint z)
{
while(z--);
}

㈢ 怎麼用C語言實現51單片機獨立按鍵跳出while(1)死循環 執行其他循環

while(1)語句只能用在主程序,而且只要用一次。如果子程序也用,必須有條件判斷語句,跟一個return語句返回。
再說你的三個子程序,既然用for控制了循環次數了,為什麼要用while(1)呢?而且明明知道是死循環還用?三個子程序都把那個while(1)刪掉就行了!

㈣ c語言 怎樣用兩個獨立按鍵控制一位數碼管顯示 就是按下其中一個按鍵就加1 按下另一個按鍵就減1 0~9顯示

這個實現是很容易的,定義兩個鍵,一個為加,一個為減,數碼管因為只有一個,所以可以用靜態顯示。程序和模擬圖如下:

#include<reg51.h>

#define uchar unsigned char

uchar table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f};

sbit keyup=P3^0;

sbit keydn=P3^1;

main()

{

uchar i;

i=0;

while(1)

{

P1=table[i];

if(keyup==0)

{

i++;

while(keyup==0);

}

if(keydn==0)

{

if(i>0)i--;

while(keydn==0);

}

i%=10;

}

}

㈤ 51單片機C語言程序4個獨立按鍵實現對數碼管數字顯示的加減清零等

#include<reg52.h>
//P0是數碼管。P1是LED.P2是按鍵
sbitKEY_OUT_1=P2^3;
sbitKEY_OUT_2=P2^2;
sbitKEY_OUT_3=P2^1;
sbitKEY_OUT_4=P2^0;

#defineucharunsignedchar
#defineulintunsignedlong
#defineFrequency10//定時器中斷時間=f*T
#defineTime1//一個周期1ms
#defineTubeNumber6//數碼管個數
#defineKeyLine4//矩陣按鍵行數
#defineKeyColumn4//矩陣按鍵列數
//數碼管真值表
ucharcodeLED_Number[]={0x0C,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
//ucharcodeLED_Alphabet[]={0x88,0x83,0xC6,0xA1,0x86,0x8E,0x89,0xC7,0x8C,0xC1,0x91,0x9C};
/*0~9
A~F(b、d為小寫)HLPUyo*/
ucharLED_Buff[TubeNumber]={0xff,0xff,0xff,0xff,0xff,0xff};
/*數碼管顯示緩沖區,0xff確保初始時都不亮.
不可寫成ucharcodeLED_Buff[]。code定義變數寫入room,不可修改*/
//矩陣按鍵編號到標准盤碼的映射表
ucharcodeKeyCodeMap[4][4]={
(0x31,0x32,0x33,0x26),//數字鍵1、數字鍵2、數字鍵3、向上鍵
(0x34,0x35,0x36,0x25),//數字鍵4、數字鍵5、數字鍵6、向左鍵
(0x37,0x38,0x39,0x28),//數字鍵7、數字鍵8、數字鍵9、向下鍵
(0x30,0x1B,0x0D,0x27)};//數字鍵0、ESC鍵、回車鍵、向右鍵
ucharStaFlag[KeyLine][KeyColumn]={(1,1,1,1),(1,1,1,1),(1,1,1,1),(1,1,1,1)};//按鍵是否穩定標志
voidStartTime0();
voidTubeDisplay(ulintsec);
ulintpow(x,y);
voidTubeScan();
voidKeyAction(ucharkeycode);
voidKeyDriver();
voidKeyScan();
voidmain()
{
P1=0x08;//使能U3,選擇數碼管。
StartTime0();
while(1)KeyDriver();
}
//定時器0啟動函數
voidStartTime0()
{
EA=1;
ET0=1;
TMOD=0x01;
TH0=(65536-Time*100)/256;
TL0=(65536-Time*100)%256;
PT0=1;
/*定時器0優先中斷控制位。
IP這個寄存器的每一位,表示對應中斷的搶占優先順序,每一位的復值都是0,當我們把某一位設置為1的時候,這一位優先順序就比其它位的優先順序高了。
比如我們設置了PT0位為1後,當單片機在主循環或其他中斷程序執行時,一旦TO發生中斷,作為更高優先順序,程序馬上執行T0.若在T0程序執行時,
其他中斷程序發生中斷,仍執行TO直到T0中斷結束後再執行其他程序。
*/
}
//中斷服務函數
voidTo_time0()interrupt1using0
{
staticucharcnt;//記錄TO中斷次數
// staticulintsec;//記錄經過秒速
//判斷是否溢出
if(TF0==1)
{
TF0=0;
TH0=(65536-Time*100)/256;
TL0=(65536-Time*100)%256;
}

if(cnt>=Frequency)
{
cnt=0;
//sec++;
// Tube_Display(sec);
TubeScan();
KeyScan();
}
}
//數碼管顯示函數
voidTubeDisplay(ulintnom)
{
ucharm=2;//小數部分位數
uchari;//傳輸索引
//秒速達到上限清零
if(nom>pow(10,TubeNumber-m))nom=0;
//分別傳輸小數部分和整數部分
for(i=0;i<m;i++)
LED_Buff[i]=LED_Number[nom/pow(10,i)%10];
for(i=0;i<(TubeNumber-m);i++)
LED_Buff[i+m]=LED_Number[nom/pow(10,i)%10];
//點亮小數點
LED_Buff[m]&=0x7f;
}
//平方運算函數
ulintpow(x,y)//x為底,為冪
{
ulintp,i=1;
//平方運算
for(i=1;i<=y;i++)
p*=x;
//輸出結果
returnp;
}
//數碼管動態函數
voidTubeScan()
{
staticuchari=0;//動態掃描索引
//關閉所有段選位,數碼管消隱
P0=0xff;
//for(i=0;i<Tube_number;i++)
P1=(P1&0xf8)|i;//位選索引賦值到P1口低3位
P0=LED_Buff[i];//緩沖區中的索引位置數據傳輸到P0口
if(++i>=TubeNumber)i=0;//索引遞增循環,遍歷整個緩沖區
}
//矩陣按鍵動作函數
voidKeyAction(ucharkeycode)
{
staticulintresult;
ulintnom=0;
//輸入數字0~9
if((keycode>=0x30)&&(keycode<=39))
{
nom=(nom*10)+(keycode-0x30);//十進制整體左移,新數進入各位
TubeDisplay(nom);
}
//輸入方向鍵
if((keycode>=0x25)&&(keycode<=28))
switch(keycode)
{
case0x26:result+=nom;nom=0;TubeDisplay(result);
case0x28:result-=nom;nom=0;TubeDisplay(result);
case0x25:result=1;result*=nom;nom=0;TubeDisplay(result);
case0x27:result=1;result/=nom;nom=0;TubeDisplay(result);
}
elseif(keycode==0x0d)TubeDisplay(result);//輸入回車鍵,輸出最終結果
elseif(keycode==0x1b)//輸入ESC鍵,清零
{
nom=result=0;
TubeDisplay(nom);
}
}
//矩陣按鍵驅動函數
voidKeyDriver()
{
ucharl,c;
staticucharbackup[KeyLine][KeyColumn]={(1,1,1,1),(1,1,1,1),(1,1,1,1),(1,1,1,1)};//按鍵值備份,保存前一次值
for(l=0;l<KeyLine;l++)
{
for(c=0;c<KeyColumn;c++)
{
if(backup[l][c]!=StaFlag[l][c])
{//檢測按鍵動作
if(backup[l][c]==1)//按鍵按下時執行
KeyAction(KeyCodeMap[l][c]);//調用動作函數
backup[l][c]=StaFlag[l][c];//刷新前一次備份值
}
}
}
}
//矩陣按鍵掃描函數
voidKeyScan()
{
ucharl=0;//矩陣按鍵掃描輸出索引
ucharc=0;//矩陣按鍵掃描列索引
ucharkeybuff[KeyLine][KeyColumn]={(0xff,0xff,0xff,0xff),(0xff,0xff,0xff,0xff),
(0xff,0xff,0xff,0xff),(0xff,0xff,0xff,0xff)};//矩陣按鍵掃描緩沖區
//將一行的四個按鍵移入緩沖區
for(l=0;l<KeyColumn;l++)
keybuff[l][c]=((0xfe|(P2>>(4+l))&0x01));
//按鍵消抖
for(l=0;l<KeyLine;l++)
{
if((keybuff[l][c]&0x0f)==0x00)//連續4次掃描都為0,判斷4*4ms內都是按下狀態,可認為按鍵已穩定按下
StaFlag[l][c]=0;
elseif((keybuff[l][c]&0x0f)==0x0f)//連續4次掃描都為1,判斷4*4ms內都是彈起狀態,可認為按鍵已穩定彈起
StaFlag[l][c]=1;
}
for(c=0;c<KeyColumn;c++)
{
switch(c)//根據索引,釋放當前輸出腳拉低下次的根據索引
{
case0:KEY_OUT_4=1;KEY_OUT_1=0;break;
case1:KEY_OUT_1=1;KEY_OUT_2=0;break;
case2:KEY_OUT_2=1;KEY_OUT_3=0;break;
case3:KEY_OUT_3=1;KEY_OUT_4=0;break;
default:break;
}
}
}

㈥ 單片機 用C語言怎麼編寫用一個按鈕,控制一盞燈的亮與滅的程序

讀取連接按鍵的IO口,判斷是否為低電平,如果是,延時(十毫秒左右可以),再次讀取IO口,判斷是否為低電平,如果是則表示有有效的按鍵按下,接著用while判斷等待按鍵釋放,然後讓連接led的IO口電平取反以控制其亮滅(是強電的燈可以通過此處控制繼電器的合、閉來控制燈的亮滅)。參考程序:if(key==0){delayms(10);if(key==10){while(key==0);//等待按鍵釋放,IO口恢復高電平led=!led;//按鍵控製程序}}

㈦ 51單片機 ,用C語言編程 通過獨立按鍵控制蜂鳴器和靜態數碼管,

1.數碼管前三位顯示一個跑表,從000到999之間以1%秒速度運行,當按下一個獨立鍵盤時跑錶停止,松開手後跑表繼續運行。(用定時器設計表)。

code:

#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int

sbit key1 = P3^4;
sbit la = P2^6;
sbit wela = P2^7;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
uint num;
uchar , shi, ge, flag = 0,t0 = 0;

void delay(uchar z);
void display(void);

void main(void)
{
num = 0;
P3 = 0xff;
TMOD = 0x01;
TH0 = (65536-10000) / 256;
TL0 = (65536-10000) % 256;
EA = 1;
ET0 = 1;
TR0 = 1;

while(1) {
if(key1 == 0) {
delay(5);
if(key1 == 0) {
flag = 1;
}
while(!key1);
delay(5);
while(!key1);
}

display();
}
}

void display(void)
{
la = 1;
P0 = table[num / 100];
la = 0;
P0 = 0xff;
wela = 1;
P0 = 0xfe;
wela = 0;
delay(1);

la = 1;
P0 = table[num % 100 / 10];
la = 0;
P0 = 0xff;
wela = 1;
P0 = 0xfd;
wela = 0;
delay(1);

la = 1;
P0 = table[num % 10];
la = 0;
P0 = 0xff;
wela = 1;
P0 = 0xfb;
wela = 0;
delay(1);
}
void delay(uchar z)
{
uchar

㈧ 請問,用四個獨立按鍵來製作簡易密碼鎖C語言程序該怎麼編寫

這個可以模擬那種撥碼形式的密碼鎖方式來設計,比如OFO共享單車的撥碼方式。
#include<reg51.h>
#define uchar unsigned char
uchar mima[4]={1,2,3,4};
uchar keymm[4]={0,0,0,0};
sbit key1=P1^0;
sbit key2=P1^1;
sbit key3=P1^2;
sbit key4=P1^3;
sbit led=P1^4;
bit flag=0;
void delay(uchar a)
{
uchar i;
while(a--)for(i=0;i<120;i++);
}
main()
{
uchar i;
led=1;
while(1)
{
if(key1==0)
{
while(key1==0);
keymm[0]++;
keymm[0]%=10;
}
if(key2==0)
{
while(key2==0);
keymm[1]++;
keymm[1]%=10;
}
if(key3==0)
{
while(key3==0);
keymm[2]++;
keymm[2]%=10;
}
if(key4==0)
{
while(key4==0);
keymm[3]++;
keymm[3]%=10;
}
for(i=0;i<4;i++)
{
if(keymm[i]!=mima[i])break;
if(i==3)flag=1;
}
if(flag)
{
i=10;
while(i--)
{
led=~led;
delay(100);
}
flag=0;
}
}
}

㈨ c語言獨立按鍵控製程序復位

第一,直接使用硬體來復位,將原本要接到P3.3的電平接到硬體復位上,當然需要一定的設計
第二,還是硬體,直接將此電平接到看門狗電路上
第三,軟體,前提是你的單片機支持軟體復位(包括直接復位和內置的看門狗)