/* 這是個(gè)四位數(shù)10進(jìn)制數(shù)碼顯示程序,最大可顯示9999,因?yàn)?位通常最大數(shù)只能到255,利用兩位最大十進(jìn)數(shù)99,小于3位數(shù)255,可以 正常顯示.設(shè)計(jì)想法就利用兩對(duì)兩位數(shù)值的遞加來實(shí)現(xiàn)最大數(shù)顯9999的值.當(dāng)然可以參考這個(gè)做更多位的.可以做成10進(jìn)制秒表,不過 我中斷停留程序還沒學(xué),就這些吧.希望有人能幫忙多提見解. */ #include"reg52.h" #include"intrins.h" #define uint unsigned int #define uchar unsigned char sbit duan=P2^6; sbit wei=P2^7; uchar temp1,temp2,aa,qian,bai,shi,ge; void delay(uint z); uchar code table[]={ 0x3f,0x06,0x5b,0x4f, 0x66 ,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71}; void display(uchar qian,uchar bai,uchar shi,uchar ge); void init(); void main() { init(); //中斷初始化 while(1) /*步驟四,就是段顯值遞加程序設(shè)計(jì),如下*/ { if(aa==20) //相當(dāng)于顯數(shù)亮停留的時(shí)間必須小于一個(gè)周期256,否則將數(shù)顯將一直亮0000,不懂解釋的對(duì)不對(duì) { aa=0; //這個(gè)為什么要初值,如果不初值那會(huì)顯數(shù)將很快跳過 temp1++; if(temp1==100) { temp1=0; temp2++; if(temp2==100) { temp2=0; } } qian=temp2%100/10; //取十位位值 bai=temp2%10; //取個(gè)位位值 shi=temp1%100/10; ge=temp1%10; } display(qian,bai,shi,ge); //載入位顯位置 } }
void delay(uint z) //延時(shí)函數(shù) { uint x,y; for(x=z;x>0;x--) for(y=30;y>0;y--); }
void display(uchar qian,uchar bai,uchar shi,uchar ge) //位顯位置函數(shù)組 /*步驟一,首先我們應(yīng)該要做的就是讓哪四個(gè)位顯能顯示,如下*/ { duan=1; P0=table[qian]; duan=0; P0=0xff; wei=1; P0=0xfe; wei=0; delay(1);
duan=1; P0=table[bai]; duan=0; P0=0xff; wei=1; P0=0xfd; wei=0; delay(1);
duan=1; P0=table[shi]; duan=0; P0=0xff; wei=1; P0=0xfb; wei=0; delay(1);
duan=1; P0=table[ge]; duan=0; P0=0xff; wei=1; P0=0xf7; wei=0; delay(1); }
void init() //步驟二,中斷請(qǐng)求初始函數(shù)組 { wei=0; duan=0; temp1=0; temp2=0; TMOD=0x01; TH0=0xfe; TL0=0xfe; EA=1; ET0=1; TR0=1; }
void timer0() interrupt 1 //步驟三,中斷次數(shù),相當(dāng)于中斷時(shí)間 { TH0=0xfe; TL0=0xfe; aa++; }
[此貼子已經(jīng)被作者于2010-4-28 16:28:47編輯過]
|