最近,我用C语言写了一个单片机控制数字管显示的程序,范围为0~999,虽然代码简单,但期间却有很多弯路,写出来,希望对大家有所帮助。
首先说明功能实现和参数设置:
这个子函数是在NEC实现在9234单片机上,但应该适用于大多数单片机,即不同单片机的延迟不同,这仍然是他们自己的计算,没有具体介绍。
该子函数是四位数字管共阴动态显示,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 = temp00/100; shi = temp0/10;ge = temp;
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是为了屏蔽干扰。