您好,欢迎来电子发烧友网! ,新用户?[免费注册]

您的位置:电子发烧友网>电子元器件>数码管>

cd4094数码管动态显示 - 数码管动态扫描显示01234567程序(三种方案)

2018年01月29日 11:24 电子发烧友整理 作者: 用户评论(0

数码管动态扫描显示01234567程序三——CD4094数码管动态显示

动态显示原理:原理上同一时刻只有一位LED是点亮的,但只要扫描的频率足够高(一般大于25Hz),由于人眼的视觉暂留特性,直观上感觉却是连续点亮的,这就是常说的动态扫描显示。

动态扫描的频率有一定的要求,频率太低,LED将出现闪烁现象。如频率太高,由于每个LED点亮的时间太短,LED的亮度太低,所以一般均取几个ms左右为宜。

DG3000 动态显示头文件display_s.h

//----------------------------------------------------------

//程序作用:显示头文件display_s.h

//----------------------------------------------------------

#ifndef _display_

#define _display_

#include < p=""> <>

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< p=""> <>

#include p=""> >

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

非常好我支持^.^

(7) 58.3%

不好我反对

(5) 41.7%

( 发表人:李建兵 )

      发表评论

      用户评论
      评价:好评中评差评

      发表评论,获取积分! 请遵守相关规定!