跪求单片机实验四位七段数码管显示程序!!!

2023-01-16

编程在四位数码管上显示0123四个数字,每经过一秒四个数字循环左移一位显示,依次是0123,1230,2301,……无限往复……
本人用的AT89S52单片机,使用的P1端口驱动数码管。
谢谢!! 我给你一个数码管代码,自己修改:

/*******************************************************************************
* 标题: 伟纳电子ME300B单片机开发系统演示程序 - LED数码管显示1-8 *
* 文件: wl004.C *
* 日期: 2004-1-5 *
* 版本: 1.0 *
* 作者: 伟纳电子 - Freeman *
* 邮箱: freeman@willar.com *
* 网站: http://www.willar.com *
********************************************************************************
* 描述: *
* LED数码管显示演示程序 *
* 在8个LED数码管上依次显示1,2,3,4,5,6,7,8 *
* *
* *
********************************************************************************
* 【版权】 Copyright(C)伟纳电子 www.willar.com All Rights Reserved *
* 【声明】 此程序仅用于学习与参考,引用请注明版权和作者信息! *
*******************************************************************************/

#include <reg51.h>
#include <intrins.h>

unsigned char data dis_digit;
unsigned char code dis_code[11]=0xc0,0xf9,0xa4,0xb0, // 0, 1, 2, 3
0x99,0x92,0x82,0xf8,0x80,0x90, 0xff;// 4, 5, 6, 7, 8, 9, off
unsigned char data dis_buf[8];
unsigned char data dis_index;

void main()

P0 = 0xff;
P2 = 0xff;
TMOD = 0x01;
TH0 = 0xFC;
TL0 = 0x17;
IE = 0x82;

dis_buf[0] = dis_code[0x1];
dis_buf[1] = dis_code[0x2];
dis_buf[2] = dis_code[0x3];
dis_buf[3] = dis_code[0x4];
dis_buf[4] = dis_code[0x5];
dis_buf[5] = dis_code[0x6];
dis_buf[6] = dis_code[0x7];
dis_buf[7] = dis_code[0x8];

dis_digit = 0xfe;
dis_index = 0;

TR0 = 1;
while(1);



void timer0() interrupt 1
// 定时器0中断服务程序, 用于数码管的动态扫描
// dis_index --- 显示索引, 用于标识当前显示的数码管和缓冲区的偏移量
// dis_digit --- 位选通值, 传送到P2口用于选通当前数码管的数值, 如等于0xfe时,
// 选通P2.0口数码管
// dis_buf --- 显于缓冲区基地址

TH0 = 0xFC;
TL0 = 0x17;

P2 = 0xff; // 先关闭所有数码管
P0 = dis_buf[dis_index]; // 显示代码传送到P0口
P2 = dis_digit; //

dis_digit = _crol_(dis_digit,1); // 位选通值左移, 下次中断时选通下一位数码管
dis_index++; //

dis_index &= 0x07; // 8个数码管全部扫描完一遍之后,再回到第一个开始下一次扫描


;********************************************************************************
;* 标题: 伟纳电子ME300B单片机开发系统演示程序 - LED数码管显示1-8 *
;* 文件: wl004.asm *
;* 日期: 2004-1-5 *
;* 版本: 1.0 *
;* 作者: 伟纳电子 - Freeman *
;* 邮箱: freeman@willar.com *
;* 网站: http://www.willar.com *
;********************************************************************************
;* 描述: *
;* LED数码管显示演示程序 *
;* 在8个LED数码管上依次显示1,2,3,4,5,6,7,8 *
;* *
;* *
;********************************************************************************
;* 【版权】 Copyright(C)伟纳电子 www.willar.com All Rights Reserved *
;* 【声明】 此程序仅用于学习与参考,引用请注明版权和作者信息! *
;********************************************************************************

CODE_SEG SEGMENT CODE

DATA_SEG SEGMENT DATA

RSEG DATA_SEG

