|
//頭文件聲明區
#include <REGX52.H>
#include "key.h"
#include "seg.h"
//變量聲明區
unsigned char key_slow_down;//按鍵減速變量
unsigned char key_val,key_down,key_old,key_up;//按鍵掃描變量
unsigned int seg_slow_down;//數碼管減速變量
unsigned int time_1000ms;// 定時器時間計數
unsigned char seg_mode;//數碼管顯示模式
unsigned char seg_pose;//數碼管顯示變量
unsigned char seg_buff[6]={10,10,10,10,10,10};//數碼管顯示變量組
unsigned char count=30;//倒計時
//按鍵處理函數
void key_pro()
{
if(key_slow_down)return;
key_slow_down=1;
key_val=key_read();
key_down=key_val&(key_val^key_old);
key_up=key_val&(key_val^key_old);
key_old=key_val;
switch(key_down)
{
}
}
//數碼管函數
void seg_pro()
{
if(seg_slow_down)return;
seg_slow_down=1;
seg_buff[0]=seg_mode+1;
if(seg_mode==0)
{
seg_buff[4]=count /10%10;//數碼管第五個燈顯示倒計時十位數
seg_buff[5]=count %10;//數碼管第6個燈顯示倒計時個位數
}
}
//led函數
void led_proc()
{
}
//定時器0初始化函數
void Timer0_Init(void) //1毫秒@12.000MHz
{
TMOD &= 0xF0; //設置定時器模式
TMOD |= 0x01; //設置定時器模式
TL0 = 0x20; //設置定時初始值
TH0 = 0xD1; //設置定時初始值
TF0 = 0; //清除TF0標志
TR0 = 1; //定時器0開始計時
ET0=1;
EA=1;
}
//定時器服務函數
void time0server() interrupt 1
{
TL0 = 0x20;
TH0 = 0xD1;
if(++key_slow_down==10)key_slow_down=0;
if(++seg_slow_down==500)seg_slow_down=0;
if(++seg_pose==6)seg_pose=0;
seg_disp(seg_pose,seg_buff[seg_pose]);
if(++time_1000ms==1000)
{
time_1000ms=0;
count--;//每秒倒計時減少一秒
}
}
//主
void main()
{
Timer0_Init();
while(1)
{
seg_pro();
led_proc();
key_pro();
}
}
有大哥知道,為啥數碼管倒計時顯示只停留在30嗎,不進行倒計時
|
|