//以前写过一个计时程序,是用汇编语言写的,只用了一个按键实现计时器的启动、暂停和复位。
//有位网友要求用C语言写一遍,并提供了部分程序,在下面的博文留言中可以看到:
//http://hi.baidu.com/%D7%F6%B6%F8%C2%DB%B5%C0/blog/item/2ece818af7a3f20bc9fc7aca.html
//但是这个程序有不少错误,设定定时器的方式时,使用了T0,但是却把初始值送到了TH1TL1,呵呵
//接着启动了T1,之后却反复判断TF0是否为1 !
//这个程序并且缺少开始/暂停/复位的按键,有兴趣的读者可以到上面的链接去看原始程序。
//
//做而论道对程序进行了改正,增加了启动、暂停和复位的按键,原来的个位加一的按键功能,照样保留。
//然后又补写了许多注释。
//程序仿真运行时的截图如下:
//程序如下:
#include <at89x52.h>
//--------------------------------------------------
unsigned char code Seg7Code[16] = { //用十六进数作为数组下标,可直接取得对应的七段编码字节
0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, // 0 1 2 3 4 5 6 7
0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71};// 8 9 A b C d E F
//--------------------------------------------------
void main( void )
{
unsigned int us250 = 0;
unsigned char s10 = 0;
unsigned char s1 = 0;
unsigned char key1 = 0; //记忆按键状态,为1按下
unsigned char key2 = 0; //记忆按键状态,为1按下
//--------------------------------------------------
TMOD = (TMOD & 0xF0) | 0x02; //T0定时方式2
TH0 = -250;//对于8位二进数来说, -250=6, 就是加250次1时为256,即为0
TR0 = 1;
while(1) { //----循环1--显示、循环2
P0 = Seg7Code[ s10 ]; //显示秒十位
P2 = Seg7Code[ s1 ]; //显示秒个位
while( 1 ) { //----循环2--读出时间、键盘
//--------------------------------------------------
if( TF0 == 1 ) { //计时处理
TF0 = 0;
if( ++us250 >= 4000 ) {
us250 = 0;
if( ++s1 >= 10 ) {
s1 = 0;
if( ++s10 >= 10 ) s10 = 0;
}
break; //跳出"循环2",去显示
} }
//--------------------------------------------------
P3_2 = 1; //输入,先要输出高电平
if( key2 == 1 ) { //已经按过
if( P3_2 == 1 ) key2 = 0;//松键
}
else { //未按过
if( P3_2 == 0 ) { //现在按下了
key2 = 1;
if (TR0) TR0 = 0;
else {
s1 = 0; s10 = 0; //清零
us250 = 0;
TR0 = 1;
break; //跳出"循环2",去显示
} } }
//--------------------------------------------------
P3_3 = 1; //输入,先要输出高电平
if( key1 == 1 ) { //个位键已经按过
if( P3_3 == 1 ) key1 = 0;//松键
}
else { //没有按过
if( P3_3 == 0 ) { //按下了
key1 = 1; //做按下的标记
if( ++s1 >= 10 ) s1 = 0;
break; //跳出"循环2",去显示
} }
//--------------------------------------------------
} //循环2'end
} //循环1'end
} //main'end
//--------------------------------------------------