?? 一個按鍵控制的10 級變速跑馬燈.c
字號:
/*一個按鍵控制的10 級變速跑馬燈試驗
我們要用一個按鍵來實現跑馬燈的10 級調速。這又會涉及到鍵的去抖的問
題。 本課的試驗結果是,每按一次按鍵,跑馬速度就降低一級,共10 級。
這里我們又增加了一個變量speedlever,來保存當前的速度檔次。 在按鍵
里的處理中,多了當前檔次的延時值的設置。
經驗:++ 寫成 + 將無法運行程序,并出現編譯警告
請看程序: */
#define uchar unsigned char//宏定義
#define uint unsigned int
#define ulong unsigned long
#include <reg51.h>//51內部說明
sbit K=P3^2;//按鍵位定義
bit ldelay=0;//長定時溢出標記,預置是0 即軟件定時溢出標志位
uchar speed=10;//軟件定時值
uchar speedlever=0;//按鈕值
void main(void)//主程序
{
/*LED的8位值 無符號字符型,code表示定義為內部ROM數據*/
uchar code ledp[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
uchar ledi;//用來選擇LED值的位
uint n;
TMOD=0x01;//定時器0工作方式1
TH0=0x10;//定時器高位初值
TL0=0x00;//低位值
TR0=1;//開始計時
ET0=1;//允許T0中斷
EA=1;//打開總中斷
while(1)//主程序循環
{
if(ldelay)//如果軟件定時標志位溢出,執行{}
{
ldelay=0;//清軟件定時標志位,讓它繼續計時
P1=ledp[ledi];//查表把值送到P0口
ledi++;//自加移到下一位,
if(ledi==8)//如果到了第8位LED則回到第一位
{
ledi=0;
}
}
if(!K)//有按鍵按下?有則執行{}
{
for(n=0;n<1000;n++);//延時去抖
while(!K);//待放鍵
for(n=0;n<1000;n++);//延時去抖
speedlever++;//自加1,按一次鍵盤加一次
if(speedlever==10)//到10則清零,
speedlever=0;//在這因為只有一個語句所以省了{}
speed=speedlever*3;/*檔次和延時之間的預算法則,也可以用查表方法,做出
不規則的法則,按鍵值speedlever X 3=speed 作軟件定時時間參數*/
}
}
}
timer2() interrupt 1
{
static uchar t;//靜態變量,使t在中斷返回后的值不變,否則t返回后會自動復位
TF0=0;//清零T0標志位
t++;
if((t==speed)||(t>30))//T到按鈕設的速度值且小于30,則軟件定時溢出t=0,ldelay=1
{
t=0;
ldelay=1;
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -