/*用定時器以間隔1000MS在6位數碼管上依次顯示
0、1、2、3....C、D、E、F,重復。同時讓數碼管亮
設時鐘頻率為12M
*/
/*********************************************************/
#include<reg52.h> //52單片機頭文件
#include <intrins.h> //包含有左右循環移位子函數的庫
#include "51hei.h"
#define uint unsigned int //宏定義
#define uchar unsigned char //宏定義
sbit dula=P2^6; //數碼管段選鎖存端
sbit wela=P2^7; ////數碼管位選鎖存端
sbit den_con=P1^4; /// 燈的控制端口
uchar num,tt,i;
uchar code table[]={ //段碼表
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void main()
{guandz();
num=0;
tt=0;
den_con=1;
TMOD=0x01;//設置定時器0為工作方式1
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;//開總中斷
ET0=1;//開定時器0中斷
TR0=1;//啟動定時器0
dula=1;
P0=0x3f; //給段開始送顯示0。
dula=0;//關閉段選鎖存端,防止開始時出現亂碼。
wela=1;//11101010
P0=0x00; // 打開六個數碼管位選
wela=0;
while(1) //死循環
{
if(tt==20) //每進入10次中斷即為500ms,執行一次顯示變化。
{
tt=0;
num++;
if(num==16)
num=0;
dula=1; //開通74hc573,使p0口數據能直通
P0=table[num]; //送數碼管段選值
dula=0; //鎖存負責段選的74hc573
den_con=0; //燈亮的控制口打開
P0=0xfe;
for(i=0;i<100;i++);
den_con=1; //燈亮控制口關閉
}
}
}
void exter0() interrupt 1 // 定時器0中斷
{
TH0=(65536-50000)/256; //送初值
TL0=(65536-50000)%256;
tt++; //tt=tt+1
}
|