![]() |
發布時間: 2021-5-25 10:54
正文摘要:最近跟數碼管杠上了,在垃圾堆找到了一個變頻器面板發現設計很有意思 就用3個io完成了四位數碼管顯示,四個LED顯示,還有6個按鍵輸出。感覺挺有意思,畫下了電路圖,用15f104w接上接口,現在能做到把數碼 ... |
延時短了就顯示成這樣了吧 |
非凡科技 發表于 2021-5-31 18:46 很多年沒用過164了,現在都用1628, |
顯示好了代碼如下求高手幫助下按鍵怎么整 怎樣讀鍵值 #include<STC15.H> //包含單片機寄存器的頭文件 #include<intrins.h> #define uint unsigned int #define uchar unsigned char //74ls164IO口定義 sbit CLK=P3^2; sbit DAT=P3^3; sbit key=P3^4; bit key_1=0,key_2=0; uint num,llxs,temp, Cnt_ms; uchar code tab[]={ 0xBB, 0x28, 0x73, 0x79, 0xE8, 0xD9, 0xDB, 0x38, 0xFB, 0xF9,0xef,0x7f,0xdf,0xef,0Xbf,0xff,0X00, }; uchar G,S,bai,Q; void dispbyte(uchar byte); void delay(uint z); void count(); void delay(uint z) { uint x,y; for(x=0;x<z;x++) for(y=0;y<100;y++); } void dispbyte(uchar byte) { uchar num2,i; num2=tab[byte];//取出段碼 for(i=0;i<8;i++) //循環八次送至led數碼管 { CLK=0; if(num2&0x01) DAT=1;//判斷最高位,并取出最高位 else DAT=0;// CLK=1; //上升沿有效 num2>>=1; //左移一位(每次移動一位,共8次) } } void count() //把每一位數字都單獨存到一個變量中 { G = num%10; S = num/10%10; bai = num/100%10; Q = num/1000%10; } void Timer0Init(void) //4毫秒@12.000MHz { AUXR &= 0x7F; //定時器時鐘12T模式 TMOD &= 0xF0; //設置定時器模式 TL0 = 0x60; //設置定時初始值 TH0 = 0xF0; //設置定時初始值 TF0 = 0; //清除TF0標志 TR0 = 1; //定時器0開始計時 } main() { Timer0Init(); EA=1; ET0=1; num=0; Cnt_ms=0; while(1) { count(); keysm(); } } /******定時器0中斷服務程序******/ void timer0() interrupt 1 { Cnt_ms++; llxs++; if(Cnt_ms>=250) { Cnt_ms=0;} if(llxs>4) {llxs=0;} switch(llxs) { case 0: dispbyte(10); dispbyte(G); break; case 1: dispbyte(12); dispbyte(S); break; case 2: dispbyte(11); dispbyte(bai); break; case 3: dispbyte(14); dispbyte(Q); break; } } |
消影一般delay 200ms 就可以了 |
目前能顯示了 就是消影做不出來 |
我見過用一片4017做按鍵的,單線驅動,用在車載通訊機的手咪上。 |
位選也是通過另一塊164來選的啊,函數都一樣,編碼和管腳要再定義,每次只要選中一個而已,你這是共陰的管子,別編錯了,就按動態掃描的方式顯示。其實51上好多IO,干脆找四個直接位選算了。 |
就是位選不知道怎么整 |
這種數碼管一般是共陰或共陽的,控制共陰或共陽就可以實現位選![]() |
送段值后送位值了? |