专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
PIC单片机
8个数码管动态显示高位为0时怎么清除?
2020-02-08 09:13
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
51单片机
7130
20
20
显示有8个数码管 比如现在 显示的是 12345678 但是如果是 显示 00000001的话 我只需要他显示 一个 1 其他的 0 就全部熄灭
如果是 00000010 的话 我只要他显示 10 其他的 0 也全部熄灭
请求 这种算法 怎么实现 ? 谢谢!
友情提示:
此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
19条回答
jj3055
1楼-- · 2020-02-08 16:42
//**********************************************************************
//项目:初中声学综合实验仪频率测试部分程序
//版本:
//
//编写日期:2009年4月14日
//编写人员:姜春杰
//
//修改日期:
//修改人员:
//
//处理器芯片:ATmega16(晶振频率:4.194304 MHz)
//
//输入口:T1(频率测试输入)
//输出口:PA(LED位驱动)
// PC(LED段驱动)
//
//C语言编译器:ICCAVR 6.31A
//
//功能描述:
//
//
//
//*********************************************************************
#include "iom16V.h"
#include "macros.h"
#pragma abs_address:0x0400
const unsigned char LED_play[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};
#pragma end_abs_address
//LED显示译码。
unsigned int pl; //定时器T1捕获数据。
unsigned char LED_data[5]={0,0,0,0,0}; //LED位数据。
//**********************************************************************
//延时子程序
//**********************************************************************
void delay_1ms(void) //延时1mS。
{
unsigned int i;
for (i=0;i<100;i++);
}
void delay_ms(unsigned int n) //mS级延时。
{
unsigned int i;
for(i=0;i<n;i++)
{
delay_1ms();
}
}
//********************************************************************
//十进制转换
//********************************************************************
void bcd(unsigned int a)
{
LED_data[4]=a/10000;
a=a%10000;
LED_data[3]=a/1000;
a=a%1000;
LED_data[2]=a/100;
a=a%100;
LED_data[1]=a/10;
LED_data[0]=a%10;
}
//********************************************************************
//LED高位灭零。
//********************************************************************
void LED_del_0(void)
{
unsigned char a,b,c;
a=(LED_data[4]+LED_data[3]);
b=(LED_data[4]+LED_data[3]+LED_data[2]);
c=(LED_data[4]+LED_data[3]+LED_data[2]+LED_data[1]);
CLI();
if(LED_data[4]==0) LED_data[4]=10;
if(a==0) LED_data[3]=10;
if(b==0) LED_data[2]=10;
if(c==0) LED_data[1]=10;
SEI();
}
//*********************************************************************
//T1捕获中断处理
//*********************************************************************
#pragma interrupt_handler time_capt:6
void time_capt(void)
{
TCNT1=0x0000; //T1计数器TCNT1归零。
pl=ICR1; //捕获数据送pl。
bcd(pl); //十进制转换。
LED_del_0(); //LED高位灭零。
TIMSK|=(1<<TICIE1);
SEI(); //开中断。
}
//*********************************************************************
//定时器初始化
//*********************************************************************
void timer_reset(void)
{
TCCR2|=(1<<COM20)|(1<<WGM21)|(1<<CS22)|(1<<CS21)|(1<<CS20);
TCCR2&=~((1<<COM21)|(1<<WGM20));
OCR2=0x07;
TCNT2=0x00; //T2设定为CTC模式。
TCCR0|=(1<<WGM01)|(1<<WGM00)|(1<<COM01)|(1<<COM00)|(1<<CS02)|(1<<CS01);
TCCR0&=~(1<<CS00);
TCNT0=0x00;
OCR0=0X80; //T0设定为快速PWM模式。
TCCR1A=0x00;
TCCR1B|=(1<<ICES1)|(1<<CS12)|(1<<CS11)|(1<<CS10);
TCCR1B&=~((1<<ICNC1)|(1<<WGM13)|(1<<WGM12));
TCNT1=0x0000; //T1设定为普通模式,ICP1端口上升沿捕获。
TIMSK|=(1<<TICIE1);
SEI(); //开TI捕获中断,开全局中断
}
//**********************************************************************
//LED扫描显示。
//**********************************************************************
void LED_display(void)
{
unsigned char i,j;
while(1)
{
for(i=0;i<5;i++)
{
LED_del_0();
PORTA=0;
PORTC=~(1<<i);
j=LED_data
;
PORTA=LED_play[j];
delay_ms(20);
};
};
}
//*********************************************************************
//main
//*********************************************************************
void main(void)
{
DDRA=0xFF;
DDRC=0xFF;
DDRD|=(1<<PD7);
DDRD&=~(1<<PIND6);
DDRB|=(1<<PB3);
DDRB&=~((1<<PINB0)|(1<<PINB1)); //IO端口初始化。
timer_reset(); //定时器初始化。
pl=0x0000;
bcd(pl); //显示数据初始化。
LED_display(); //LED扫描显示。
}
加载中...
anxiangbo
2楼-- · 2020-02-08 10:08
把其他的不需要显示的关闭就可以了。很简单的
加载中...
shiqiang
3楼-- · 2020-02-08 14:49
把其他的不需要显示的关闭就可以了。很简单的
加载中...
ls81250
4楼-- · 2020-02-08 19:05
精彩回答 2 元偷偷看……
加载中...
qs0511
5楼-- · 2020-02-08 23:14
把其他的不需要显示的关闭就可以了。很简单的
加载中...
Etual
6楼-- · 2020-02-09 04:52
把其他的不需要显示的关闭就可以了。很简单的
加载中...
1
2
3
4
下一页
一周热门
更多
>
相关问题
PIC单片机不同的IO口驱动74HC573驱动共阴极的数码管,有的段不亮
1 个回答
一种简单精确的pic延时方法
21 个回答
谁熟悉PIC的产品发布时间的,帮看看PIC18F47K40啥版本IDE能开发
12 个回答
求AN1078对应的源代码下载地址
5 个回答
PIC单片机应用技巧
4 个回答
串口无法连续接收数据
2 个回答
求助:dsPIC33F串口通信,如何发送字符串
4 个回答
PIC45K40 IOC(interrupt-on-change)功能
2 个回答
相关文章
一种用PIC单片机主时钟驱动的老式挂钟
0个评论
×
关闭
采纳回答
向帮助了您的网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
PIC单片机
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
关闭
您已邀请
15
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
//项目:初中声学综合实验仪频率测试部分程序
//版本:
//
//编写日期:2009年4月14日
//编写人员:姜春杰
//
//修改日期:
//修改人员:
//
//处理器芯片:ATmega16(晶振频率:4.194304 MHz)
//
//输入口:T1(频率测试输入)
//输出口:PA(LED位驱动)
// PC(LED段驱动)
//
//C语言编译器:ICCAVR 6.31A
//
//功能描述:
//
//
//
//*********************************************************************
#include "iom16V.h"
#include "macros.h"
#pragma abs_address:0x0400
const unsigned char LED_play[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};
#pragma end_abs_address
//LED显示译码。
unsigned int pl; //定时器T1捕获数据。
unsigned char LED_data[5]={0,0,0,0,0}; //LED位数据。
//**********************************************************************
//延时子程序
//**********************************************************************
void delay_1ms(void) //延时1mS。
{
unsigned int i;
for (i=0;i<100;i++);
}
void delay_ms(unsigned int n) //mS级延时。
{
unsigned int i;
for(i=0;i<n;i++)
{
delay_1ms();
}
}
//********************************************************************
//十进制转换
//********************************************************************
void bcd(unsigned int a)
{
LED_data[4]=a/10000;
a=a%10000;
LED_data[3]=a/1000;
a=a%1000;
LED_data[2]=a/100;
a=a%100;
LED_data[1]=a/10;
LED_data[0]=a%10;
}
//********************************************************************
//LED高位灭零。
//********************************************************************
void LED_del_0(void)
{
unsigned char a,b,c;
a=(LED_data[4]+LED_data[3]);
b=(LED_data[4]+LED_data[3]+LED_data[2]);
c=(LED_data[4]+LED_data[3]+LED_data[2]+LED_data[1]);
CLI();
if(LED_data[4]==0) LED_data[4]=10;
if(a==0) LED_data[3]=10;
if(b==0) LED_data[2]=10;
if(c==0) LED_data[1]=10;
SEI();
}
//*********************************************************************
//T1捕获中断处理
//*********************************************************************
#pragma interrupt_handler time_capt:6
void time_capt(void)
{
TCNT1=0x0000; //T1计数器TCNT1归零。
pl=ICR1; //捕获数据送pl。
bcd(pl); //十进制转换。
LED_del_0(); //LED高位灭零。
TIMSK|=(1<<TICIE1);
SEI(); //开中断。
}
//*********************************************************************
//定时器初始化
//*********************************************************************
void timer_reset(void)
{
TCCR2|=(1<<COM20)|(1<<WGM21)|(1<<CS22)|(1<<CS21)|(1<<CS20);
TCCR2&=~((1<<COM21)|(1<<WGM20));
OCR2=0x07;
TCNT2=0x00; //T2设定为CTC模式。
TCCR0|=(1<<WGM01)|(1<<WGM00)|(1<<COM01)|(1<<COM00)|(1<<CS02)|(1<<CS01);
TCCR0&=~(1<<CS00);
TCNT0=0x00;
OCR0=0X80; //T0设定为快速PWM模式。
TCCR1A=0x00;
TCCR1B|=(1<<ICES1)|(1<<CS12)|(1<<CS11)|(1<<CS10);
TCCR1B&=~((1<<ICNC1)|(1<<WGM13)|(1<<WGM12));
TCNT1=0x0000; //T1设定为普通模式,ICP1端口上升沿捕获。
TIMSK|=(1<<TICIE1);
SEI(); //开TI捕获中断,开全局中断
}
//**********************************************************************
//LED扫描显示。
//**********************************************************************
void LED_display(void)
{
unsigned char i,j;
while(1)
{
for(i=0;i<5;i++)
{
LED_del_0();
PORTA=0;
PORTC=~(1<<i);
j=LED_data;
PORTA=LED_play[j];
delay_ms(20);
};
};
}
//*********************************************************************
//main
//*********************************************************************
void main(void)
{
DDRA=0xFF;
DDRC=0xFF;
DDRD|=(1<<PD7);
DDRD&=~(1<<PIND6);
DDRB|=(1<<PB3);
DDRB&=~((1<<PINB0)|(1<<PINB1)); //IO端口初始化。
timer_reset(); //定时器初始化。
pl=0x0000;
bcd(pl); //显示数据初始化。
LED_display(); //LED扫描显示。
}
一周热门 更多>