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

实在不能给源程序的给个具体一点的算法也行,就是说我该怎样实现先显示0000然后到000F,然后又到0010--001FF……一直到FFFF

/*单个数码管的动态显示*/#include<reg52.h>
#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};
void delayms(uint);
void main()
{
while(1)
{
uint a;
we=1; //锁存开启
P0=0xf7;
we=0; //锁存关闭
for(a=0;a<=15;a++) //从“0”显示到“F”
{
P0=table[a];
delayms(500);
}
}
}
void delayms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}

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

#include<reg52.h>
#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进制数。

程序,是借用了楼主的《单个显示程序》,但是,和楼主的电路,并不配套。
楼主的电路,并没有锁存器。
而程序中,却是使用锁存器的编程思路。
未必好用,试试看吧。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-04-05
你这种是需要动态扫描的方式实现多个数码管“一起”显示,
1、先把数码管的段码写出来,放到一维数组里,依次为你要显示的十六进制图形;然后做一个0~65536的全局变量whole_0,初值为零,在定时器中断里累加,做一个每16次whole_0自加1,whole_1自加1……
2、首先你要理解为什么“一起”打上引号,即具体实现的时候实质上不是一起的,先把这部分
3、编写个选位的子函数,一个整形入口参数(用来确定那个数码管亮),不需要返回值,这样为动态扫描做基础
4、在主程序中while(1)
{

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

位选数码管0;
送字形[whole_1];
延时;
……//实现动态扫描,反复,注意字形的消隐
}
第2个回答  2013-04-05
设一个无符号的整形变量X,正好是0~65535即十六进制的0~ffff。
你只管加就可以了,显示时,变量X&0x0f是最后一位,(X>>4)&0XF是倒数第二
>>8 第二 >>12第一,根据8段码显示就好了追问

还是有点不懂、怎么加啊?有没有详细的资料哈?
void main()
{
while(1)
{
uint a;
we=1; //锁存开启
P0=0xf7;
we=0; //锁存关闭
for(a=0;a<=15;a++) //从“0”显示到“F”
{
P0=table[a];
delayms(500);
}
}
}

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

void main()
{
while(1)
{
uint a;
we=1; //锁存开启
P0=0xf7;
we=0; //锁存关闭
for(a=0;a<=15;a++) //从“0”显示到“F”
{
P0=table[a];
delayms(500);
}
}
}

追答

你看上面不是有code table表格吗,你要哪一个显示就把哪一个位选中,然后段把上面的表格值赋进去就能显示出来了

追问

问题是我要一次性四个数码管全部都亮,然后慢慢的从0000-FFFF显示,单个的我知道弄哈……四个的话怎么写表格?
/*单个数码管的动态显示*/
#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};
void delayms(uint);

追答

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

只要单片可以扫描正常工作那就好了,你把每一个数码管的分时间显示,也注是动态显示不就完成工作啦,意思就是分四个周期每一个周期显示一个数码管,你5MS换一个数码管显示,那么人眼就看不出来啦

第4个回答  推荐于2018-09-01
//段码由P0口输出,P2.3-P2.0依次接位选的高到低
#include<reg51.h>
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 ++;
}
}本回答被网友采纳
相似回答