熱門: 51單片機(jī) | 24小時必答區(qū) | 單片機(jī)教程 | 單片機(jī)DIY制作 | STM32 | Cortex M3 | 模數(shù)電子 | 電子DIY制作 | 音響/功放 | 拆機(jī)樂園 | Arduino | 嵌入式OS | 程序設(shè)計(jì)
![]() |
發(fā)布時間: 2018-12-7 10:58
正文摘要:at89c2單片機(jī) 一個按鍵實(shí)現(xiàn)八位一體數(shù)碼管的遞增顯示 。按第一次 第一位顯示一個數(shù), 按第二次,第一位數(shù)不消失,顯示第二位數(shù), 按第三次,第一位,第二位都不消失,顯示第三位數(shù),以此類推 請大神教 ... |
按你的意思不用接74HC573,數(shù)碼管可直接接P2與P3口,代碼如下: #include<reg51.h> #define uchar unsigned char #define uint unsigned int //段碼表 注意:是共陽數(shù)碼管 uchar code duan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //位碼表 uchar code wei[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; //延時 void delay_mS(uint x) { uchar t; while(x--) for(t=0;t<120;t++); } void main() { uchar i,j; while(1) { for(j=0;j<8;j++) { P2=0x00; P2=duan[j]; //發(fā)送段碼 P3=wei[j]; //發(fā)送位碼 delay_mS(100); //將動態(tài)時間延長就是你要的效果 } } } |
參與人數(shù) 1 | 黑幣 +80 | 收起 理由 |
---|---|---|
![]() | + 80 | 回帖助人的獎勵! |
jinsheng7533967 發(fā)表于 2018-12-7 16:04 不需要加段鎖存和位鎖存么 |
wulin 發(fā)表于 2018-12-16 20:24 非常完美,謝謝 大哥,想和你交個朋友,做我?guī)煾蛋桑俸?/td> |
1628990936 發(fā)表于 2018-12-16 18:06 ![]() #include<reg52.h> #define uchar unsigned char #define uint unsigned int sbit dula=P3^0; //HL-1 sbit wela=P3^1; //HL-1 sbit key =P3^2; uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f}; uchar code table1[]={0x00,0x76,0x79,0x38,0x38,0x6e,0x00,0x00};//HELLY uchar data dis_buf[8]; uint num=0; void keyscan()//按鍵程序 { static uchar count; //計(jì)數(shù)消抖變量 static bit key_sign=0; //按鍵自鎖標(biāo)志 uchar a; if(key==0) //檢測輸入如果為0 { if((++count>=100)&&(key_sign==0)) { key_sign=1; //按鍵自鎖標(biāo)志置1,防止重復(fù)響應(yīng) num++; dis_buf[0]=num; for(a=8;a>0;a--) dis_buf[a]=dis_buf[a-1]; if(num>9) num=0; } } else { count=0; //計(jì)數(shù)變量清0 key_sign=0; //按鍵自鎖標(biāo)志清0 } } void display()//顯示程序 { static uchar i=0,j; //計(jì)數(shù)變量 if(++j>100)//調(diào)整數(shù)碼管刷新頻率 { j=0; P2=0x00; dula=1; dula=0; switch(i) { case 0: P2=0xfe; wela=1; wela=0; if(num>7) { if(num==9) P2=table1[0]; else P2=table[dis_buf[8]]; } else P2=0x00; dula=1; dula=0; i++; break; case 1: P2=0xfd; wela=1; wela=0; if(num>6) { if(num==9) P2=table1[1]; else P2=table[dis_buf[7]]; } else P2=0x00; dula=1; dula=0; i++; break; case 2: P2=0xfb; wela=1; wela=0; if(num>5) { if(num==9) P2=table1[2]; else P2=table[dis_buf[6]]; } else P2=0x00; dula=1; dula=0; i++; break; case 3: P2=0xf7; wela=1; wela=0; if(num>4) { if(num==9) P2=table1[3]; else P2=table[dis_buf[5]]; } else P2=0x00; dula=1; dula=0; i++; break; case 4: P2=0xef; wela=1; wela=0; if(num>3) { if(num==9) P2=table1[4]; else P2=table[dis_buf[4]]; } else P2=0x00; dula=1; dula=0; i++; break; case 5: P2=0xdf; wela=1; wela=0; if(num>2) { if(num==9) P2=table1[5]; else P2=table[dis_buf[3]]; } else P2=0x00; dula=1; dula=0; i++; break; case 6: P2=0xbf; wela=1; wela=0; if(num>1) { if(num==9) P2=table1[6]; else P2=table[dis_buf[2]]; } else P2=0x00; dula=1; dula=0; i++; break; case 7: P2=0x7f; wela=1; wela=0; if(num>0) { if(num==9) P2=table1[7]; else P2=table[dis_buf[1]]; } else P2=0x00; dula=1; dula=0; i=0; break; } } } void main() { while(1) { keyscan(); display(); } } |
wulin 發(fā)表于 2018-12-14 22:36 唔,就是 這個 電路圖, 只有一個按鍵,按一下 顯示1,按第二下,顯示1,2.......。按第八下,顯示12345678,按第九下,八位數(shù)碼管只顯示helly,就可以了,整個過程只有一個按鍵這個八位的數(shù)碼管。 |
1628990936 發(fā)表于 2018-12-14 11:24 你是想用數(shù)碼管顯示字符“helly”嗎?不太明白你的意思。 |
wulin 發(fā)表于 2018-12-9 12:46 大哥,如果我想把按鍵顯示結(jié)束后,再按一下,然后顯示helly,同時顯示,該怎么修改這個程序呢,請大哥務(wù)必幫我,事后必有重謝。 |
jinsheng7533967 發(fā)表于 2018-12-9 16:28 謝謝 大哥,留個vx 我給你發(fā)個紅包 |
wulin 發(fā)表于 2018-12-9 12:46 謝謝 大佬 非常感謝 留個微信吧 我給你發(fā)個紅包 |
1628990936 發(fā)表于 2018-12-8 18:28 給你一個獨(dú)立按鍵代碼,你可以自己加進(jìn)去試試,另外你空間里提到的用74HC573按按鍵保存密碼的事不現(xiàn)實(shí),74HC573是鎖存器(當(dāng)使能位低電平時,鎖存你剛從P/I口送去的數(shù)據(jù),P/I口再來的數(shù)據(jù)據(jù)之門外;當(dāng)使能位高電平時,輸出隨P/I口變化),不是記憶芯片,不可能保存你說的所謂密碼,只能用動態(tài)掃描掃出你要的數(shù)字。另外網(wǎng)上有很多獨(dú)立按鍵的與數(shù)碼管的視頻教程,多看幾次,多敲幾次就明白了。 void PORT_key(void) { if(key == 0) //將你的按鍵位定意為key { delay(10); //消抖 if(key == 0) { while(key == 0);//松手 i++; //不知你的變量是不是i } } } 再將此代碼放入while(1)中.去掉for的8次循環(huán),i 放入數(shù)組中 |
這個建議你慢慢學(xué),自己編程才有樂趣,沒有基礎(chǔ)的話,別人的不容易看懂。 |
本帖最后由 wulin 于 2018-12-9 16:23 編輯 給你寫一個適合做密碼鎖的顯示電路。完全符合你想要的功能。 ![]() #include<reg52.h> #define uchar unsigned char #define uint unsigned int sbit dula=P3^0; //HL-1 sbit wela=P3^1; //HL-1 sbit key =P3^2; uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f}; uchar data dis_buf[9]; uint num=0; void keyscan()//按鍵程序 { static uchar count; //計(jì)數(shù)消抖變量 static bit key_sign=0; //按鍵自鎖標(biāo)志 uchar a; if(key==0) //檢測輸入如果為0 { if((++count>=100)&&(key_sign==0)) { key_sign=1; //按鍵自鎖標(biāo)志置1,防止重復(fù)響應(yīng) num++; if(num>=9) num=0; dis_buf[0]=num; for(a=8;a>0;a--) dis_buf[a]=dis_buf[a-1]; } } else { count=0; //計(jì)數(shù)變量清0 key_sign=0; //按鍵自鎖標(biāo)志清0 } } void display()//顯示程序 { static uchar i=0,j; //計(jì)數(shù)變量 if(++j>100)//調(diào)整數(shù)碼管刷新頻率 { j=0; P2=0x00; dula=1; dula=0; switch(i) { case 0: P2=0xfe; wela=1; wela=0; if(num>7) P2=table[dis_buf[8]]; else P2=0x00; dula=1; dula=0; i++; break; case 1: P2=0xfd; wela=1; wela=0; if(num>6) P2=table[dis_buf[7]]; else P2=0x00; dula=1; dula=0; i++; break; case 2: P2=0xfb; wela=1; wela=0; if(num>5) P2=table[dis_buf[6]]; else P2=0x00; dula=1; dula=0; i++; break; case 3: P2=0xf7; wela=1; wela=0; if(num>4) P2=table[dis_buf[5]]; else P2=0x00; dula=1; dula=0; i++; break; case 4: P2=0xef; wela=1; wela=0; if(num>3) P2=table[dis_buf[4]]; else P2=0x00; dula=1; dula=0; i++; break; case 5: P2=0xdf; wela=1; wela=0; if(num>2) P2=table[dis_buf[3]]; else P2=0x00; dula=1; dula=0; i++; break; case 6: P2=0xbf; wela=1; wela=0; if(num>1) P2=table[dis_buf[2]]; else P2=0x00; dula=1; dula=0; i++; break; case 7: P2=0x7f; wela=1; wela=0; if(num>0) P2=table[dis_buf[1]]; else P2=0x00; dula=1; dula=0; i=0; break; } } } void main() { while(1) { keyscan(); display(); } } |
yingchun 發(fā)表于 2018-12-8 20:48 兄弟 你會編寫程序嗎 |
jinsheng7533967 發(fā)表于 2018-12-7 16:04 大哥 我需要 一個按鍵控制呀 |
jinsheng7533967 發(fā)表于 2018-12-7 16:04 大哥 謝謝 你的程序 但是 你編的 沒有按鍵呀 |
有什么福利 |
Powered by 單片機(jī)教程網(wǎng)