单片机数码管显示数字递增
扫描二维码
随时随地手机看文章
让单片机的数码管显示的数从0开始递增一直到255,然后重新置0,再递增,如此循环.
还是用到了将要显示的数进行百位,十位,个位的分离.
从这篇开始,以后的程序就要注意程序的规范性,与可读性了.源代码如下(已经成功调通):
#include#defineuintunsignedint#defineucharunsignedcharsbitsda=P1^0;sbitclk=P1^1;sbitdig1=P1^2;sbitdig2=P1^3;sbitdig3=P1^4;sbitdig4=P1^5;ucharcodetable[]={0x7e,0x0c,0xb6,0x9e,0xcc,0xda,0xfa,0x0e,0xfe,0xde};uchartimes;voidinit();voiddelay(uchar);voidwrite(uchar);voiddisplay(uchar);voidmain(){uchari=0;init();while(1){display(i);if(times>2){times=0;i++;if(i==256)i=0;}}}/**显示一个3位的整数**/voiddisplay(ucharnum){ucharbai,shi,ge;bai=num/100;shi=num%100/10;ge=num%10;/*显示个位*/dig4=0;write(table[ge]);delay(10);dig4=1;/*显示十位*/dig3=0;write(table[shi]);delay(10);dig3=1;/*显示百位*/dig2=0;write(table[bai]);delay(10);dig2=1;}/**程序初始化函数**/voidinit(){clk=0;times=0;TMOD=0x01;//定时器模式1TH0=(65536-50000)/256;//每500毫秒产生一次中断TL0=(65536-50000)%256;TR0=1;//开始计时EA=1;//打开总中断开关ET0=1;}/**向数据码管写入一个字节数据**/voidwrite(ucharu){uchari;for(i=0;i<8;i++){clk=1;sda=u&0x80;clk=0;u=u<<1;}}/**延迟函数**/voiddelay(uchart){ucharx,y;for(x=t;x>0;x--)for(y=101;y>0;y--);}/**1号中断**/voidtimer0()interrupt1{TH0=(65536-50000)/256;//每500毫秒产生一次中断TL0=(65536-50000)%256;times++;}