dis_digit: DS 1
dis_index: DS 1
dis_buf: DS 8
stack: DS 20

;===========================================================

CSEG AT 00000H ; Reset向量
LJMP MAIN

CSEG AT 0000BH ; 定时器0中断向量

LJMP TIMER0

;===========================================================
RSEG CODE_SEG
MAIN:
MOV SP,#(stack-1) ; 初始化堆栈指针
MOV P0,#0FFH ; 初始化I/O口
MOV P2,#0FFH
MOV TMOD,#01H ; 初始化timer0
MOV TH0,#0FCH
MOV TL0,#017H
MOV IE,#082H

MOV DPTR, #DIS_CODE ; 设定显示初值
MOV A,#1
MOVC A,@A+DPTR
MOV dis_buf,A
MOV A,#2
MOVC A,@A+DPTR
MOV dis_buf+01H,A
MOV A,#3
MOVC A,@A+DPTR
MOV dis_buf+02H,A
MOV A,#4
MOVC A,@A+DPTR
MOV dis_buf+03H,A
MOV A,#5
MOVC A,@A+DPTR
MOV dis_buf+04H,A
MOV A,#6
MOVC A,@A+DPTR
MOV dis_buf+05H,A
MOV A,#7
MOVC A,@A+DPTR
MOV dis_buf+06H,A
MOV A,#8
MOVC A,@A+DPTR
MOV dis_buf+07H,A

MOV dis_digit,#0FEH ; 初始从第一个数码管开始扫描
MOV dis_index,A

SETB TR0 ; 启动定时器0,开始动态扫描显示

MAIN_LP:

; 主程序循环,增加其它代码

SJMP MAIN_LP

; END OF main

;===========================================================

USING 0
TIMER0:
; 定时器0中断服程序, 用于数码管的动态扫描
; DIS_INDEX --- 显示索引, 用于标识当前显示的数码管和缓冲区的偏移量
; DIS_DIGIT --- 位选通值, 传送到P2口用于选通当前数码管的数值, 如等于0xfe时,
; 选通P2.0口数码管
; DIS_BUF --- 显于缓冲区基地址

PUSH ACC
PUSH PSW
PUSH AR0

MOV TH0,#0FCH
MOV TL0,#017H

MOV P2,#0FFH ; 先关闭所有数码管

MOV A,#DIS_BUF ; 获得显示缓冲区基地址
ADD A,DIS_INDEX ; 获得偏移量
MOV R0,A ; R0 = 基地址 + 偏移量
MOV A,@R0 ; 获得显示代码
MOV P0,A ; 显示代码传送到P0口

MOV P2,DIS_DIGIT ;

MOV A,DIS_DIGIT ; 位选通值左移, 下次中断时选通下一位数码管
RL A
MOV DIS_DIGIT,A

INC DIS_INDEX ; DIS_INDEX加1, 下次中断时显示下一位
ANL DIS_INDEX,#0x07 ; 当DIS_INDEX等于8(0000 1000)时, 清0

POP AR0
POP PSW
POP ACC

RETI
; END OF timer0
;===========================================================

RSEG CODE_SEG
DIS_CODE:
DB 0C0H
DB 0F9H
DB 0A4H
DB 0B0H
DB 099H
DB 092H
DB 082H
DB 0F8H
DB 080H
DB 090H
DB 0FFH

END
参考知识1 也不知道你的硬件怎么样、、、给你一个参考吧、、、
#include
"STC12C5A.h"
//包含头文件
/***数字编码表0~9***/
unsigned
char
const
seg[10]
=
0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6;
//段选
unsigned
char
const
position[]=1,2,4,8;
//位选
sbit
HC595_SCK
=
P0^4;
sbit
HC595_RCK
=
P0^5;
sbit
HC595_RST
=
P0^6;
sbit
HC595_DAT
=
P0^7;
//延时函数(24M晶振下延时1ms)
void
delay_ms(unsigned
int
time)

unsigned
int
t;
for(;time>0;time--)

t
=
1500;
while(t--);


