资源描述
/******************************************************************************
实现秒表功能说明:用5键控制。启动。停止.暂停.继续.清零
按S2 启动 只有在清零或没有开始得情况下才有效
按S3 停止 只有在启动得情况下才有效
按S4 暂停 只有在启动得情况下才有效
按S5 继续 只有在暂停得情况下才有效
按S6 清零 只有在停止得情况下才有效
采用中断控制方式.
******************************************************************************/
#include〈reg52、h〉
#include〈intrins、h〉
#define uchar unsigned char
#define uint unsigned int
char cent=0;
char second=0;
char minite=0;
bit s2=0;
bit s3=0;
bit s4=0;
bit s5=0;
bit s6=0;
/*共阳数码管字型码*/
/*0,1,2,3,4,5,6,7,8,9,p、,灭*/
char code dis_code[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x0c,0xff,0xbf};
/*P点显示代码序号*/
char data find_code[]={0,0,12,0,0,12,0,0};
/********************************************************/
//函数名: void Delay1ms(uint count)
//功能: 延时时间为1ms
//输入参数:count,1ms计数
//说明:总共延时时间为1ms乘以count,crystal=12Mhz
/********************************************************/
/* 延迟函数 */
void Delay1ms(uint count)
{
uint j;
while(count—-!=0)
{
for(j=0;j〈80;j++);
}
}
/************************************************************************/
/*显示函数*/
/************************************************************************/
void disp()
{
char i,j=0xfe;
char k;
for(i=0;i〈8;i++)
{
P2=j;
k=find_code[i];
P0=dis_code[k];
Delay1ms(1);
j=_crol_(j,1);ﻩ
}
ﻩ P0=0xff;
}
/************************************************************************
* 函数原型:keychuli();
* 功 能:处理与键盘相连得P1口得内容,作为键值。
************************************************************************/
uchar keychuli()
{
uchar k;
k=P1; //P1口内容送K
k=~k; //取反
return(k); //返回键值
}
/************************************************************************
* 函数原型:key();
* 功 能:键盘扫描函数,函数返回值即键值.
************************************************************************/
uchar key()
{
uchar keyzhi,keyzhii; //电子钟键盘按键键值临时存放
keyzhi=keychuli(); //调P1口处理函数
if(keyzhi!=0) //有键动作延时去抖动,否则函数返回
ﻩ {
ﻩ disp();
disp();
ﻩ keyzhi=keychuli(); //再次调P1口处理函数
ﻩ if(keyzhi!=0) //真正有键按下,取键值并暂存
ﻩ {
ﻩﻩ keyzhii=keyzhi;
ﻩ while(keyzhi!=0) //判按键就是否释放,没有释放延时去抖动等待释放
{
ﻩﻩ disp();
ﻩ disp();
keyzhi=keychuli();
ﻩ }
ﻩﻩ keyzhi=keyzhii; //按键释放后恢复按键键值
}
}
return(keyzhi); //返回按键键值
}
void zxxq()ﻩ /*更新显示区*/
{
find_code[0]=cent%10; ﻩ
find_code[1]=cent/10;
find_code[2]=12;
find_code[3]=second%10;
find_code[4]=second/10;
find_code[5]=12;
find_code[6]=minite%10;
find_code[7]=minite/10;ﻩ
}
/*中断函数*/
TTCO () interrupt 1 using 1
{
ﻩTH0=(65536-7000)/256; //赋初值
TL0=(65536—7000)%256;
ﻩcent++;
ﻩ if(cent==100)
ﻩ ﻩ{
ﻩ cent=0;
second++;
ﻩﻩ ﻩﻩif(second==60)
ﻩﻩﻩﻩﻩ {
ﻩ ﻩﻩﻩ second=0;
ﻩﻩﻩﻩ minite++;
ﻩﻩ ﻩ ﻩif(minite==60)
ﻩﻩ ﻩﻩﻩ{
ﻩ ﻩﻩ ﻩﻩﻩminite=0; ﻩﻩﻩﻩﻩ ﻩ
ﻩ ﻩ ﻩ }
ﻩﻩﻩ }
ﻩﻩ}
ﻩzxxq();
}
/*主函数*/
void main()
{ﻩ
char kz;ﻩ
EA=1;
ﻩ ET0=1;
TMOD=0X01;
ﻩ TH0=(65536—7000)/256;
TL0=(65536—7000)%256;
ﻩ find_code[0]=11;
find_code[1]=11;
find_code[2]=11;
find_code[3]=11;
find_code[4]=11;
find_code[5]=11;
find_code[6]=11;
ﻩ find_code[7]=10;
ﻩ disp();
while(1)
{
kz=key();ﻩ
switch(kz)
ﻩ {
ﻩ ﻩ case 0x00:disp();break; ﻩ /*判断键值后 直接调用循环显示函数*/
case 0x01: ﻩ // 启动 在开始或清零下
ﻩﻩ if(s3==0&&s4==0)
ﻩ ﻩ {
ﻩﻩ ﻩﻩ TR0=1;
ﻩ ﻩ zxxq();
ﻩﻩﻩ disp();
ﻩ ﻩ }
ﻩ break ;
ﻩ case 0x02: ﻩﻩﻩﻩ //停止 在启动下
ﻩ ﻩ if(s4==0)
ﻩ {
ﻩﻩ ﻩﻩ s3=1;
ﻩﻩ ﻩ TR0=0;
ﻩﻩﻩ ﻩ zxxq();
ﻩ ﻩ disp();
ﻩ ﻩﻩﻩ } ﻩﻩ
ﻩﻩ break;ﻩﻩ
ﻩﻩﻩ case 0x04: // 暂停 在启动下
if(s3==0)
ﻩﻩ ﻩﻩ {
ﻩ ﻩ s4=1;
ﻩﻩ TR0=0;
ﻩ zxxq();ﻩ
ﻩ ﻩﻩﻩ disp();
ﻩ ﻩ }
ﻩﻩﻩ break;
case 0x08: // 继续 在暂停下
ﻩ if(s4&&s3==0)
ﻩ ﻩ {
ﻩﻩﻩﻩ s4=0;
ﻩﻩﻩ ﻩ TR0=1;
ﻩ zxxq();
ﻩﻩﻩﻩﻩ disp();
ﻩﻩ ﻩ }
ﻩ break; ﻩ
ﻩ ﻩ case 0x10: ﻩﻩ // 清零 在停止下
ﻩ ﻩ if(s3&&!s4)
ﻩﻩ ﻩﻩ {
ﻩﻩﻩ ﻩ s3=0;
ﻩ ﻩ s4=0;
ﻩ ﻩﻩ TR0=0;
ﻩﻩﻩ ﻩﻩ cent=0;
second=0;
minite=0;
ﻩ ﻩﻩ zxxq();
ﻩ ﻩ disp();
ﻩ ﻩ ﻩ }
ﻩ break; ﻩ ﻩﻩﻩ ﻩ ﻩ ﻩﻩﻩ ﻩ
ﻩﻩ }ﻩ ﻩﻩﻩﻩ
}
}
展开阅读全文