您的位置:首页 > 编程语言 > C语言/C++

单片机数码管动态显示—C语言版

2009-05-24 23:16 393 查看
最近自己用C语言写了个单片机控制数码管显示的程序,范围是0~9999的,虽然代码简单,但是期间却又不少的弯路,写出来,希望对大家能有所帮助。

首先要说明一下功能实现和参数设置:

这个子函数是在NEC9234单片机上实现的,不过对大部分单片机应该都适用的,就是不同的单片机里的延时有差别,这个还是自己算吧,就不具体介绍了。

这个子函数是四位数码管共阴动态显示,display_buff是段选,display_bit是位选。

代码如下:
unsigned int display_buff[4];
unsigned int display_bit[4]={0x01,0x02,0x04,0x08};
unsigned int buff={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
/***共阴极显示:**** 0 ** 1 *** 2 ** 3 ** 4 ** 5 ** 6 ** 7 ** 8 ** 9 ***/
unsigned int qian,bai,shi,ge;

void display(unsigned int temp)
{
int k;

qian = temp/1000; //问题1
bai = temp%1000/100;
shi = temp%100/10;
ge = temp%10;

display_buff[0] = buff[ge];
display_buff[1] = buff[shi];
display_buff[2] = buff[bai];
display_buff[3] = buff[qian];

if(qian == 0) /**如果高位为0,则不显示**/
{
display_buff[3] = 0x00;
if(bai == 0)
{
display_buff[2] = 0x00;
if(shi == 0)
{
display_buff[1] = 0x00;
}
}
}

for(k=0; k<4; k++) //问题2
{
P0 = display_bit[k];
P4 = display_buff[k];
delay(); //延时
P4 = 0x00; //问题3
}
}

问题点:

1)首先是qian,bai,shi,ge变量的设置,最初是设置为局部变量,但是在运行的时候只是显示最高位,后来喜爱发现是变量设置的问题,因为如果设置成局部变量的话,在执行完display()函数后局部变量的值就会出现错误,所以应当设置为全局变量。

2)这个地方由于粗心,让我费了不少功夫,因为用的是共阴极显示,所以我也没有想硬件方面的问题(数码管的共阴极是用三极管控制的),就想当然的用{0xfe,0xfd,0xfb,0xf7}来控制数码管的位选,所以怎么弄也不对,让我很恼火……呵呵,后来在检查硬件的时候才发现我一开始就错了,看来细心是相当的重要呢O(∩_∩)O~

3)这个问题比较小,但是也挺重要的,如果没有的话,会在其它数码管上有非常微小的显示,让人看着不爽,加上P4 = 0x00是为了屏蔽干扰。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: