?? embed.c
字號:
#include <AT89X52.H>
#include "intrins.h"
#include "absacc.h"
#define uchar unsigned char
#define uint unsigned int
uchar cur_state;
uchar next_state;
uint Num_Of_Circle;
uint array[6]={1,2,3,4,5,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 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 code CON[6]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF};//數據顯示的位選信號11111110 到11011111
uchar data inkey _at_ 0x30;//按鍵值
uchar data key_down _at_ 0x7E;//按鍵次數
uchar key;
void initial(void)
{
/*
T2CON=0x34;
SCON=0xD0;
PCON=0x00;//波特率不加倍
RCAP2L=0xC7;
RCAP2H=0xFE;//定時器2波特率1200
TR2 = 1;
//*/
inkey=0;key_down=0;
cur_state = 0;
next_state =0;
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=0;
}
void delay10ms(uint s)//100 == 1second
{
uint i;
while(s--)
{
for(i=0;i<255;i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
void getKey()
{
P3=P3|0xF0;
delay10ms(1);
key=P3&0xF0;
if(key!=0xF0 && key_down==0)
{
key_down+=1;
switch(key)
{
case 0x70:
inkey=1;
break;
case 0xB0:
inkey=2;
break;
case 0xD0:
inkey=3;
break;
case 0xE0:
inkey=4;
break;
default:
key_down=0;
break;
}
}
# pragma asm
#pragma endasm
}
void show( uint bitCon,uint num)
{
uchar seg =SEGPOS[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 = 0;
break;
case 2:
next_state = 1;
break;
case 3:
next_state = 2;
break;
}
cur_state = next_state;
}
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;
uint LED=0xFF7F;
initial();
while(1)
{
getKey();//獲得按鍵輸入
if(key_down)
{
key_down=0;
P3_0=!P3_0;
}
/*
//*/
/**設置**
//*/
/*
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 +=1;
P1=LED;
LED=LED>>1;
delay10ms(100); //**************
if(LED==0x01FE)
{
LED=0xFF7F;
}
/*
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 + -