单片机实现4位一体数码管显示0000—FFFF的16进制(C语言编程)

2024-12-25 08:59:57
推荐回答(5个)
回答1:

/*四个数码管的动态显示*/

#include
#define uint unsigned int
#define uchar unsigned char
sbit du = P2^6;
sbit we = P2^7;
uchar code table[] = {
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uint a;
//---------------------------------------------
void delayms(uint xms)
{
uint i, j;
for(i=xms;i>0;i--) for(j=110;j>0;j--);
}
//---------------------------------------------
void disp()
{
we = 1; P0 = 0xf7; we = 0; //锁存开启 个位 锁存关闭
P0 = table[a % 256 % 16]; delayms(5); //输出个位数
we = 1; P0 = 0xff; we = 0; //锁存开启 消隐 锁存关闭

we = 1; P0 = 0xfb; we = 0; //锁存开启 十位 锁存关闭
P0 = table[a % 256 / 16]; delayms(5); //输出十位数
we = 1; P0 = 0xff; we = 0; //锁存开启 消隐 锁存关闭

we = 1; P0 = 0xfd; we = 0; //锁存开启 百位 锁存关闭
P0 = table[a / 256 % 16]; delayms(5); //输出百位数
we = 1; P0 = 0xff; we = 0; //锁存开启 消隐 锁存关闭

we = 1; P0 = 0xfe; we = 0; //锁存开启 千位 锁存关闭
P0 = table[a / 256 / 16]; delayms(5); //输出千位数
we = 1; P0 = 0xff; we = 0; //锁存开启 消隐 锁存关闭
}
//---------------------------------------------
void main()
{
char i;
a = 0;
while(1) {
for (i = 0; i < 20; i++) disp();
a++;
}
}
//---------------------------------------------

上述的《千百十个》四个位,实际上,显示的是16进制数。

程序,是借用了楼主的《单个显示程序》,但是,和楼主的电路,并不配套。
楼主的电路,并没有锁存器。
而程序中,却是使用锁存器的编程思路。
未必好用,试试看吧。

回答2:

你这种是需要动态扫描的方式实现多个数码管“一起”显示,
1、先把数码管的段码写出来,放到一维数组里,依次为你要显示的十六进制图形;然后做一个0~65536的全局变量whole_0,初值为零,在定时器中断里累加,做一个每16次whole_0自加1,whole_1自加1……
2、首先你要理解为什么“一起”打上引号,即具体实现的时候实质上不是一起的,先把这部分
3、编写个选位的子函数,一个整形入口参数(用来确定那个数码管亮),不需要返回值,这样为动态扫描做基础
4、在主程序中while(1)
{

位选数码管0;
送字形[whole_0];
延时;

位选数码管0;
送字形[whole_1];
延时;
……//实现动态扫描,反复,注意字形的消隐
}

回答3:

设一个无符号的整形变量X,正好是0~65535即十六进制的0~ffff。
你只管加就可以了,显示时,变量X&0x0f是最后一位,(X>>4)&0XF是倒数第二
>>8 第二 >>12第一,根据8段码显示就好了

回答4:

你这样说写程序没有用的,要硬件与软件配合起来写才行的,给你一个思路吧,你可以把每一个数码管的段并在一起,然后记好每一个段的引脚,再后4个位接到单片机的引脚上面,再记好位的引脚,最后你让把每一位按照数码管A-H编好程序,再执行到每一个数码管扫描就行,注意上面说的接到单片机引脚,最好有一个功率放大器,这样不至于损坏单片机,
你看上面都写得清清楚楚的,你就按照硬件把每一个脚抄到单片里面里,查表扫描就完成啦

回答5:

//段码由P0口输出,P2.3-P2.0依次接位选的高到低
#include
typedef unsigned char u8;
typedef unsigned int u16;
void Delay(void);
void Disp(void);
u16 Cnt;
u8 code LED[]={
0x3F,// 0
0x06,// 1
0x5B,// 2
0x4F,// 3
0x66,// 4
0x6D,// 5
0x7D,// 6
0x07,// 7
0x7F,// 8
0x6F,// 9
0x77,// A
0x7C,// B
0x39,// C
0x5E,// D
0x79,// E
0x71// F
};
void Delay(void)
{
u16 i;
for(i = 0;i < 200;i ++)
;
}
void Disp(void)
{
u8 i,k = 0x01;
for(i = 0;i < 4;i ++)
{
P0 = LED[(Cnt >> (i * 4)) & 0x000f];
P2 = k | 0xf0;
k <<= 1;
Delay();
P0 = 0xff;
P2 &= 0xf0;
}
}
void main(void)
{
u8 i;
Cnt = 0;
while(1)
{
for(i = 0;i < 100;i ++)//显示100次,显示值加1
{
Disp();
}
Cnt ++;
}
}