程序如下:#include<reg52.h>
unsigned char code shuzi_0[8]={0x82,0x7C,0x7C,0x7C,0x7C,0x7C,0x82,0xfe};/*"0",0*/
unsigned char code shuzi_1[8]={0xfe,0x7e,0x7a,0x00,0x7e,0x7e,0xfe,0xfe};/*"1",1*/
unsigned char code shuzi_2[8]={0x3a,0x3c,0x5c,0x5c,0x6c,0x6c,0x72,0xfe};/*"2",2*/
unsigned char code shuzi_3[8]={0xba,0x7c,0x7c,0x6c,0x6c,0x6c,0x92,0xfe};/*"3",3*/
unsigned char code shuzi_4[8]={0x9e,0xae,0xb6,0xba,0x00,0xbe,0xbe,0xfe};/*"4",4*/
unsigned char code shuzi_5[8]={0xa0,0x6c,0x6c,0x6c,0x6c,0x6c,0x9c,0xfe};/*"5",5*/
unsigned char code shuzi_6[8]={0x82,0x6c,0x6c,0x6c,0x6c,0x6c,0x9a,0xfe};/*"6",6*/
unsigned char code shuzi_7[8]={0xfc,0xfc,0xfc,0x0c,0xf4,0xf8,0xfc,0xfe};/*"7",7*/
unsigned char code shuzi_8[8]={0x92,0x6c,0x6c,0x6c,0x6c,0x6c,0x92,0xfe};/*"8",8*/
unsigned char code shuzi_9[8]={0xb2,0x6c,0x6c,0x6c,0x6c,0x6c,0x82,0xfe};/*"9",9*/
unsigned char code fuhao_A[8]={0xfe,0xfe,0xba,0xba,0xfe,0xfe,0xfe,0xfe};/*":",10*/
/*******************************************************************************************************************************/
unsigned char code hanzi_a[2][16]={0xf7,0x37,0x47,0x70,0x17,0x73,0xb7,0xbd,0xdd,0xdd,0xed,0xe5,0xc9,0xdd,0xbf,0xff,
0xf7,0xe7,0xf7,0xf7,0x00,0xfb,0xbb,0xbd,0xbd,0xbd,0x81,0xbd,0xbc,0x9d,0xbf,0xff};/*輕*/
unsigned char code hanzi_b[2][16]={0xff,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0x03,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xff,0xff,
0xdf,0xdf,0xdf,0xdf,0xdf,0xdf,0xdf,0xc0,0xdf,0xdf,0xdf,0xdf,0xdf,0xdf,0xdf,0xff};/*工*/
unsigned char code hanzi_c[2][16]={0xfb,0xcb,0x3d,0xfb,0x3b,0xc3,0xdf,0xef,0xf0,0x17,0xf7,0xf7,0xd7,0xe7,0xff,0xff,
0xef,0xf7,0xf9,0xfe,0x7d,0x73,0xbf,0xcf,0xf3,0xfc,0xf3,0xef,0x9f,0x3f,0xbf,0xff};/*歡*/
unsigned char code hanzi_d[2][16]={0xbf,0xbd,0xbb,0x37,0xff,0x03,0xfb,0xfd,0x7d,0x03,0xfb,0xfb,0xfb,0x01,0xfb,0xff,
0xff,0xbf,0xdf,0xe0,0xdf,0xb8,0xbd,0xbe,0xbf,0x80,0xbf,0xbd,0xbb,0x9c,0xdf,0xff};/*迎*/
unsigned char code hanzi_e[2][16]={0xbf,0xdf,0xef,0x03,0xdc,0xef,0x73,0x98,0xfb,0x0b,0xfb,0xbb,0x6b,0x73,0xff,0xff,
0xbf,0xcf,0xff,0x88,0x7f,0x7e,0x77,0x6d,0x4b,0x7c,0x7f,0x1f,0xff,0xee,0x9f,0xff};/*您*/
//unsigned char bt=0; //定時器1中斷計數
unsigned int Tcz=600,s=0,bt=0;//s表示中斷次數 ,Tcz表示定時器TO的初值
unsigned char iDex=0,hiDex; //8列控制,把旋轉一周的180個顯示位置分成22.5塊。一塊為一個顯示單位
unsigned char Hour=10,Minute=15,Second=45,Hour_Flag=0,buffer=0;
void hanzi_Show(unsigned char m);
void Time_Show(unsigned char m); //數字0-9加:顯示函數
void Time_Amend(); //時間邏輯控制函數
void Hour_Display(); //小時顯示函數
void Minute_Display(); //分鐘顯示函數
void Second_Display(); //秒鐘顯示函數
void A_Display(); //“:”顯示函數
void Init(); //初始化函數
int k=0; //校正值
void INT00(void)interrupt 0 //外部中斷服務函數,用于定位和定時器0初值校正
{ //k為校正值,當定時中斷過快,K 變大,Tcz同時變大,定時器初值變大,中斷變慢;
k=s-180;
Tcz=Tcz+k;
iDex=0;
hiDex=0;
s=0; //定時器中斷次數清零,顯示第二周
}
void kjp_test(void)interrupt 1 //定時器中斷0中斷服務程序。
{ TH0=(-Tcz)/256;
TL0=(-Tcz)%256;
if(buffer==0) //buffer 用來控制顯示模式
{
if(hiDex>=16){hiDex=0;} //顯示模式選擇,1為數字式,這個我想的是用遙控起來控制顯示模式
if(iDex>=8){iDex=0;}
if(s==(Second*3)) //秒鐘
{
P0=0X00;P1=0X00;
}
else
{
P0=0XFE;P1=0XFF;
}
if(s==(Minute)*3) //分
{
P0=0XF0;P1=0X00;
}
else
{
P0=0XFE;P1=0XFF;
}
if(s==(Hour*15+Minute/4)) //時
{
P0=0XFF;P1=0X00;
}
else
{
P0=0XFE;P1=0XFF;
}
}
s++;
}
void Time_luoji()interrupt 3
{ TH1=(65535-20000)/256; //定時器1初值定為20毫秒
TL1=(65535-20000)%256;
bt++;
if(bt==50) //就是這里有問題,我定50次應該是秒數自加一,
{ // 但是實際卻很快,所以我定的500次
bt=0;
Second++;
Time_Amend();
}
}
void Time_Show(unsigned char m)
{
switch (m)
{
case 0 :P0=0xff; P0=shuzi_0[iDex];iDex++;P2=0xff;break;
case 1 :P0=0xff; P0=shuzi_1[iDex];iDex++;P2=0xff;break;
case 2 :P0=0xff; P0=shuzi_2[iDex];iDex++;P2=0xff;break;
case 3 :P0=0xff; P0=shuzi_3[iDex];iDex++;P2=0xff;break;
case 4 :P0=0xff; P0=shuzi_4[iDex];iDex++;P2=0xff;break;
case 5 :P0=0xff; P0=shuzi_5[iDex];iDex++;P2=0xff;break;
case 6 :P0=0xff; P0=shuzi_6[iDex];iDex++;P2=0xff;break;
case 7 :P0=0xff; P0=shuzi_7[iDex];iDex++;P2=0xff;break;
case 8 :P0=0xff; P0=shuzi_8[iDex];iDex++;P2=0xff;break;
case 9 :P0=0xff; P0=shuzi_9[iDex];iDex++;P2=0xff;break;
case 10 :P0=0xff; P0=fuhao_A[iDex];iDex++;P2=0xff;break;
}
}
void hanzi_Show(unsigned char m)
{
switch (m)
{
case 0 :P0=0xff; P0=hanzi_a[0][hiDex];P2=0xff;P2=hanzi_a[1][hiDex];hiDex++;break; //輕
case 1 :P0=0xff; P0=hanzi_b[0][hiDex];P2=0xff;P2=hanzi_b[1][hiDex];hiDex++;break; //工
case 2 :P0=0xff; P0=hanzi_c[0][hiDex];P2=0xff;P2=hanzi_c[1][hiDex];hiDex++;break; //歡
case 3 :P0=0xff; P0=hanzi_d[0][hiDex];P2=0xff;P2=hanzi_d[1][hiDex];hiDex++;break; //迎
case 4 :P0=0xff; P0=hanzi_e[0][hiDex];P2=0xff;P2=hanzi_e[1][hiDex];hiDex++;break; //您
}
}
void A_Display()
{
Time_Show(10);
}
void Hour_Display()
{ //顯示小時
unsigned char m=0,n=0;
m=Hour/10;
n=Hour%10;
if(s<8)
Time_Show(m);
else
Time_Show(n);
}
void Minute_Display()
{
unsigned char m=0,n=0; //顯示分
m=Minute/10;
n=Minute%10;
if(s<32)
Time_Show(m);
else
Time_Show(n);
}
void Second_Display()
{
unsigned char m=0,n=0; //顯示秒
m=Second/10;
n=Second%10;
if(s<56)
Time_Show(m);
else
Time_Show(n);
}
void Time_Amend()
{
if(Second>=60) //時間邏輯控制
{
Second=0;
Minute++;
if(Minute>=60)
{
Minute=0;
Hour++;
if(Hour>=24)
Hour=0;
}
}
}
void Init()
{
// TMOD|=0x01;
// TMOD&=0xfd; //定時器/計數器的方式控制字。將T0設為方式2
// TMOD|=0x10;
// TMOD&=0xdf; //定時器/計數器的方式控制字。將T1設為方式2
TMOD=0x11;
EA=1; //中斷允許控制
ET0=1; //定時器/計數器T0的中斷允許位
ET1=1; //定時器/計數器T1的中斷允許位
TH0=(65535-600)/256; //定時初值,5MS
TL0=(65535-600)%256;
TH1=(65535-50000)/256; //定時器1初值
TL1=(65535-50000)%256;
TR0=1; //定時器/計數器T0的啟動
TR1=1;
EX0=1;
// EX1=1; //INT0中斷允許控制位
IT0=1;
IT1=1; //控制寄存器TCON
PT1=1; //設置定時器T1中斷先級為高,防止T0中斷中出現,不處理T1中斷服務程序
// PX1=1;
}
void main()
{
Init();
while(1)
{
;
}
}
[ 此帖被tanghua718在2010-12-10 15:22重新編輯 ]



