導航:首頁 > 操作系統 > 單片機按鈕編碼

單片機按鈕編碼

發布時間:2025-05-24 12:21:58

Ⅰ 用匯編語言編寫一個按鈕控制8個流水燈的亮滅

51單片機匯編語言程序設計如下,實現通過按鍵控制8個流水燈的亮滅功能:

KEY被定義為P3.2埠,LED被定義為P1埠。

程序起始地址為0000H,跳轉到主程序MAIN。

主程序MAIN從0030H地址開始:

清除00H單元的內容。

將0FEH的值送入累加器A。

進入循環LOOP。

檢查P3.2埠的狀態,如果為低電平,跳轉到LOOP1。

如果P3.2埠為高電平,則執行下一條指令。

將0FFH的值送入LED埠。

跳轉到LOOP2。

進入LOOP2,檢查00H單元狀態,如果為高電平,則跳轉到LOOP2。

將0FFH的值送入P1埠。

右移累加器A的內容。

調用延時子程序DELAY。

返回到LOOP。

延時子程序DELAY從200H地址開始:

將200H送入R2。

進入循環DLY1。

將250H送入R3。

當R3不為0時,循環繼續。

R2減1,直到為0,跳出循環。

返回到調用處。

這個程序通過按鍵P3.2控制8個流水燈P1埠的亮滅,通過右移操作實現流水效果,並通過延時子程序實現一定的視覺效果。在實際應用中,可以根據需求調整延時子程序的延時時間,以適應不同的顯示效果要求。

在編寫和調試此類程序時,需要注意按鍵的抖動問題,以及單片機的時鍾頻率對延時時間的影響。此外,還可以通過增加更多的邏輯判斷,實現更加復雜的功能,比如增加計數器,實現流水燈的計數顯示,或者加入更多的控制邏輯,實現更復雜的燈光控制效果。

通過這種編程方式,可以實現對單片機的精細控制,滿足各種不同的應用需求。在實際應用中,這種編程方式還可以與外部設備或感測器結合,實現更加復雜的功能。

Ⅱ 一個按鍵怎麼實現兩個Led燈切換,就是按下第一個燈亮鬆手燈滅,再按一下第二個燈亮松平燈滅。單片機C

