专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
PIC单片机
8个数码管动态显示高位为0时怎么清除?
2020-02-08 09:13
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
51单片机
7315
20
20
显示有8个数码管 比如现在 显示的是 12345678 但是如果是 显示 00000001的话 我只需要他显示 一个 1 其他的 0 就全部熄灭
如果是 00000010 的话 我只要他显示 10 其他的 0 也全部熄灭
请求 这种算法 怎么实现 ? 谢谢!
友情提示:
此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
20条回答
vjcmain
2020-02-09 09:16
#include <avr/io.h>
#include <avr/interrupt.h>
unsigned int flag=0;
unsigned char count=0;
unsigned int num=0;
//==================================================
const unsigned char seg[]={ 0xC0, // 0
0xF9, // 1
0xA4, // 2
0xB0, // 3
0x99, // 4
0x92, // 5
0x82, // 6
0xF8, // 7
0x80, // 8
0x90 // 9
};
//==================================================
//IO端口初始化
void PortInit(void)
{
DDRA=0XFF;
PORTA=0X00;
DDRB=0XFF;
PORTB=0XFF;
}
//Timer0初始化
void Timer0Init(void)
{
TCCR0 = 0x00; //stop
TCNT0 = 0x06; //set count
OCR0 = 0xFA; //set compare
TCCR0 = 0x03; //start timer
}
//==================================================
//定时器0溢出中断服务程序
ISR(TIMER0_OVF_vect)
{
TCNT0=0X06;
flag++;
count++;
switch(count)
{
case 1:if(num/1000){PORTA=0X01;PORTB=seg[num/1000];}else PORTB=0XFF;break;
case 2:if(((num/1000)+(num%1000/100))){PORTA=0X02;PORTB=seg[num%1000/100];}else PORTB=0XFF;break;
case 3:if(((num/1000)+(num%1000/100)+(num%100/10))){PORTA=0X04;PORTB=seg[num%100/10];}else PORTB=0XFF;break;
case 4:PORTA=0X08;PORTB=seg[num%10];break;
case 6:count=0;break;
default:break;
}
if (flag==100)
{
flag=0;
num++;
if(num==9999)
{
num=0;
}
}
}
//==================================================
//主函数
int main(void)
{
cli();
TIMSK = 0x01; //timer interrupt sources
PortInit();
Timer0Init();
sei();
//在这继续添加你的代码
while(1){
;
}
}
加载中...
查看其它20个回答
一周热门
更多
>
相关问题
PIC单片机不同的IO口驱动74HC573驱动共阴极的数码管,有的段不亮
1 个回答
一种简单精确的pic延时方法
21 个回答
谁熟悉PIC的产品发布时间的,帮看看PIC18F47K40啥版本IDE能开发
12 个回答
求AN1078对应的源代码下载地址
5 个回答
PIC单片机应用技巧
4 个回答
相关文章
一种用PIC单片机主时钟驱动的老式挂钟
0个评论
×
关闭
采纳回答
向帮助了您的知道网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
PIC单片机
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
×
付费偷看金额在0.1-10元之间
确定
×
关闭
您已邀请
0
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
#include <avr/interrupt.h>
unsigned int flag=0;
unsigned char count=0;
unsigned int num=0;
//==================================================
const unsigned char seg[]={ 0xC0, // 0
0xF9, // 1
0xA4, // 2
0xB0, // 3
0x99, // 4
0x92, // 5
0x82, // 6
0xF8, // 7
0x80, // 8
0x90 // 9
};
//==================================================
//IO端口初始化
void PortInit(void)
{
DDRA=0XFF;
PORTA=0X00;
DDRB=0XFF;
PORTB=0XFF;
}
//Timer0初始化
void Timer0Init(void)
{
TCCR0 = 0x00; //stop
TCNT0 = 0x06; //set count
OCR0 = 0xFA; //set compare
TCCR0 = 0x03; //start timer
}
//==================================================
//定时器0溢出中断服务程序
ISR(TIMER0_OVF_vect)
{
TCNT0=0X06;
flag++;
count++;
switch(count)
{
case 1:if(num/1000){PORTA=0X01;PORTB=seg[num/1000];}else PORTB=0XFF;break;
case 2:if(((num/1000)+(num%1000/100))){PORTA=0X02;PORTB=seg[num%1000/100];}else PORTB=0XFF;break;
case 3:if(((num/1000)+(num%1000/100)+(num%100/10))){PORTA=0X04;PORTB=seg[num%100/10];}else PORTB=0XFF;break;
case 4:PORTA=0X08;PORTB=seg[num%10];break;
case 6:count=0;break;
default:break;
}
if (flag==100)
{
flag=0;
num++;
if(num==9999)
{
num=0;
}
}
}
//==================================================
//主函数
int main(void)
{
cli();
TIMSK = 0x01; //timer interrupt sources
PortInit();
Timer0Init();
sei();
//在这继续添加你的代码
while(1){
;
}
}
一周热门 更多>