|
/*;*******************************************************************************
;* 標題: 數(shù)碼管計時與流水燈同時運行
;* 文件: 中國功夫.C
;* 日期: 2014年8月29日
;* 版本: V80001.0
;* 作者: Eking
;* 備注:
;******************************************************************************
;* 描述:
;* 數(shù)碼管計時與流水燈同時運行
;*
;******************************************************************************/
#include <reg52.h> //包含特殊功能寄存器定義的頭文件
sbit LE1=P2^0; //位選573鎖存器使能
sbit LE2=P2^1; //段選573鎖存器使能
unsigned char code LedChar[16]={ //數(shù)碼管顯示字符轉(zhuǎn)換表
0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,
// 0 1 2 3 4 5 6 7
0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};//0~F的段碼
// 8 9 A B C D E F
unsigned char LedBuff[9] = { //數(shù)碼管+獨立LED顯示緩沖區(qū),初值0x00確保啟動時都不亮
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ,0x00
};
unsigned char cnt200 = 0; //200ms計數(shù)
unsigned int cnt1000 = 0; //1000ms計數(shù)
void ShowCount();
void FlowingLight();
void main()
{
EA = 1; //使能總中斷
TMOD = 0x01; //設置T0為模式1
TH0 = 0xFC; //為T0賦初值0xFC67,定時1ms
TL0 = 0x67;
ET0 = 1; //使能T0中斷
TR0 = 1; //啟動T0
while (1)
{
if (cnt200 >= 200) //200ms刷新一次流水燈
{
cnt200 = 0;
FlowingLight();
}
if (cnt1000 >= 1000) //1s刷新一次計數(shù)值
{
cnt1000 = 0;
ShowCount();
}
}
}
/* 流水燈實現(xiàn)函數(shù) */
void FlowingLight()
{
static unsigned char dir = 0; //移位方向變量dir,用于控制移位的方向
static unsigned char shift = 0x01; //循環(huán)移位變量shift,并賦初值0x01
P0 = ~shift; //循環(huán)移位變量取反,控制8個LED
if (dir == 0) //移位方向變量為0時,左移
{
shift = shift << 1; //循環(huán)移位變量左移1位
if (shift == 0x80) //左移到最左端后,改變移位方向
{
dir = 1;
}
}
else //移位方向變量不為0時,右移
{
shift = shift >> 1; //循環(huán)移位變量右移1位
if (shift == 0x01) //右移到最右端后,改變移位方向
{
dir = 0;
}
}
}
/* 秒計數(shù)顯示函數(shù) */
void ShowCount()
{
char i; //循環(huán)變量
unsigned char buf[8]; //中間轉(zhuǎn)換緩沖區(qū)
static unsigned long sec = 0; //記錄經(jīng)過的秒數(shù)
sec++; //秒計數(shù)自加1
buf[0] = sec%10; //將sec按十進制位從低到高依次提取到buf數(shù)組中
buf[1] = sec/10%10;
buf[2] = sec/100%10;
buf[3] = sec/1000%10;
buf[4] = sec/10000%10;
buf[5] = sec/100000%10;
buf[6] = sec/1000000%10;
buf[7] = sec/10000000%10;
for (i=7; i>=1; i--) //從最高為開始,遇到0不顯示,遇到非0退出循環(huán)
{
if (buf[i] == 0)
LedBuff[i] = 0x00;
else
break;
}
for ( ; i>=0; i--) //將剩余的有效數(shù)字位如實轉(zhuǎn)換
{
LedBuff[i] = LedChar[buf[i]];
}
}
/* 定時器0中斷服務函數(shù) */
void InterruptTimer0() interrupt 1
{
static unsigned char i = 0; //動態(tài)掃描的索引
TH0 = 0xFC; //重新加載初值
TL0 = 0x67;
cnt200++;
cnt1000++;
//以下代碼完成數(shù)碼管動態(tài)掃描刷新
P1 = 0x00; //顯示消隱
LE2 = 1;
LE2 = 0;
switch (i)
{
case 0: P1=0x7F; LE1=1; LE1=0; i++; P1=LedBuff[0]; LE2=1; LE2=0; break;
case 1: P1=0xBF; LE1=1; LE1=0; i++; P1=LedBuff[1]; LE2=1; LE2=0; break;
case 2: P1=0xDF; LE1=1; LE1=0; i++; P1=LedBuff[2]; LE2=1; LE2=0; break;
case 3: P1=0xEF; LE1=1; LE1=0; i++; P1=LedBuff[3]; LE2=1; LE2=0; break;
case 4: P1=0xF7; LE1=1; LE1=0; i++; P1=LedBuff[4]; LE2=1; LE2=0; break;
case 5: P1=0xFB; LE1=1; LE1=0; i++; P1=LedBuff[5]; LE2=1; LE2=0; break;
case 6: P1=0xFD; LE1=1; LE1=0; i++; P1=LedBuff[6]; LE2=1; LE2=0; break;
case 7: P1=0xFE; LE1=1; LE1=0; i=0; P1=LedBuff[7]; LE2=1; LE2=0; break;
default: break;
}
}
Powered by 單片機教程網(wǎng)