標題:
用單片機獨立按鍵實現(xiàn)led燈的亮滅程序,重點是實現(xiàn)兩種模式:單次掃描和連續(xù)掃描
[打印本頁]
作者:
wangmengxu
時間:
2022-11-21 09:41
標題:
用單片機獨立按鍵實現(xiàn)led燈的亮滅程序,重點是實現(xiàn)兩種模式:單次掃描和連續(xù)掃描
我之前跟著開發(fā)板學習51單片機,然后學著學著,自己練習只看原理圖和芯片手冊自己寫代碼,最后發(fā)現(xiàn)每個人的思路是不一樣的,按照自己的思路可能寫出來比他更簡單的代碼,所以不管看誰的視頻或者怎么學都必須要自己動手打代碼,這樣才能調用自己的思維,自己形成自己的代碼習慣
分享一下我當時自己寫的代碼,最后有整體解釋,每一步有單獨的注釋,希望能對新手入門起到幫助。
有幾步很微妙,自己第一次想真的是想不到,所以一定要先模仿,然后再自己創(chuàng)新,給同學者一點自己的心得建議,望有幫助!
單片機源程序如下:
//獨立按鍵K1控制D1指示燈亮滅
#include "reg52.h"
typedef unsigned char u8;
typedef unsigned int u16;
sbit K1=P3^1;
sbit K2=P3^0;
sbit K3=P3^2;
sbit K4=P3^3;
sbit LED1=P2^0;
void delay_10us(u16 time)
{
while(time--);
}
void key_scan(u8 mode) //模式選擇函數(shù):0表示單次掃描,1表示連續(xù)掃描
{
static u8 key=1; //靜態(tài)變量第一次賦初值必須要為1,至少要執(zhí)行一次
if(mode)key=1; //判斷模式,若形參為1,把上一次循環(huán)清零的key變成1
if((key==1)&&(K1==0)) //邏輯運算,如果mode=1且有按鍵按下
{
delay_10us(1000); //10ms
if(K1==0) //二次判斷
LED1=!LED1;
key=0;
}
else if(K1==1) //沒有按鍵按下,要把key變成1,缺少這一步,按鍵按一次變化之后就不會變了
key=1; //else if與最近的if語句相關聯(lián)
}
//void key_functions()
//{
// if(K1==0)
// {
// delay_10us(1000); //10ms
// if(K1==0) //二次判斷
// LED1=!LED1; //LED1即P20口初始為高電平
//
// }
//}
void main()
{
while(1)
{
key_scan(1); //實參選擇模式
}
}
/*整個過程:
第一種情況:mode=0,單次操作
1.key=1
2.key_scan函數(shù)里第一個if語句不滿足,直接跳到下一條
3.由于賦初值key=1,有按鍵按下時,執(zhí)行第二個if語句
4.key清零
5.若前一個操作按鍵按下沒送,第二次循環(huán)到來時,由于key已經為0,不滿足第二個if語句,不會執(zhí)行LED燈狀態(tài)翻轉操作
6.直到前一次按鍵松開,K1=1,再把key變成1,等待下次按鍵按下
第二種情況:mode=1,連續(xù)操作
1.key=1
2.key_scan函數(shù)里第一個if語句滿足,key仍然為1
3.由于賦初值key=1,有按鍵按下時,執(zhí)行第二個if語句
4.key清零
5.若前一個操作按鍵按下沒送,第二次循環(huán)到來時,由于第一個if語句滿足,key再次變成1,滿足第二個if語句,繼續(xù)執(zhí)行LED燈狀態(tài)翻轉操作
6.直到前一次按鍵松開,K1=1,再把key變成1,等待下次按鍵按下
*/
作者:
Roddy123
時間:
2023-5-8 11:16
模式為1,按了就看不出了,亮和滅都是隨機的,無法控制
作者:
zyscxr
時間:
2024-9-22 20:08
優(yōu)秀,向你學習
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1