單片機數(shù)碼管顯示數(shù)字遞增
讓單片機的數(shù)碼管顯示的數(shù)從0開始遞增一直到255,然后重新置0,再遞增,如此循環(huán).
還是用到了將要顯示的數(shù)進行百位,十位,個位的分離.
從這篇開始,以后的程序就要注意程序的規(guī)范性,與可讀性了.源代碼如下(已經成功調通):
#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位的整數(shù)**/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;}/**程序初始化函數(shù)**/voidinit(){clk=0;times=0;TMOD=0x01;//定時器模式1TH0=(65536-50000)/256;//每500毫秒產生一次中斷TL0=(65536-50000)%256;TR0=1;//開始計時EA=1;//打開總中斷開關ET0=1;}/**向數(shù)據碼管寫入一個字節(jié)數(shù)據**/voidwrite(ucharu){uchari;for(i=0;i<8;i++){clk=1;sda=u&0x80;clk=0;u=u<<1;}}/**延遲函數(shù)**/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++;}