數碼管由于價格便宜,使用簡單,在電器特別是家電領域(比如空調、熱水器和冰箱等)得到了極為廣泛的應用。在高校電子信息類專業單片機的教學過程中,數碼管動態顯示及實現方法是學生普遍反映較難掌握的內容。鑒于此,本文為大家帶來三個數碼管動態掃描顯示01234567程序介紹。
數碼管動態掃描顯示01234567程序一
原理圖
8個數碼管它的數據線并聯接到JP5, 位控制由8個PNP型三級管驅動后由JP8引出。
程序流程圖
匯編語言參考程序
ORG 0000H
AJMP MAIN
ORG 0080H
MAIN:
CLR P2.0 選中第一個數碼管
MOV P0,#28H 顯示0
LCALL DELAY 調用延時ORG
MOV P0,#0FFH 關顯示
SETB P2.0
CLR P2.1 選中第二個數碼管
MOV P0,#7EH 顯示1
LCALL DELAY
MOV P0,#0FFH
SETB P2.1
CLR P2.2 選中第三個數碼管
MOV P0,#0A2H 顯示2
LCALL DELAY
MOV P0,#0FFH
SETB P2.2
CLR P2.3 選中第四個數碼管
MOV P0,#62H 顯示3
LCALL DELAY
MOV P0,#0FFH
SETB P2.3
CLR P2.4 選中第五個數碼管
MOV P0,#74H 顯示4
LCALL DELAY
MOV P0,#0FFH
SETB P2.4
CLR P2.5 選中第六個數碼管
MOV P0,#61H 顯示5
LCALL DELAY
MOV P0,#0FFH
SETB P2.5
CLR P2.6 選中第七個數碼管
MOV P0,#21H 顯示6
LCALL DELAY
MOV P0,#0FFH
SETB P2.6
CLR P2.7 選中第八個數碼管
MOV P0,#7AH 顯示7
LCALL DELAY
SETB P2.7
MOV P0,#0FFH
AJMP MAIN 重新開始
DELAY: 延時子程序
MOV R7,#2
D1: MOV R6,#25
D2: DJNZ R6,D2
DJNZ R7,D1
RET
END
c語言參考程序
#include
#define uchar unsigned char //宏定義,為方便編程
#define uint unsigned int
#define DIGI P0 //宏定義,將P1口定義為數碼管
#define SELECT P2 //宏定義,將P2定義為數碼管選擇口
uchar digivalue[]={0x28,0x7e,0x0a2,0x62,0x74,0x61,0x21,0x7a,0x20,0x60};
//顯示的數字數組,依次為0,1,。。,9
uchar select[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //選擇數碼管數組,依次選擇1,2,。。,8
void delay() //延遲函數,決定數碼管跳變的間隔時間
{
uchar ii=200; //若發現數碼管閃爍,調節這里即可
while(ii--);
}
char code SST516[3] _at_ 0x003b; //仿真器插入代碼
main() //主函數
{
uchar i=0;
while(1)
{
for(i=0;i<8;i++) //8個數碼管輪流顯示
{
SELECT=select[i]; //選擇第i個數碼管
IGI=digivalue[i]; //顯示i
delay();
}
}
數碼管動態掃描顯示01234567程序二——51單片機動態顯示共陽數碼管01234567
原理圖
c語言程序
程序如下:
#include
#define uint unsigned int
#define uchar unsigned char
//共陽數碼管段碼表0-F
uchar code smg_dw[]={
0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,
0xc6,0xa1,0x86,0x8e};
//數碼管段位碼表0-F
//uchar code smg_wm[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //顯示01234567
uchar code smg_wm[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//顯示76543210
void delay_ms(uint); //延時子函數聲明
void main()
{
uchar i;
while(1)
{
for(i=0;i<8;i++)
{
P2=smg_wm[i];//選位碼
P0=smg_dw[i];//選段碼
delay_ms(5);//延時5ms
}
}
}
void delay_ms(uint z) //帶參數延時子函數
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
數碼管動態掃描顯示01234567程序三——CD4094數碼管動態顯示
動態顯示原理:原理上同一時刻只有一位LED是點亮的,但只要掃描的頻率足夠高(一般大于25Hz),由于人眼的視覺暫留特性,直觀上感覺卻是連續點亮的,這就是常說的動態掃描顯示。
動態掃描的頻率有一定的要求,頻率太低,LED將出現閃爍現象。如頻率太高,由于每個LED點亮的時間太短,LED的亮度太低,所以一般均取幾個ms左右為宜。
DG3000 動態顯示頭文件display_s.h
//----------------------------------------------------------
//程序作用:顯示頭文件display_s.h
//----------------------------------------------------------
#ifndef _display_
#define _display_
#include
sbit SDA=P2^6; //定義顯示管腳
sbit CLK=P2^7;
unsigned char data display_bit;
unsigned char code
led[20]={0xc0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf,0x89,0x8C};
//定義段碼
//延時程序
void delay(unsigned int k)
{ unsigned int i,j;
for(i=0;i
for(j=0;j<100;j++);
}
//數據傳輸
void send(unsigned char a)
{
unsigned char i;
for(i=0;i<8;i++)
{
if(_crol_(a,i)&0x80)
SDA=1;
else
SDA=0;
CLK=0;
CLK=1;
}
}
//顯示程序 8位LED數碼管掃描
void display(unsigned char display_buffer[8])
{
unsigned char i,k;
display_bit=0xfe;
for(i=0;i<8;i++)
{
k=led[display_buffer[i];
send(k);
P0=display_bit;
delay(0x01);
P0=0xff;
display_bit=_crol_(display_bit,1);
}
display_bit=0xfe;
8位數碼管動態顯示01234567(C51程序)
//----------------------------------------------------------
//程序作用:動態掃描顯示01234567
//----------------------------------------------------------
#include
#include
main()
{
unsigned char
a[8]={0x0,0x1,0x2,0x3,0x4,0x5,0x6,0x7};//顯示01234567
while(1)
{
display(a); //顯示數據
}
}
8.5 8位數碼管動態顯示01234567(匯編)
;----------------------------------------------------------
;程序作用:8位數碼管動態顯示01234567(匯編)
;----------------------------------------------------------
;定義變量
DBUF DATA 40H ;顯示緩沖區首址
SP_BT DATA 60H ;堆棧指針初值
; LED 位選
LED_CS1 BIT P0.0
LED_CS2 BIT P0.1
LED_CS3 BIT P0.2
LED_CS4 BIT P0.3
LED_CS5 BIT P0.4
LED_CS6 BIT P0.5
LED_CS7 BIT P0.6
LED_CS8 BIT P0.7
;4094接口
SDA_4094 BIT P2^6
CLK_4094 BIT P2^7
ORG 0000H
AJMP MAIN
;-------------------------------
ORG 0030H
MAIN: MOV SP,#60H
MOV R0,#0FFH;單元清零
RES1: MOV @R0,#0
DJNZ R0,RES1
MOV DBUF,#00H;顯示數據
MOV DBUF+1,#01H
MOV DBUF+2,#02H
MOV DBUF+3,#03H
MOV DBUF+4,#04H
MOV DBUF+5,#05H
MOV DBUF+6,#06H
MOV DBUF+7,#07H
SAMP1:
LCALL DIR ;調用顯示
SJMP SAMP1
;------------------------------------------------------
;顯示數據
;-------------------------------------------------------
DIR:
;顯示程序
MOV DPTR,#TABLE
MOV A,DBUF
MOVC A,@A+DPTR
ACALL DISP_da ;送段碼輸出
CLR LED_CS1 ;選通第1位數碼管
LCALL DELAY_4094
SETB LED_CS1 ;關閉顯示
MOV A,DBUF+1
MOVC A,@A+DPTR
//ANL A,#7FH;加小數點
ACALL DISP_da ;送段碼輸出
CLR LED_CS2;選通第1位數碼管
LCALL DELAY_4094
SETB LED_CS2;關閉顯示
MOV A,DBUF+2
MOVC A,@A+DPTR
ACALL DISP_da ;送段碼輸出
CLR LED_CS3 ;選通第1位數碼管
LCALL DELAY_4094
SETB LED_CS3 ;關閉顯示
MOV A,DBUF+3
MOVC A,@A+DPTR
ACALL DISP_da ;送段碼輸出
CLR LED_CS4;選通第1位數碼管
LCALL DELAY_4094
SETB LED_CS4;關閉顯示
MOV A,DBUF+4
MOVC A,@A+DPTR
ACALL DISP_da ;送段碼輸出
CLR LED_CS5 ;選通第1位數碼管
LCALL DELAY_4094
SETB LED_CS5 ;關閉顯示
MOV A,DBUF+5
MOVC A,@A+DPTR
// ANL A,#7FH;加小數點
ACALL DISP_da ;送段碼輸出
CLR LED_CS6;選通第1位數碼管
LCALL DELAY_4094
SETB LED_CS6;關閉顯示
MOV A,DBUF+6
MOVC A,@A+DPTR
ACALL DISP_da ;送段碼輸出
CLR LED_CS7 ;選通第1位數碼管
LCALL DELAY_4094
SETB LED_CS7 ;關閉顯示
MOV A,DBUF+7
MOVC A,@A+DPTR
ACALL DISP_da ;送段碼輸出
CLR LED_CS8;選通第1位數碼管
LCALL DELAY_4094
SETB LED_CS8;關閉顯示
;-------------------------------------
RET
TABLE: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H ;0~9
DB 88H,83H,0C6H,0A1H,86H,8EH ;A~F
;-------------------------延時子程序---------------------------------
DELAY_4094: MOV R4,#2 ;延時程序3,精確延時1000微秒
D_4094:MOV R5,#248
DJNZ R5,$
DJNZ R4,D_4094
RET
DISP_DA:
MOV R3,#08H
DUP: RLC A
MOV SDA_4094,C
CLR CLK_4094
SETB CLK_4094
DJNZ R3,DUP
RET
END