资源描述
#include "Includes.h" //总头文件
#define KEYP PTD
#define KEYD DDRD
#define KEYPEU PTDPUE
unsigned char sec=0; //秒,分,小时
unsigned char minit=0;
unsigned char hour=0;
unsigned char k[]={0,0,0,0},s[]={0,0,0,0};
//Timer1Init:定时器初始化----------------------------------------*
//功能:将定时器初始化为一秒钟一次溢出中断。
//-------------------------------------------------------------------------*
void Timer1Init(void)
{
//不允许溢出中断、不启动计数、分频因子 = 64
T1SC=0b00100110;
//计数器寄存器初值=0x0000
T1CNTH=0x00; T1CNTL=0x00;
//1秒产生1次溢出中断,预置寄存器=1×(2457600/64)=9600
T1MODH=0x96; T1MODL=0x00;
}
void Timer1Over(void) //定时器溢出子程序
{
DisableMCUInt();
sec++; //秒加1
T1SC&= ~(1<<7); //清除定时器溢出标志位
EnableMCUInt();
}
void Delay(int times)
{ int i;
for(i=0;i<times;i++);
}
void LEDshow(unsigned char a[])
{ unsigned char i;
const unsigned char Table[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; //显示码表
DDRB = 0xff; //数据口为输出
DDRC = 0xff; //位选口为输出
PTB = 0x0; //数据口输出全0,即全不亮
for (i=0;i<4;i++)
{ PTC = ~(0b00000001 << i); //送位选信号
PTB = Table[a[i]]; //取显示码并送到LED数据线
if ( (sec%2==0) &i==1)
PTB= Table[a[i]]+0x80;
Delay(100);
}
}
unsigned char key_scan(void) //键盘扫描函数
{ int i;
unsigned char line, row, k_value;
static unsigned char lastkey=0xff;
const unsigned char KBTable[] = {
0xEE,'7',0xDE,'4',0xBE,'1',0x7E,'0',
0xED,'8',0xDD,'5',0xBD,'2',0x7D,'A',
0xEB,'9',0xDB,'6',0xBB,'3',0x7B,'B',
0xE7,'C',0xD7,'D',0xB7,'E',0x77,'F',
0x00,0xff };
//PTD0~PTD3输出0
KEYD =0x0f;
KEYPEU=0xf0;
KEYP=KEYP & 0xF0;
if ((KEYP & 0xf0) == 0xf0)
return 0xff; //无键按下
row = KEYP;
//延时,消除抖动
for(i=0;i<100;i++);
if (row != KEYP)
return 0xff; //判为抖动,无键按下
line=0xFE;
for (i=0;i<4;i++)
{ KEYP = line; //输出扫描信号
row=KEYP; //读键盘口
if ((row & 0xf0) != 0xf0)
break;
line=(line<<1)+1;
}
if (i==4) return 0xff;
k_value = (row & 0xf0) | (line & 0x0f) ;
for (i=0; i<32; i+=2)
if (k_value == KBTable[i])
break;
if(lastkey==KBTable[i+1]) return 0xff;
lastkey=KBTable[i+1];
return KBTable[i+1];
}
void timeset()
{ unsigned char j=0,m=0;
unsigned char key;
while(1) //设置当前时间
{ LEDshow(s);
if (j==4) {key=0xff; break;}
key=key_scan();
if (key==0xff) continue;
key = key-0x30;
s[j]=key;
j++;
}
}
void alarmset()
{unsigned char j=0,m=0;
unsigned char key;
while(1) //设置闹钟时间
{ LEDshow(k);
if (m==4) break;
key=key_scan();
if (key==0xff) continue;
key = key - 0x30;
k[m]=key;
m++;
}
}
//主函数
void main()
{
unsigned char a[]={0,0,0,0};
unsigned char kk;
DisableMCUInt(); //禁止总中断
MCUInit(); //芯片初始化
Timer1Init(); //定时器1的初始化
T1SC|=(1<<6); //令T1SC.6=1,开放Timer1溢出中断
T1SC &= ~(1<<5); //清T1SC.5,允许定时器1计数
EnableMCUInt(); //开总中断
while(1)
{
kk=key_scan();
if(kk=='A')
{
timeset();
}
else if(kk=='B')
{
alarmset();
}
else
{
if(sec>=60)
{
minit++;
sec=0;
if (minit>=60) {hour++;minit=0;}
}
a[0] =s[0]+hour/10;
a[1] =s[1]+hour %10;
a[2] =s[2]+minit/10;
a[3] =s[3]+minit %10;
LEDshow(a);
if (a[0]==k[0] & a[1]==k[1] & a[2]==k[2] & a[3]==k[3])
{ DDRC=0xff;
PTC=PTC&&~(1<<4);
}
else
{
DDRC=0xff;
PTC=PTC||~(1<<4);
}
}
}
}
展开阅读全文