熱門: 51單片機(jī) | 24小時(shí)必答區(qū) | 單片機(jī)教程 | 單片機(jī)DIY制作 | STM32 | Cortex M3 | 模數(shù)電子 | 電子DIY制作 | 音響/功放 | 拆機(jī)樂(lè)園 | Arduino | 嵌入式OS | 程序設(shè)計(jì)
![]() |
發(fā)布時(shí)間: 2024-1-22 07:54
正文摘要:/*按鍵K1K2加減數(shù)字?jǐn)?shù)碼管顯示 按鍵K3K4加減數(shù)碼管顯示 單片機(jī)源程序如下: #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)么?那不建議這么寫啊,取模計(jì)算速度有點(diǎn)慢。不如用三目運(yùn)算符了或者if了。 t=(++t >= 10) ? 0 : t; |
hjx5548 發(fā)表于 2024-1-29 00:09 由于數(shù)據(jù)類型不同,CPU處理速度也不同,同一個(gè)函數(shù),在不同的運(yùn)行環(huán)境,也會(huì)產(chǎn)生不同效果。將數(shù)碼管掃描放在定時(shí)器中斷中運(yùn)行。
|
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; //按鍵蜂鳴器響 時(shí)長(zhǎng) unsigned char key2_lock_flag; unsigned char key2_cnt; //按鍵蜂鳴器響 時(shí)長(zhǎng) unsigned char key3_lock_flag; unsigned char key3_cnt; //按鍵蜂鳴器響 時(shí)長(zhǎng) unsigned char key4_lock_flag; unsigned char key4_cnt; //按鍵蜂鳴器響 時(shí)長(zhǎng) unsigned char keyscan() { unsigned char KeyNum = 0 ; if (k1) //如果沒(méi)有按下 { key1_lock_flag = 0; //清零自鎖標(biāo)志 key1_cnt = 0 ; //累計(jì)循環(huán)次數(shù),也是消抖時(shí)間 } else if(!key1_lock_flag) { key1_cnt ++ ; if(key1_cnt > KEY_DELAY_TIME) { key1_cnt = 0; //清零 key1_lock_flag = 1 ; //自鎖標(biāo)記,防止按鍵多次觸發(fā) KeyNum = 1 ; //賦鍵值編碼 } } if (k2) //如果沒(méi)有按下 { key2_lock_flag = 0; //清零自鎖標(biāo)志 key2_cnt = 0 ; //累計(jì)循環(huán)次數(shù),也是消抖時(shí)間 } else if(!key1_lock_flag) { key2_cnt ++ ; if(key2_cnt > KEY_DELAY_TIME) { key2_cnt = 0; //清零 key2_lock_flag = 1 ; //自鎖標(biāo)記,防止按鍵多次觸發(fā) KeyNum = 2 ; //賦鍵值編碼 } } if (k3) //如果沒(méi)有按下 { key3_lock_flag = 0; //清零自鎖標(biāo)志 key3_cnt = 0 ; //累計(jì)循環(huán)次數(shù),也是消抖時(shí)間 } else if(!key3_lock_flag) { key3_cnt ++ ; if(key1_cnt > KEY_DELAY_TIME) { key3_cnt = 0; //清零 key3_lock_flag = 1 ; //自鎖標(biāo)記,防止按鍵多次觸發(fā) KeyNum = 3 ; //賦鍵值編碼 } } if (k4) //如果沒(méi)有按下 { key4_lock_flag = 0; //清零自鎖標(biāo)志 key4_cnt = 0 ; //累計(jì)循環(huán)次數(shù),也是消抖時(shí)間 } else if(!key4_lock_flag) { key4_cnt ++ ; if(key4_cnt > KEY_DELAY_TIME) { key4_cnt = 0; //清零 key4_lock_flag = 1 ; //自鎖標(biāo)記,防止按鍵多次觸發(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 消隱問(wèn)題 |
lkc8210 發(fā)表于 2024-1-23 17:33 每組數(shù)碼管需要消隱 |
wulin 發(fā)表于 2024-1-23 22:05 謝謝,這個(gè)程序在板子上能實(shí)現(xiàn)功能了,如果我要增加四個(gè)數(shù)碼管應(yīng)該這樣修改。增加的數(shù)碼管段碼還是P2,位碼分別為P10-P13. |
hjx5548 發(fā)表于 2024-1-23 23:10 中斷里不要用延時(shí)! 中斷里不要用延時(shí)! 中斷里不要用延時(shí)! |
zhuls 發(fā)表于 2024-1-23 16:53 現(xiàn)在主要是按鍵控制問(wèn)題了,數(shù)碼管問(wèn)題解決了。 |
hjx5548 發(fā)表于 2024-1-23 12:47 不要把簡(jiǎn)單的事情復(fù)雜化。給你改了。仿真沒(méi)有問(wèn)題。
|
newlined 發(fā)表于 2024-1-23 12:01 硬件沒(méi)有問(wèn)題的,P2直接驅(qū)動(dòng)是根據(jù)stc實(shí)驗(yàn)箱電路做的,已經(jīng)點(diǎn)亮數(shù)碼管了 |
不說(shuō)一下數(shù)碼管程序顯示亮度不一致原因是什么嗎? |
感覺(jué)流程有點(diǎn)問(wèn)題: void TM1_Isr0()interrupt 1 //數(shù)碼管掃描定時(shí)器0 { 。。。 Led_Seg(Num); //15ms+ P00=1; Led_Seg1(Num1);//15ms+ 。。。 } 中斷才1ms,進(jìn)入后要呆滿30ms+...去北京開(kāi)會(huì),順便去芬蘭泡個(gè)桑拿。。 ================= 這個(gè)測(cè)試過(guò)的,OK,定時(shí)、動(dòng)掃、6位、共陰數(shù)碼管。 每進(jìn)一次中斷只顯示一位。 你參考一下。 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]; //段碼 } |
這個(gè)四個(gè)按鍵分別控制兩組三位數(shù)碼管加減的程序,沒(méi)有人能解決啊! |
P2口應(yīng)該是驅(qū)動(dòng)數(shù)碼管的,如果是直接接的話,不一定能驅(qū)動(dòng),是不是要加三極管?再就是您可以加一個(gè)小的發(fā)光二極管,當(dāng)檢測(cè)到按鍵按下的,可以用另一個(gè)IO口,點(diǎn)亮這個(gè)二極管,先看看程序和硬件能不能檢測(cè)到按鍵按下,一步一步的來(lái)。 |
Powered by 單片機(jī)教程網(wǎng)