#include "BS87D20A-3.h"
#define com1 _pc1
#define com2 _pc0
#define com3 _pc2
#define com4 _pc3
#define key1 _pd2
#define key2 _pd3
#define key3 _pa1
#define key4 _pa4
#define key_state_0 0 //按鍵的初始狀態
#define key_state_1 1 //按鍵按下的狀態
#define key_state_2 2 //按鍵釋放的狀態
volatile bit Flag_T5ms;
volatile bit Flag_T10ms;
volatile bit Flag_T1s;
const unsigned char tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
unsigned char strtab[3];//緩沖區
unsigned char key_number=0;
//unsigned char sec=0,min=0,hour=0;
unsigned char sec=0,min=0,hour=0;
unsigned char temp;
unsigned long s; //秒級
unsigned long ms10;//毫秒
unsigned long ms5;
unsigned char n;
unsigned char read_key(void)
{
static char key_state=0 ; //按鍵的狀態
unsigned char key_press; //按鍵是否被按下
unsigned char key_return = 0; //按鍵返回值
key_press = key4; // 讀按鍵I/O電?
switch (key_state)
{
case key_state_0: // 按鍵初始態
if (!key_press)
{
if(Flag_T10ms)
{
Flag_T10ms=0;
}
key_return = 0;
key_state = key_state_1;// 鍵被按下,狀態轉換到鍵確認態
}
else key_state = key_state_0;
break;
case key_state_1: // 按鍵確認態
if (!key_press)
{
if(Flag_T10ms)
{
Flag_T10ms=0;
}
key_return = 1; // 按鍵仍按下,按鍵確認輸出為“1”
key_state = key_state_2;// 狀態轉換到鍵釋放態
}
else
{
key_state = key_state_0; // 按鍵已抬起,轉換到按鍵初始態
key_return = 0;
}
break;
case key_state_2:
if (key_press)
{
key_state = key_state_0;//按鍵已釋放,轉換到按鍵初始態
key_return = 0;
}
break;
}
return key_return; //返回按鍵值
}
void displaypro()
{
strtab[0]=tab[sec%10];
strtab[1]=tab[sec/10];
strtab[2]=tab[min%10];
strtab[3]=tab[min/10];
}
void display_drive()
{
com1=1;com2=1;com3=1;com4=1;
switch(temp)
{
case 0:com4=0;
_pb=strtab[temp]; break;
case 1:com3=0;
_pb=strtab[temp]; break;
case 2:com2=0;
_pb=strtab[temp]; break;
case 3:com1=0;
_pb=strtab[temp]; break;
default:break;
}
temp++;
if(temp==4)
temp=0;
}
void init()
{
_ctm0c0=0x20; // fh/16 2us
_ctm0c1=0xc1; // 定時/計數器模式 比較器a
_ctm0al=0xf4; // 1ms
_ctm0ah=0x01;
_pbc=0; //輸出
_pcc0=0;
_pcc1=0;
_pcc2=0;
_pcc3=0;
_pac1=1;
_pac4=1;
_pdc2=1;
_pdc3=1;
_pdpu3=1;
_pdpu2=1;
_papu1=1;
_papu4=1;
s=1000;
ms10=10;
ms5=5;
temp=0;
n=0;
_mfe=1; //開多功能中斷
_ctm0ae=1; //CTM a中斷使能
_emi=1; //開總中斷
_ct0on=1; //開定時器
}
void main()
{
init();
while(1)
{
if(Flag_T5ms)
{
Flag_T5ms=0;
}
if(Flag_T1s)
{
Flag_T1s=0;
displaypro();
}
if(Flag_T10ms) //10MS進入一次
{
read_key();
key_number=read_key();//調用按鍵掃描函數,取得按鍵值,5MS調用一次
if(key_number==1)
{
n++;
_pb=tab[n];
}
Flag_T10ms=0;
}
GCC_CLRWDT();
com1=1;com2=1;com3=0;com4=0;
}
}
void __attribute__((interrupt(0x14))) ISR_CTMO(void)
{
_ctm0af=0;
s--;
ms5--;
ms10--;
if(! ms5)
{
ms5=5;//5MS 視覺暫留
Flag_T5ms=1;
}
if(!ms10)
{
ms10=10;
Flag_T10ms=1;
}
if(! s)
{
Flag_T1s=1;
s=1000;//1s電子鐘計數
sec++;
if(sec==60)
{
sec=0;
min++;
if(min==60)
{
min=0;
hour++;
if(hour==24)
{
hour=0;
}
}
}
}
}
|