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

2024-12-27 12:07:42
推荐回答(5个)
回答1:

我给你一个数码管代码,自己修改:

/*******************************************************************************
* 标题: 伟纳电子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
#include

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

回答2:

也不知道你的硬件怎么样、、、给你一个参考吧、、、
#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<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);
}
}

回答3:

兄弟我给你发了
看看怎么样??

回答4:

这个很简单你找个例程该该就好了别来叫别人给现成的那对你没啥提高

回答5:

手上没现成的程序

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