遇到一個問題,如何按鍵按下既能控制流水燈又能把鍵值在數(shù)碼管中顯示呢?流水燈500ms的延時,和數(shù)碼管動態(tài)刷新延時小于10ms顯示有沖突。
bit和sbit,sfr都是C51擴展的變量類型,不是標準C語言類型
1.bit類型的值是一個二進制位,不是0就是1,類似布爾類型
2.sbit大部分是用在寄存器中的,方便對寄存器的某位進行操作的。
sbit LED1 = P0^0 把P0端口的第0位命名為LED1,方便使用
sbit 位變量名=SFR 名稱^變量 位地址值
3.sfr也是一種擴充數(shù)據(jù)類型:,占用一個內(nèi)存單元,利用它可以訪問51單片機內(nèi)部的所有特殊功能寄存器。如用sfr P1 = 0x90 指定P1來操作地址為0X90的寄存器
改變流水燈的方向
按鍵控制流水燈實現(xiàn)的功能:
1.key1啟動鍵,首次按下可以產(chǎn)生自上向下的流水燈效果
2.key2停止鍵,按下可以終止流水燈的運動
3.key3和key4分別產(chǎn)生自上向下和自下向上的流水燈效果
實現(xiàn)的方法:
1.利用標志位Startflag來控制流水燈的開始和停止,初始化定義為0停止,為1時上電便有流水燈效果。用標志位UpDownflag控制流水燈的方向,初始化的值0,1來控制自上而下還是從下到上
2.利用移位運算符實現(xiàn)流水燈效果
注意:移位運算符實現(xiàn)循環(huán)移位才能實現(xiàn)流水燈的效果
C51庫函數(shù)自帶循環(huán)移位的效果:crol 循環(huán)左移 _cror_循環(huán)右移
按鍵應用層功能函數(shù)
void Key_Service()
{
switch(Key_Scan())
{
case 1: Startflag = 1;break;//開始
case 2: Startflag = 0;break;//停止
case 3: UpDownflag =1;break;//向上流水燈
case 4: UpDownflag =0;break;//向下流水燈
default :break;
}
if(Startflag)
{
P0 = temp;
if(UpDownflag)
{
temp = (temp>>1)|0x80; //右移一位
if(temp == 0xff) //條件判斷給temp重新賦值,實現(xiàn)循環(huán)移位功能
temp = 0x7f;
}
else
{
temp = (temp<<1)|0x1;//左移一位
if(temp == 0xff) //條件判斷給temp重新賦值,實現(xiàn)循環(huán)移位功能
temp = 0xfe;
}
DelayXms(500);
}
}
自己遇到的一個問題:按鍵按下既能控制流水燈又能把鍵值在數(shù)碼管中顯示
2個功能分開都能正確運行
糅合在一起就會出問題。
因為延時500ms數(shù)碼管動態(tài)刷新有問題
void main()
{
LEDBuf[0]=23;
LEDBuf[1]=23;
LEDBuf[2]=23;
while(1)
{
Key_Service();
Didplay_Service();
}
}
void Didplay_Service()
{
switch(Key_Scan())
{
case 1:LEDBuf[3]=1;break;
case 2:LEDBuf[3]=2;break;
case 3:LEDBuf[3]=3;break;
case 4:LEDBuf[3]=4;break;
default :break;
}
Display();
}
如果刪除500ms的延時,顯示效果是這樣的.
加上500ms延時,按鍵好像失效似的,返回顯示的鍵值也不對,很奇怪的問題。
-
單片機
+關注
關注
6063文章
44925瀏覽量
647002 -
寄存器
+關注
關注
31文章
5421瀏覽量
123359 -
數(shù)碼管
+關注
關注
32文章
1889瀏覽量
92227 -
流水燈
+關注
關注
21文章
433瀏覽量
60303 -
按鍵
+關注
關注
4文章
227瀏覽量
57939
發(fā)布評論請先 登錄
51單片機按鍵控制流水燈閃爍測試程序詳細資料免費下載

使用51單片機按鍵控制流水燈換速的程序免費下載

使用51單片機進行四按鍵五花樣流水燈設計的程序免費下載

Proteus:單片機按鍵控制流水燈方向

51單片機按鍵控制流水燈

評論