① 單片機 按鍵控制8位數碼管顯示問題
關於數碼管的顯示,是顯示完一個位的是數字後,在顯示下一個位時要先把上一個位顯示徹底關閉掉,通常可以是把全部數碼管位全部顯示為空的狀態,談後在開下一個位的顯示(有延時),這樣在開下一個位的鎖存時上一個位的數據就不會跑到該位顯示,不然會在下一位顯示時會與上一個位的數字出現重影現象。。。
還有對於數碼管的顯示,最好是一次性顯示完全部數碼管,還沒有得位就顯示0ff(要記得初始化你的數組)。我個人不建議你這種顯示按位數變化方式。。。
for(i=0;i<j;i=i+1)
//每次都顯示完8個數碼管比較好。。。
{
/*
在此增加把所有數碼管顯示為0FF狀態,全部位都打開顯示
*/
display=weima_table[i];
//數碼管需要顯示的位
weima_latch=1;
//鎖存器(位碼)打開
weima_latch=0;
//鎖存器(位碼)關閉
display=cunchudisplay[i];
//數碼管需要顯示的段
anma_latch=1;
//鎖存器(段碼)打開
anma_latch=0;
//鎖存器(段碼)關閉
Delay(100);
}
判斷歸零一個變數,最好緊跟在修改該值的後面,不用放在主循環里每次循環都要判斷,雖然你那沒多大問題但可讀性不夠好。。。
j=j+1;
if(j==8)
{j=0;}
② 51單片機,怎樣編程,讓所有的數碼管都顯示8,給出詳細編程,謝謝!
讓所有的數碼管都顯示8其實是最簡單的,將所有位碼都置為有效,段碼送8的碼就可以了,不需要掃描。
比如:P0為段碼,P2為位碼
ORG 0000H
LJMP MAIN
ORG 0030H
MAIN:
MOV P0,#7FH
MOV P2,#00H
SJMP $
END
③ 設計一位8段數碼管靜態顯示介面電路,選用單片機P0作數據信號,並列表寫出顯示0—9的顯示段碼
#include<reg51.h> // 包含51單片機寄存器定義的頭文件
/**************************************************
函數功能:延時函數,延時一段時間
***************************************************/
void delay(void)
{
unsigned char i,j;
for(i=0;i<255;i++)
for(j=0;j<255;j++)
;
}
/**************************************************
函數功能:主函數
***************************************************/
void main(void)
{
unsigned char i;
unsigned char code Tab[10]=;
//數碼管顯示0~9的段碼表,程序運行中當數組值不發生變化時,
//前面加關鍵字code ,可以大大節約單片機的存儲空間
P2=0x7f; //P2.7引腳輸出低電平,數碼顯示器第7位接通電源工作
while(1) //無限循環
{
for(i=0;i<10;i++)
{
P0=Tab[i]; //讓P0口輸出數字的段碼92H
delay(); //調用延時函數
}
}
}
另外,站長團上有產品團購,便宜有保證
④ 51單片機數碼管顯示8位二進制數程序,第6、7位永遠都只顯示0,其他位顯示正常。
MOV 26H,20H ;二進制數第6位送26H單元
MOV 20H,A
RR A
ANL 20H,#01H
MOV 27H,20H ;二進制數第7位送27H單元
這26H,27H是保存第6,7位數據的,但是延時慧粗子程序又用頃鬧26H,27H單元了,延時結束,這兩個單元永遠是0了。
DELAY: MOV 26H,#4 ;延時服務子程序
DLY1: MOV 27H,#250
DJNZ 27H,$
DJNZ 26H,DLY1
RET
這延時子程序要用29H,2AH,兩個單元就好雀碧罩了,還不如用R4,R5更方便呢,也不會出錯。這樣的
DELAY: MOV R4,#4 ;延時服務子程序
DLY1: MOV R5,#250
DJNZ R5,$
DJNZ R4,DLY1
RET
這多好哇
⑤ 單片機 按鍵控制8位數碼管顯示問題
關於數碼管的顯示,是顯示完一個位的是數字後,在顯示下一個位時要先把上一個位顯示徹底關閉掉,通常可以是把全部數碼管位全部顯示為空的狀態,談後在開下一個位的顯示(有延時),這樣在開下一個位的鎖存時上一個位的數據就不會跑到該位顯示,不然會在下一位顯示時會與上一個位的數字出現重影現象。。。
還有對於數碼管的顯示,最好是一次性顯示完全部數碼管,還沒有得位就顯示0ff(要記得初始化你的數組)。我個人不建議你這種顯示按位數變化方式。。。
for(i=0;i<j;i=i+1) //每次都顯示完8個數碼管比較好。。。
{
/*
在此增加把所有數碼管顯示為0FF狀態,全部位都打開顯示
*/
display=weima_table[i]; //數碼管需要顯示的位
weima_latch=1; //鎖存器(位碼)打開
weima_latch=0; //鎖存器(位碼)關閉
display=cunchudisplay[i]; //數碼管需要顯示的段
anma_latch=1; //鎖存器(段碼)打開
anma_latch=0; //鎖存器(段碼)關閉
Delay(100);
}
判斷歸零一個變數,最好緊跟在修改該值的後面,不用放在主循環里每次循環都要判斷,雖然你那沒多大問題但可讀性不夠好。。。
j=j+1;
if(j==8)
{j=0;}