?? 4display.c
字號:
#include <reg51.h>
unsigned char ComperHourAlarm,ZeroNoDisplay,flashcount,ZeroYesDisplay;
unsigned int TClock;
unsigned int change;
unsigned int plus;
unsigned int TimerCount;
unsigned char temp[8];
unsigned int PLDELAY;
unsigned code DispTab [] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff,0xbf,0x08,0x03,0x06,0xA1,0x91,
0xC7,};
//字形碼0-9,不顯示,-,a,b,c,d,Y,L,
unsigned char DispBuf [4] = {0,6,1,0,};//顯示緩沖區,
/* 以下是對顯示的驅動位作標記*/
sbit Hour1 = P2^1; //小時顯示第一位.
sbit Hour2 = P2^2; //小時顯示第二位.
sbit Min1 = P2^3; //分顯示第一位.
sbit Min2 = P2^4; //分顯示第二位.
sbit PL = P1^5; //電源電壓低.
sbit Relay = P3^7;
/*----------以下是對鍵所在位作標志------------*/
sbit SetKey = P3^3; //功能鍵所在引腳.
sbit MoveKey = P3^1; //位移動鍵所在引腳.
sbit IncKey = P3^0; //加一鍵所在引腳.
unsigned char SetFlag; //定義調整的數據位置.
unsigned char Set; //要設置的數據中間傳送位.
unsigned char Mi,Max; //數據要調整的范圍.
/*---------以下是對常量和變量進行定義----------*/
unsigned char DispCount; //用于顯示中對顯示位數進行計數.
unsigned char ZeroNoDisplay; //用于顯示小時位時如顯示為09,則將其中的零不顯示.
unsigned char flashcount; //定時0中斷中用到的變量.
/*------------------秒脈沖中斷用--------------*/
unsigned char Year,Month,Date,Hour,Min,Sec,Wek; //計數器.
unsigned int t;
bit Clock;
bit CheckDy;
/*------------------閃爍程序中用到-------------*/
unsigned char FlashSet; //閃動延時值.
bit FlashFlag; //閃動標志位.
unsigned char SetFlag;
/*--------------------延時程序---------------------*/
void mDelay (unsigned int Delay)
{ unsigned int i;
for (; Delay>0; Delay--) //延時時間很難選折.會產生不希望產生的鬼影.
{for (i=0;i<100;i++)
{;}
}
}
/*--------------加一程序--------------------*/
void inc ( void)
{
Set++; //對設置位加一.
if (Set > Max ) //如果設置數大于規定最大值,則歸位最小值.
{Set = Mi;} //歸位最小值.
}
/*---------------顯示及緩沖區刷新程序---------------------*/
void Display ()
{ switch ( DispCount )
{
case 0: //小時十位顯示.
Min2 = 1; //關閉年顯示第二位.
ZeroNoDisplay = DispBuf [ DispCount ]; //輸出段碼.
if (ZeroNoDisplay==0)
{
P0 = DispTab [10]; //小時第一位為零時不顯示.
}
else
{
P0 = DispTab [ DispBuf [ DispCount ] ];
}
Hour1 = 0; //點亮月顯示第一位.
break;
case 1: //小時位個位顯示.
Hour1 = 1; //關閉月顯示第一位.
ZeroNoDisplay = DispBuf [ DispCount ]; //輸出段碼.
if (Clock == 1)
{P0 = ( DispTab[ZeroNoDisplay] & 0x7f );}
else
{P0 = DispTab [ DispBuf [ DispCount ] ];} //輸出段碼.
Hour2 = 0; //點亮月顯示第二位.
break;
case 2: //分位十位顯示.
Hour2 = 1; //關閉月顯示第二位.
P0 = DispTab [ DispBuf [ DispCount ] ];
Min1 = 0; //點亮日顯示第一位..
break;
case 3: //分位個位顯示.
Min1 = 1; //關閉日顯示第二位.
P0 = DispTab [ DispBuf [ DispCount ] ];
Min2 = 0; //點亮小時顯示第一位.
break;
}
mDelay (1);
DispCount++;
if ( DispCount==4 ) //顯示位數計數,以確定下一輪顯示哪一位.
{
DispCount = 0;
}
}
/*----------------調時中用到的延時---------------------*/
void lDelay (unsigned int hDelay)
{ unsigned int i;
for (;hDelay>0; hDelay--)
{ for (i=0;i<120;i++)
{Display ();}
}
}
/*--------------緩沖區刷新程序---------------------*/
void scan()
{
DispBuf [1] = Hour%10;
DispBuf [0] = Hour/10; //將小時送入緩沖區.
DispBuf [3] = Min%10;
DispBuf [2] = Min/10; //將分送入緩沖區.
}
/*---------t0中斷執行程序,用于t秒脈沖信號產生,按鍵及定時鳴叫.---------------*/
void t0(void) interrupt 1 using 0
{
t++;
if ( t == 2000) //半秒時指示.
{Clock = 0;} //秒閃指示位.
if (t ==4000) //如果計數到1秒,則T清零.
{ t=0;
if ( t == 0)
{Clock = 1;}
Sec++;
if ( Sec > 59 ) //秒計到59則秒位清零.
{ CheckDy = 1;
Sec = 0;
Min++;
if ( Min > 59 ) //分計到59則分位清零.
{ Min = 0 ;
Hour++;
if ( Hour > 12 ) //小時計到12,則小時位清零.
{ Hour = 1;
}
}
}
}
}
/*----------------t1中斷程序----------------------
/*-----t1中斷執行程序,用于執行調整參數時的數字閃爍,閃爍時間到自動退出調整程序.--------*/
void t1 (void) interrupt 3 using 2
{
TH1=(65536-50000)/256; //T1重置定時數據.
TL1=(65536-50000)%256;
FlashSet--;
if ( FlashSet == 0 )
{ FlashSet = 6 ;
FlashFlag = ~ FlashFlag; //對閃動位取反,以決定下一輪是否閃動.
if ( FlashFlag ==1)
{
switch (SetFlag) //看是要哪一位閃爍.
{
case 0:
DispBuf [0] = 10;
DispBuf [1] = 10; //年位閃爍.
break;
case 1:
DispBuf [2] = 10;
DispBuf [3] = 10; //月位閃爍.
break;
}
}
else
{ DispBuf [1] = Hour%10; //調整時的緩沖區刷新程序.
DispBuf [0] = Hour/10; //將小時送入緩沖區.
DispBuf [3] = Min%10;
DispBuf [2] = Min/10; //將分送入緩沖區.
}
}
}
/*------外部中斷1用于執行鍵盤中斷,進行參數調整.----------------------*/
{
if ( SetKey ==0 ) //Set鍵按下進入中斷程序.
{
lDelay (10); //延時十毫秒.
if ( SetKey == 0) //再次查詢SET鍵有否按下.
{
TR0 =0; //關閉TR0運行.
ET0 = 0; //關閉TR0中斷,以實現調整時的閃爍
TR1 = 1; //開啟TR1運行.
ET1 = 1; //開TR1中斷,以實現調整時的閃爍.
EX1 = 0; //關閉外部中斷1.
// EX1 = 0; //關閉外部中斷1.
while ( SetKey == 0 ) //設置鍵按下釋放否,未釋放則等待.
{
Display ();
}
while ( SetKey == 1 ) //SetKey鍵按下,則進入
{ Display ();
if ( MoveKey == 0)
{SetFlag++; //需移動到的標志位.
if (SetFlag==2)
{SetFlag=0;}
}
while ( MoveKey == 0) //秒位鍵按下釋放否,未釋放則等待.
{Display ();}
if ( IncKey == 0 )
{ switch ( SetFlag )
{
case 0: Mi = 1;
Max = 12;
Set = Hour;
inc ( );
Hour = Set;
break;
case 1: Mi = 0;
Max = 59;
Set = Min;
inc ();
Min = Set;
break;
}
while ( IncKey == 0 )
{
Display ();
}
}
}
while ( SetKey == 0 )
{
Display ();
}
SetFlag = 0;
TR0 = 1; //開啟TR0運行.
ET0 = 1; //開TR0中斷,以實現調整時的閃爍.
TR1 = 0; //關閉TR1運行.
ET1 = 0; //開TR1中斷,以實現調整時的閃爍.
EX1 = 1; //開啟外部中斷1,響應鍵盤中斷.
}
}
}
/*---------------------主程序-------------------*/
void main (void)
{
EA = 1; //總中斷允許.
ET0 = 1; //允許定時器0中斷.
TR0 = 1; //開定時器1中斷.
PT1= 1; //定時器1為高優先級.
EX1 = 1; //允許外部1中斷.
IT1 = 1; //設置外部中斷1為外部觸發中斷.
TMOD = 0x12; //定時器模式.
Hour = 8;
Min = 18;
PLDELAY = 50;
Relay = 0;
DispCount = 0;
SetFlag = 0;
FlashSet = 6; //閃動中用到.
TH0=0x06; //定時數據.
TL0=0x06;
TH1=(65536-50000)/256; //T1重置定時數據.
TL1=(65536-50000)%256;
while (1)
{
Display ();
scan();
if ( CheckDy == 1 ) //檢查是否使能電源檢測.
{ if ( PL == 0 ) //如果電源電壓低則在屏幕上顯示電源電壓低.
{ for ( ;PLDELAY > 0;PLDELAY-- ) //屏幕上延時顯示電源電壓低.
{ DispBuf [1] = 16; //調整時的緩沖區刷新程序.
DispBuf [0] = 15; // 電壓檢測在每分鐘的開始開啟檢測使能,
DispBuf [3] = 17; //
DispBuf [2] = 11; //
Display ();
}
}
CheckDy = 0;
PLDELAY = 50;
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -