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

实在不能给源程序的给个具体一点的算法也行,就是说我该怎样实现先显示0000然后到000F,然后又到0010--001FF……一直到FFFF/*单个数码管的动态显示*/#i... 实在不能给源程序的给个具体一点的算法也行,就是说我该怎样实现先显示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--);
}
展开
 我来答
做而论道
高能答主

推荐于2017-12-16 · 把复杂的事情简单说给你听
知道大有可为答主
回答量:3万
采纳率:80%
帮助的人:8341万
展开全部
/*四个数码管的动态显示*/

#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进制数。

程序,是借用了楼主的《单个显示程序》,但是,和楼主的电路,并不配套。
楼主的电路,并没有锁存器。
而程序中,却是使用锁存器的编程思路。
未必好用,试试看吧。
意法半导体(中国)投资有限公司
2020-01-15 广告
单片机(Microcontrollers)是一种集成电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计数器等功能(可能还包括显示驱动电路、脉宽调制... 点击进入详情页
本回答由意法半导体(中国)投资有限公司提供
太费劲呢
2013-04-05 · 超过36用户采纳过TA的回答
知道小有建树答主
回答量:109
采纳率:0%
帮助的人:58.7万
展开全部
你这种是需要动态扫描的方式实现多个数码管“一起”显示,
1、先把数码管的段码写出来,放到一维数组里,依次为你要显示的十六进制图形;然后做一个0~65536的全局变量whole_0,初值为零,在定时器中断里累加,做一个每16次whole_0自加1,whole_1自加1……
2、首先你要理解为什么“一起”打上引号,即具体实现的时候实质上不是一起的,先把这部分
3、编写个选位的子函数,一个整形入口参数(用来确定那个数码管亮),不需要返回值,这样为动态扫描做基础
4、在主程序中while(1)
{

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

位选数码管0;
送字形[whole_1];
延时;
……//实现动态扫描,反复,注意字形的消隐
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
fgale
2013-04-05 · TA获得超过1450个赞
知道小有建树答主
回答量:1857
采纳率:50%
帮助的人:545万
展开全部
设一个无符号的整形变量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);
}
}
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
chunyong88
2013-04-05 · TA获得超过325个赞
知道小有建树答主
回答量:208
采纳率:0%
帮助的人:186万
展开全部
你这样说写程序没有用的,要硬件与软件配合起来写才行的,给你一个思路吧,你可以把每一个数码管的段并在一起,然后记好每一个段的引脚,再后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表格吗,你要哪一个显示就把哪一个位选中,然后段把上面的表格值赋进去就能显示出来了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
yes__mcu
推荐于2018-09-01 · TA获得超过923个赞
知道小有建树答主
回答量:387
采纳率:0%
帮助的人:448万
展开全部
//段码由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 ++;
}
}
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式