//向HC595发送一个字节
void
HC595_send_byte(unsigned
char
byte)

unsigned
char
i,temp;
for(i=0;i<=7;i++)

temp
=
byte&1<<i;
if(temp)

HC595_DAT
=
1;
//数据线

else

HC595_DAT=0;

//下面是写时序
HC595_SCK=1;
//SCK(11脚)
HC595_SCK=0;

HC595_RCK=0;
//RCK(12脚)
HC595_RCK=1;

//显示一个数num
void
SMG_ShowNum(unsigned
char
num)

HC595_send_byte(seg[num]);

void
SMG_Display(unsigned
int
dat)

SMG_ShowNum(dat/1000);
P0
=
(P0&0xf0)|position[0];
delay_ms(2);
SMG_ShowNum((dat%1000)/100);
P0
=
(P0&0xf0)|position[1];
delay_ms(2);
SMG_ShowNum(dat%100/10);
P0
=
(P0&0xf0)|position[2];
delay_ms(2);
SMG_ShowNum(dat%10);
P0
=
(P0&0xf0)|position[3];
delay_ms(2);

//主函数
void
main()

unsigned
int
num=0;
unsigned
char
time=0;
P0=0X00;
//初始化低四位为高电平,使能四位数码管
HC595_RST=0;
//HC595的复位端,不能让它复位
while(1)

num
=
(num+1)%10000;
//动态显示0~9999
time
=
100;
while(time--)
SMG_Display(num);

参考知识B 兄弟我给你发了
看看怎么样??
参考知识C 这个很简单你找个例程该该就好了别来叫别人给现成的那对你没啥提高 参考知识D 手上没现成的程序

还有 显示方式是并行还是串行的 驱动用的是什么芯片啊 数码管共阴还是共阳的? 问详细才有人答啊

相似知识
两个 四位七段LED数码管该如何连接 他们之间不是直接连在一起的,是通过单片机联系起来的,每一个数码管有4个位选信号。其他的一些口则连接在l\o口上。。参考知识1除四个位选信号引脚不要相连,其他的相同位置引脚两两连起来.再分别连到
共阳极四位七段数码管(12个引脚)怎么连接到单片机上啊 参考知识1哦,这个啊……正面看的话,上面6脚,下面6脚,共12脚上面从左到右是1,a,f,2,3,b下面从左到右是e,d,dp,c,g,4其中1,2,3,4是4个数码管的位选,因为是共阳,所以这几脚高
共阳极四位七段数码管(12个引脚)怎么连接到单片机上啊 哦,这个啊……正面看的话,上面6脚,下面6脚,共12脚上面从左到右是1,a,f,2,3,b下面从左到右是e,d,dp,c,g,4其中1,2,3,4是4个数码管的位选,因为是共阳,所以这几脚高电平时才有
如何驱动四位七段数码管? 参考知识1用三极管驱动啊,只用动态扫描或者静态显示都行
四位七段LED数码管显示 参考知识1引脚1-7是让他那7段显示的,分别对应一个段10-13是片选1:e2:d3:Ca4:c5:Dp6:b7:a8:Ca9:f10:g 参考知识B循环P1输出1的编码,13脚打开,延时;P1输出2
共阳极四位七段数码管(12个引脚)a段怎么不会亮?求解答 四位七段数码管,12个引脚=三脚7段;有可能有位选和段选,共阳极时A不亮代表驱动地电位未置位。参考知识1可以肯定是接触不亮,不过具体是数码管内部还是外部就不好说了
为啥四位数码管只有6个引脚 参考知识1stc单片机驱动。四位数码管是一种半导体发光器件,因为是属于stc单片机驱动,导致只有6个引脚,其基本单元是发光二极管。
四位七段数码管在PCB要怎么找到 参考知识1原理图中在PLACEPART的LibRef中输入DPY_7-SEG_DP,找到,在添加PCB封装的封装库时,加选internationalrectifier元器件封装库,如果有特殊要求的话,