![]() |
發(fā)布時間: 2024-1-22 07:54
正文摘要:/*按鍵K1K2加減數(shù)字數(shù)碼管顯示 按鍵K3K4加減數(shù)碼管顯示 單片機源程序如下: #include "STC8H.h" #include "intrins.h" unsigned char NixieTable[]={ 0x03,/*0*/ &n ... |
wulin 發(fā)表于 2024-1-29 08:19 t=++t%10; 這句的意義是什么?0-10循環(huán)么?那不建議這么寫啊,取模計算速度有點慢。不如用三目運算符了或者if了。 t=(++t >= 10) ? 0 : t; |
hjx5548 發(fā)表于 2024-1-29 00:09 由于數(shù)據(jù)類型不同,CPU處理速度也不同,同一個函數(shù),在不同的運行環(huán)境,也會產生不同效果。將數(shù)碼管掃描放在定時器中斷中運行。
|
wulin 發(fā)表于 2024-1-26 21:21 這樣修改了數(shù)碼管顯示不均勻 |
hjx5548 發(fā)表于 2024-1-24 10:05 void Write(unsigned int i) { w1=i&0x01;i>>=1; w2=i&0x01;i>>=1; w3=i&0x01;i>>=1; w4=i&0x01;i>>=1; w5=i&0x01;i>>=1; w6=i&0x01;i>>=1; w7=i&0x01;i>>=1; w8=i&0x01;i>>=1; w9=i&0x01;i>>=1; w10=i&0x01; } void Led_Seg() //顯示函數(shù) { static unsigned int i; P2=0xff; Write(~(0x01<<i)); P2=a[i ]; i=++i%10; } 注意數(shù)據(jù)類型 |
wulin 發(fā)表于 2024-1-23 22:05 #ifndef __KEY_H__ #define __KEY__ #include "STC8H.h" sbit k1 = P3^6 ; sbit k2 = P3^7 ; sbit k3 = P0^3 ; sbit k4 = P5^4 ; extern unsigned int Temp_Off,Temp_On; #define KEY_DELAY_TIME 50 void Key_Service(); extern unsigned int Temp_Off,Temp_On; #endif #include "key.h" unsigned int Temp_Off = 25,Temp_On =12; unsigned char key1_lock_flag; unsigned char key1_cnt; //按鍵蜂鳴器響 時長 unsigned char key2_lock_flag; unsigned char key2_cnt; //按鍵蜂鳴器響 時長 unsigned char key3_lock_flag; unsigned char key3_cnt; //按鍵蜂鳴器響 時長 unsigned char key4_lock_flag; unsigned char key4_cnt; //按鍵蜂鳴器響 時長 unsigned char keyscan() { unsigned char KeyNum = 0 ; if (k1) //如果沒有按下 { key1_lock_flag = 0; //清零自鎖標志 key1_cnt = 0 ; //累計循環(huán)次數(shù),也是消抖時間 } else if(!key1_lock_flag) { key1_cnt ++ ; if(key1_cnt > KEY_DELAY_TIME) { key1_cnt = 0; //清零 key1_lock_flag = 1 ; //自鎖標記,防止按鍵多次觸發(fā) KeyNum = 1 ; //賦鍵值編碼 } } if (k2) //如果沒有按下 { key2_lock_flag = 0; //清零自鎖標志 key2_cnt = 0 ; //累計循環(huán)次數(shù),也是消抖時間 } else if(!key1_lock_flag) { key2_cnt ++ ; if(key2_cnt > KEY_DELAY_TIME) { key2_cnt = 0; //清零 key2_lock_flag = 1 ; //自鎖標記,防止按鍵多次觸發(fā) KeyNum = 2 ; //賦鍵值編碼 } } if (k3) //如果沒有按下 { key3_lock_flag = 0; //清零自鎖標志 key3_cnt = 0 ; //累計循環(huán)次數(shù),也是消抖時間 } else if(!key3_lock_flag) { key3_cnt ++ ; if(key1_cnt > KEY_DELAY_TIME) { key3_cnt = 0; //清零 key3_lock_flag = 1 ; //自鎖標記,防止按鍵多次觸發(fā) KeyNum = 3 ; //賦鍵值編碼 } } if (k4) //如果沒有按下 { key4_lock_flag = 0; //清零自鎖標志 key4_cnt = 0 ; //累計循環(huán)次數(shù),也是消抖時間 } else if(!key4_lock_flag) { key4_cnt ++ ; if(key4_cnt > KEY_DELAY_TIME) { key4_cnt = 0; //清零 key4_lock_flag = 1 ; //自鎖標記,防止按鍵多次觸發(fā) KeyNum = 4 ; //賦鍵值編碼 } } return KeyNum; } void Key_Service() { unsigned char a; a = keyscan() ; switch(a) { case0: break; case1: Temp_Off = 0; Temp_Off++;if (Temp_Off>150) Temp_Off=150;break; case2: Temp_Off = 0; Temp_Off--;if (Temp_Off<0) Temp_Off=0;break; case3: Temp_On = 0; Temp_On++;break; case4: Temp_On = 0; Temp_On--;break; default: break; } } 你的可以的,我這樣數(shù)碼管為什么就不能工作? |
lkc8210 發(fā)表于 2024-1-23 17:33 消隱問題 |
lkc8210 發(fā)表于 2024-1-23 17:33 每組數(shù)碼管需要消隱 |
wulin 發(fā)表于 2024-1-23 22:05 謝謝,這個程序在板子上能實現(xiàn)功能了,如果我要增加四個數(shù)碼管應該這樣修改。增加的數(shù)碼管段碼還是P2,位碼分別為P10-P13. |
hjx5548 發(fā)表于 2024-1-23 23:10 中斷里不要用延時! 中斷里不要用延時! 中斷里不要用延時! |
zhuls 發(fā)表于 2024-1-23 16:53 現(xiàn)在主要是按鍵控制問題了,數(shù)碼管問題解決了。 |
hjx5548 發(fā)表于 2024-1-23 12:47 不要把簡單的事情復雜化。給你改了。仿真沒有問題。
|
newlined 發(fā)表于 2024-1-23 12:01 硬件沒有問題的,P2直接驅動是根據(jù)stc實驗箱電路做的,已經(jīng)點亮數(shù)碼管了 |
不說一下數(shù)碼管程序顯示亮度不一致原因是什么嗎? |
感覺流程有點問題: void TM1_Isr0()interrupt 1 //數(shù)碼管掃描定時器0 { 。。。 Led_Seg(Num); //15ms+ P00=1; Led_Seg1(Num1);//15ms+ 。。。 } 中斷才1ms,進入后要呆滿30ms+...去北京開會,順便去芬蘭泡個桑拿。。 ================= 這個測試過的,OK,定時、動掃、6位、共陰數(shù)碼管。 每進一次中斷只顯示一位。 你參考一下。 void timer1() interrupt 3 { char temp; dis_dig++; dis_dig %= 6; //6位數(shù)碼管 led_bus = 0x00; //消隱@共陰 temp = 0xfe; led_com =_crol_(temp,dis_dig); //位選 led_bus = dis_buf[dis_dig]; //段碼 } |
這個四個按鍵分別控制兩組三位數(shù)碼管加減的程序,沒有人能解決啊! |
P2口應該是驅動數(shù)碼管的,如果是直接接的話,不一定能驅動,是不是要加三極管?再就是您可以加一個小的發(fā)光二極管,當檢測到按鍵按下的,可以用另一個IO口,點亮這個二極管,先看看程序和硬件能不能檢測到按鍵按下,一步一步的來。 |
Powered by 單片機教程網(wǎng)