打卡第十一章:定时器的使用










#include "COMM/stc.h" //调用头文件
#include "COMM/usb.h"
#define KEY1 P32 //定义一个按键 引脚选择P32
#define KEY2 P33 //定义一个按键 引脚选择P33
#define BEEP P54 //定义一个按键 引脚选择P54
#define SEG_Delay 1 //延时多少ms
#define MAIN_Fosc 24000000UL //定义主时钟
char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";
u8 SEG_Tab[20] = { 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90, 0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10}; //0-9段码,0-9带小数点
u8 COM_Tab[8] = { 0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe }; //0-7的位码数组
u8 Show_Tab[8] = {3,0,0,0,0,10,0,0};
u32 TimCount = 0; //计数单位1ms
bit RUN_State = 0; //开始运行/结束运行
u8 num = 0;
void sys_init(); //函数声明
void delay_ms(u16 ms); //unsigned int
void SEG_Fre( void )
{
//位码选择第一位,段码选择0
P7 = COM_Tab[num]; //位码的选择
P6 = SEG_Tab[Show_Tab[num]];//需要显示的数字的内码 赋给 P6 NUM =0 -> Show_Tab[num]] = 1 -> p6 = oxF9
//delay_ms(SEG_Delay);
num++;
if( num >7 )
num = 0;
}
void Timer0_Init(void) //1毫秒@24.000MHz
{
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0x30; //设置定时初始值
TH0 = 0xF8; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1; //使能定时器0中断
}
void main() //程序开始运行的入口
{
sys_init(); //USB功能+IO口初始化
usb_init(); //usb库初始化
Timer0_Init();
EA = 1; //CPU开放中断,打开总中断。
while(1) //死循环
{
if( DeviceState != DEVSTATE_CONFIGURED ) //
continue;
if( bUsbOutReady )
{
usb_OUT_done();
}
//------------------------------------------------P32按下一次,灯往右边边移动一个单位 -----------------------------------------------
Show_Tab[0] = 1; //选择 1
Show_Tab[1] = 10; //选择 0.
Show_Tab[2] = 0; //选择 0
Show_Tab[3] = 0; //选择 0
if( KEY1 ==0 )
{
delay_ms(10);
if( KEY1 ==0 )
{
BEEP = 0;
delay_ms(10);
BEEP = 1;
while( KEY1 ==0 );
if( RUN_State==0 )
TimCount = 0;
RUN_State = !RUN_State;
}
}
}
}
void Timer0_Isr(void) interrupt 1
{
SEG_Fre(); //数码管刷新的
if( RUN_State==1 ) //如果开始运行
{
TimCount++; //每隔1ms+1
Show_Tab[4] = TimCount/10000%10;
Show_Tab[5] = TimCount/1000%10+10;
Show_Tab[6] = TimCount/100%10;
Show_Tab[7] = TimCount/10%10; //取10位
}
}