單片機源程序如下:
#include <AT89X52.h> //調用51單片機的頭文件
//---------------------------------------
//數碼管字形表,供顯示時查詢
unsigned char code LED[10]=
{ //定義表格一定要使用code,這樣會做到程序存儲區中
0x3F, //"0"的字形表,0B00111111
0x06, //"1"的字形表,0B00000110
0x5B, //"2"的字形表,0B01011011
0x4F, //"3"的字形表,0B01001111
0x66, //"4"的字形表,0B01100110
0x6D, //"5"的字形表,0B01101101
0x7D, //"6"的字形表,0B01111101
0x07, //"7"的字形表,0B00000111
0x7F, //"8"的字形表,0B01111111
0x6F, //"9"的字形表,0B01101111
};
//---------------------------------------
//4位數碼管相關I/O設置
sbit U165A0=P1^0; //U165(74HC138)的A0腳接在P1.0口上
sbit U165A1=P1^1; //U165(74HC138)的A1腳接在P1.1口上
sbit U165A2=P1^2; //U165(74HC138)的A2腳接在P1.2口上
//---------------------------------------
//---------------------------------------
//名稱: 主函數
void main(void) //主函數,單片機開機后就是從這個函數開始運行
{
unsigned int c=0; //定義一個char型變量,做延時用
unsigned char d=0; //定義一個char型變量,控制顯示位置
unsigned char e=0; //定義一個char型變量,做延時用
unsigned int f=0; //定義一個int型變量,顯示內容用,顯示內容0-9999
//for(c=0;c<50000;c++)
while(1) //死循環,單片機初始化后,將一直運行這個死循環
{
for(c=0;c<5;c++);//做一個0-250的循環,不執行其他操作,只為延時
if(++e>200) //做一個延時,時間到將顯示內容加1
{
e=0;
if(P0_0==1) //清零,為下一次延時做準備
{if(++f>9999) f=0;}//顯示內容加1,因為只有4位顯示,超過9999后歸零
}
P2=0; //關一次顯示,以免顯示出鬼影
if(++d>3) d=0; //先將d加1,然后判斷是否大于3,大于3歸零
if(d==0) //如果d=0,顯示千位
{
P1=0x03; //U165A0=1,U165A1=1,U165A2=0選通數碼管的千位進行顯示
P2=LED[f/1000]; //將要顯示的f的千位提取出來查表后送顯示
}
else if(d==1) //如果d=1,顯示百位
{
P1=0x02; //U165A0=0,U165A1=1,U165A2=0選通數碼管的百位進行顯示
P2=LED[(f%1000)/100]; //將要顯示的f的百位提取出來查表后送顯示
}
else if(d==2) //如果d=2,顯示十位
{
P1=0x01; //U165A0=1,U165A1=0,U165A2=0選通數碼管的十位進行顯示
P2=LED[(f%100)/10]; //將要顯示的f的十位提取出來查表后送顯示
}
else //如果d=3,顯示個位
{
P1=0x00; //U165A0=0,U165A1=0,U165A2=0選通數碼管的個位進行顯示
P2=LED[f%10]; //將要顯示的f的個位提取出來查表后送顯示
}
}
}
|