/*
按鍵位置:P0.1;
功能:1,當第一次按鍵按下,第一個燈亮,按鍵放開燈滅
2,當第二次按鍵按下,第二個燈亮,按鍵放開燈滅
3,重復執行前面兩個步驟
燈的位置:P2口;
*/
#include <reg51.h>
#define uint unsigned int
#define uchar unsigned char
sbit BUTTON=P0^1;//按鍵的位置
void DELAY(uint x)
{
uchar s,j;
for(s=0;s<x;s++)
for(j=0;j<114;j++);
}
void main()
{
uint led=0;
while(1)
{
if(BUTTON==0)
{
led++;
if(led==1)//第一次按鍵按下
{
P2=0XFE;//1111 1110 第一個燈亮
DELAY(500);//延時
while(BUTTON!=0)//等待按鍵放開
{
P2=0xff;/1111 1111燈滅
DELAY(500)//延時
}

}
if(led==2)//第二次按鍵按下
{
led=0;//要給次數初始化
P2=0XFC;//1111 1101第二個燈亮
DELAY(500);//延時
while(BUTTON!=0)//等待按鍵放開
{
P2=0xff;//1111 1111第二個燈滅
DELAY(500)//延時
}

}
}
}

Ⅲ 如何用單片機一個按鈕開關控制3個燈3種效果。流水。閃爍。還有一直亮。用keil編程。

下面是用C51編寫的簡單程序:
#include <reg51.h>
#include <intrins.h>
sbit io_Key = P1 ^ 1;
sbit led1 = P1 ^ 2;
sbit led2 = P1 ^ 3;
sbit led3 = P1 ^ 4;
unsigned char ucCount = 0;
bit flag05s = 0;
//---------------------------------
void delay125us(void) //@12.000MHz
{
unsigned char i;
i = 60;
while (--i);
}

void Timer0Init(void) //10毫秒@12MHz
{
TMOD &= 0xF0; //設置定時器模式
TMOD |= 0x01; //設置定時器模式
TL0 = 0xF0; //設置定時初值
TH0 = 0xD8; //設置定時初值
TR0 = 1; //開定時器0
ET0 = 1; //開定時器0中斷
EA = 1; //開總中斷
}
//T0中斷用來計數器溢出
void zd0(void) interrupt 1
{
TL0 = 0xF0; //設置定時初值
TH0 = 0xD8; //設置定時初值
if(++ucCount >= 50)
{
ucCount = 0;
flag05s = 1; //g_flag05s = isYes定時0.52秒到,用於測量周期延時
}

}

void main(void)
{
unsigned char CountTemp = 0, ucState = 0;
Timer0Init();

while(1)
{
//-------------------------------
//簡單的按鍵檢測程序:
io_Key = 1;
_nop_();
if( io_Key == 0 )
{
CountTemp = 0;
do
{
delay125us();
if( io_Key != 0 ) break;
} while(++CountTemp > 160); // 延時20ms去抖動

if(CountTemp > 160)//如果按鍵時間有效,改變狀態
{
switch(ucState)
{
case(0):
{
ucState = 1;

led1 = 0;
led2 = 0;
led3 = 0;
}
break;
case(1):
{
ucState = 2;
led1 = 0;
led2 = 0;
led3 = 0;
}
break;
case(2):
{
ucState = 0;
led1 = 0;
led2 = 1;
led3 = 1;
}
break;

}
while(io_Key == 0); //等待按鍵釋放
}

}
//------------------------------
//每0.5秒改變一下LED狀態
if(flag05s == 1)
{
flag05s = 0;
switch(ucState)
{
case(0):
{
led1 = !led1;
led2 = !led2;
led3 = !led3;
}
break;
case(1):
{
bit ledTemp = led1;
led1 = led2;
led2 = led3;
led3 = ledTemp;
}
break;
//LED常亮可以忽略改變LED狀態
/*
case(2):
{
led1 = 0;
led2 = 0;
led3 = 0;
}
break;
*/

}

}

}

}
//-----------------------------------------------
//上面程序中有很多地方可以優化,這里只是給出一個參考供學習。

Ⅳ 如何使用旋轉編碼開關

具有左轉,右轉,按下三個功能。4、5 腳是中間按下去的開關接線 1 2 3 腳 一般是中間2
腳接地,1、3 腳上拉電阻後,當左轉、右轉旋紐時,在1、3 腳就有脈沖信號輸出了。
著這是標准資料:

在單片機編程時,左轉和右轉的判別是難點,用示波器觀察這種開關左轉和右轉時兩個輸出
腳的信號有個相位差,見下圖:

由此可見,如果輸出1 為高電平時,輸出2 出現一個高電平,這時開關就是向順時針旋轉; 當輸
出1 為高電平,輸出2 出現一個低電平,這時就一定是逆時針方向旋轉.
所以,在單片機編程時只需要判斷當輸出1 為高電平時,輸出2 當時的狀態就可以判斷出是左
旋轉或是右旋轉了。
還有另外一種3 腳的,除了不帶按鈕開關外,和上面是一樣的使用。

參考:
#include "reg51.h"
#define uint unsigned int
sbit CodingsWitch_A=P1_1;
sbit CodingsWitch_B=P1_2;
uint CodingsWitchPolling()//
{
static Uchar Aold,Bold; //定義了兩個變數用來儲蓄上一次調用此方法是編碼開關兩引
腳的電平
static Uchar st; //定義了一個變數用來儲蓄以前是否出現了兩個引腳都為高電
平的狀態
uint tmp = 0;
if(CodingsWitch_A&&CodingsWitch_B)
st = 1; //
if(st) //如果st 為1 執行下面的步驟
{
if(CodingsWitch_A==0&&CodingsWitch_B==0) //如果當前編碼開關的兩個引腳
都為底電平執行下面的步驟
{
if(Bold) //為高說明編碼開關在向加大的方向轉
{
st = 0;
tmp++; //
}
if(Aold) //為高說明編碼開關在向減小的方向轉
{
st = 0;
tmp--; //設返回值
}
}
}
Aold = CodingsWitch_A; //
Bold = CodingsWitch_B; //儲
return tmp; //
}
//

Ⅳ 單片機 一個按鈕設置按一下加1 另一個按鍵按一下減1 求幫忙編寫程序

#include<reg52>
#define uchar unsigned char
#define uint unsigned int
sbit K1 = P1^4;
sbit K2 = P1^5;
uchar data K1state;
uchar data K2state;
uint data num,ntmp;
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x06f,0x77,0x7c,0x39,0x5e,0x79,0x71} ;
uchar data showIndex,indexTmp;
uchar data W[8];
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);//能使之延時接近1毫秒就成 無需精確
}
void main()
{
K1state = 0xFF;
K2state = 0xFF;
num = 0;
while(1)
{
delay(1);//每毫秒輪詢一回
//移位法,延時防抖
K1state = (K1state<<1);
K2state = (K2state<<1);
if(K1) K1state++;
if(K2) K2state++;
//檢查開關狀態
if(K1state==0x80) num++;
if(K2state==0x80) num--;
for(indexTmp=0,ntmp = num;indexTmp<=7;indexTmp++)
{
W[indexTmp] = num%10;
num /=10;
}
P0 = (0x01<<showIndex);//位選
P2 = table[W[showIndex]];//段選
showIndex++;
if(showIndex>=8)
showIndex=0;
}
}

看了你的全圖,修改後了,用Keil uVision 3或4都可以,編譯後可以查看對應的匯編代碼

程序稍大一點的,不會有人用匯編來給你蘑菇,匯編設計寫編碼太慢了,開發代價不值得

Ⅵ 十二、利用單片機、1個按鈕(注意是按鈕,不是開關)、8個LED發光二極體(水平排列),實現按鈕按下次數

原理圖如下:

希望對你有所幫助

閱讀全文

與單片機按鈕編碼相關的資料

熱點內容
google瀏覽器無法定位伺服器地址 瀏覽:471
伺服器通道如何分區 瀏覽:528
cat命令顯示用戶主目錄中的文件 瀏覽:604
程序員哪有可愛 瀏覽:837
郴州app開發哪裡好 瀏覽:943
一隻眼弱視程序員 瀏覽:577
android全屏無標題 瀏覽:117
梁的非加密區箍筋計算 瀏覽:966
linux7關閉防火牆 瀏覽:813
如何執行安全演算法 瀏覽:729
設計模式程序員水平 瀏覽:917
最帥程序員愛德華 瀏覽:933
php並發框架 瀏覽:397
看健身app哪個好 瀏覽:33
php返回http狀態碼 瀏覽:48
ftp伺服器怎麼設置不同的用戶 瀏覽:143
為什麼視頻加密不能看 瀏覽:537
哪個銀行app存定期利息高 瀏覽:710
百度網盤不付費解壓 瀏覽:613
python數據分析與網路 瀏覽:120