?? temp.txt
字號:
#include <AT89X52.H>
#include "intrins.h"
#include "absacc.h"
#define uchar unsigned char
#define uint unsigned int
//狀態定義
#define time_show 0x01 //時間顯示
#define date_show 0x02 //日歷顯示
#define second_show 0x03//秒表顯示
#define time_set 0x04
#define date_set 0x05
uchar cur_state;
uchar next_state;
uint hour,minute,second,//時間
Cminute,Csecond,Csecond10;//秒表
uint year,month,day; //日歷
uint Num_Of_Circle;
uint array[6]; //顯示數據存儲區
//uchar code SEGPOS[34]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0xBF,0xFF,0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0x08,0x03,0x46,0x21,0x06,0x0E};
//"0" "1" "2" "3" "4" "5" "6" "7" "8" "9" "A" "B" "C" "D" "E" "F" "-" "空" "0." "1." "2." "3.""4." "5.""6." "7.""8." "9.""A." "B.""C." "D.""E." "F."
//帶點的比不帶點的大18個位置 陽極
uchar code CON[6]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF};//數據顯示的位選信號11111110 到11011111
//陰極段碼
uchar code SEGNEG[34]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0x40,0x00,0xBF,0x86,0xD4,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,0xF7,0xFC,0xB9,0xDE,0xF9,0xF1};
uchar data inkey _at_ 0x30;//按鍵值
uchar data key_down _at_ 0x7E;//按鍵次數
void initial(void)
{
/*
T2CON=0x34;
SCON=0xD0;
PCON=0x00;//波特率不加倍
RCAP2L=0xC7;
RCAP2H=0xFE;//波特率1200
TR2 = 1;
//*/
inkey=0;
hour=0x06; minute=0x30; second=0x00;
Cminute=0x00; Csecond=0x00;Csecond10=0x00;
year=0x08;month=0x01; day=0x01;
cur_state = date_show;
next_state = date_show;
Num_Of_Circle=0;
TMOD=0x16;//T0 計數(方式2),T1 計時(方式1),T2 波特率 GATE C/~T M1 M0
TH0=0xFF; TL0=0xFF;
TH1=0x3C; TL1=0xB0;//50ms
TR0=1; TR1=0;
ET0=0; ET1=1;
EX0=0; EX1=0;
ES=0;
EA=1;
}
void delay10ms(uint s)//100 == 1second
{
while(s--)
{
# pragma asm
MOV R3,#10H
DS11:
MOV R2,#0FFH
DS12:
DJNZ R2,DS12
NOP
NOP
NOP
NOP
NOP
DJNZ R3,DS11
#pragma endasm
}
}
void getKey()
{
if(P2!=0xFF)
{
delay10ms(2);
if(P2!=0xFF)
{
key_down+=1;
}
if(P1_0==0)
{
inkey=1;
}
if(P1_1==0)
{
inkey=2;
}
if(P1_2==0)
{
inkey=3;
}
if(P1_3==0)
{
inkey=4;
}
}
else
key_down=0;
}
void show( uint bitCon,uint num)
{
uchar seg =SEGNEG[num];
P0=seg;
switch(bitCon)
{
case 0:
P2=CON[0];
break;
case 1:
P2=CON[1];
break;
case 2:
P2=CON[2];
break;
case 3:
P2=CON[3];
break;
case 4:
P2=CON[4];
break;
case 5:
P2=CON[5];
break;
}
}
//*驅動蜂鳴器
void Buzzer()
{
P2_6 = 1;//buzzer
P2_7 = 1;//led
delay10ms(100);
}
void clearAlarm()
{
P2_6 = 0;//buzzer
P2_7 = 0;//led
}
void stateMachine(uchar inkey)
{
switch(inkey )//復位到顯示時間
{
case 1:
next_state = date_show;
break;
case 2:
next_state = second_show;
break;
case 3:
next_state = time_show;
break;
}
cur_state = next_state;
}
void getTime(uint circle)
{
Csecond10=circle/2;//分秒 circle是0到19的
//**********************************************
if(Csecond10==0)
{
Csecond+=1;
if(Csecond==60)
{
Csecond=0;
Cminute+=1;
}
}
}
void setplay(uint h2bit ,uint m2bit,uint l2bit)
{
array[5]=h2bit/10%10;
array[4]=h2bit%10+18;
array[3]=m2bit/10;
array[2]=m2bit%10+18;
array[1]=l2bit/10;
array[0]=l2bit%10+18;
}
void main()
{
uint display=0;
initial();
while(1)
{
getKey();//獲得按鍵輸入
if(TR1==1)
getTime(Num_Of_Circle);//秒表功能
/**設置**
if(inkey==4)
if(inkey==5)
//*/
switch(cur_state)
{
case time_show:
setplay(hour,minute,second);
break;
case date_show:
setplay(year,month,day);
break;
case second_show:
setplay(Cminute,Csecond,Csecond10);
break;
}
//動態顯示四位數據
show(display,array[display]);
if(display==5)
display=0;
else
display=display+1;
// delay10ms(1); //**************
if(key_down == 1) //運行狀態機
stateMachine(inkey);
}
}
/*/////////////////////////////////////////////////////////////
各中斷函數的具體處理
//*/
void TIME0() interrupt 1// 計數七次的外部信號下降
{
if(Num_Of_Circle==0)
TR1=1;
Num_Of_Circle = 0;
}
void TIME1() interrupt 3//T1 計時 50ms
{
Num_Of_Circle = Num_Of_Circle==19 ? 0 : Num_Of_Circle + 1;
}
void EX0INT() interrupt 0
{
}
void EX1INT() interrupt 2
{
}
void SERIAL() interrupt 4
{
}
///////////////////////////////////////////////////////////////
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -