遇到一個問題,如何按鍵按下既能控制流水燈又能把鍵值在數(shù)碼管中顯示呢?流水燈500ms的延時,和數(shù)碼管動態(tài)刷新延時小于10ms顯示有沖突。
bit和sbit,sfr都是C51擴展的變量類型,不是標(biāo)準(zhǔn)C語言類型
1.bit類型的值是一個二進(jìn)制位,不是0就是1,類似布爾類型
2.sbit大部分是用在寄存器中的,方便對寄存器的某位進(jìn)行操作的。
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.利用標(biāo)志位Startflag來控制流水燈的開始和停止,初始化定義為0停止,為1時上電便有流水燈效果。用標(biāo)志位UpDownflag控制流水燈的方向,初始化的值0,1來控制自上而下還是從下到上
2.利用移位運算符實現(xiàn)流水燈效果
注意:移位運算符實現(xiàn)循環(huán)移位才能實現(xiàn)流水燈的效果
C51庫函數(shù)自帶循環(huán)移位的效果:crol 循環(huán)左移 _cror_循環(huán)右移
按鍵應(yīng)用層功能函數(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延時,按鍵好像失效似的,返回顯示的鍵值也不對,很奇怪的問題。
-
單片機
+關(guān)注
關(guān)注
6032文章
44514瀏覽量
632971 -
寄存器
+關(guān)注
關(guān)注
31文章
5317瀏覽量
120003 -
數(shù)碼管
+關(guān)注
關(guān)注
32文章
1874瀏覽量
90943 -
流水燈
+關(guān)注
關(guān)注
21文章
432瀏覽量
59636 -
按鍵
+關(guān)注
關(guān)注
4文章
223瀏覽量
57572
發(fā)布評論請先 登錄
相關(guān)推薦
評論