📄 main.c
字号:
#include <hidef.h> /* common defines and macros */
#include <mc9s12dg128.h> /* derivative information */
#pragma LINK_INFO DERIVATIVE "mc9s12dg128b"
#include "LED.h"
extern INT8U DispSegTbl[],DispHexToSegTbl[];
#define A PORTA_BIT0 //A键,接定时器TC1
#define B PORTA_BIT1 //B键,接定时器TC2
#define C PORTA_BIT2 //C键,接定时器TC3
#define Stop PORTA_BIT3 //Stop键,接定时器TC1
unsigned char Sec;
unsigned char Min;
unsigned char Her;
unsigned char Flag;
unsigned char Display[6];
/***********1ms延时**************/
void Dly1ms(int cnt)
{
int i;
int j;
for(i=0; i<cnt; i++)
{
j = 0x1300;
while(j--);
}
}
void main(void)
{
unsigned int i;
Sec = 0;
Min = 0;
Her = 0;
Flag = 0;
/**********************/
MCCTL = 0x4F; //模计数器设置,分频系数为16,(1100 1111)
MCFLG_MCZF = 1; //清除模计数器中断标志位
MCCNT = 500; //模计数器置初始值
/*********************/
/******************按键中断初始化**********************/
TSCR1 = 0X80; //TIMER使能
TSCR2 = 0X07; //主定时器中断禁止,并且设置预定因子为128
TIE = 0X1F; //TC0中断使能
TIOS = 0X01; //TC0设置为输出比较,TC1,CT2,TC3,TC4为输入捕捉
TCTL2 = 0;
TFLG1 = 0X01;
TCTL3 = 0X02;
TCTL4 = 0xAA; // 下降沿有效
PERT = 0xFF; //Pull enable
PPST =0X00; //Pull
TC0 = 62560;
TFLG1 = 0X1F; //清TC0中断标志位
DLYCT = 0x01; //延迟时间256个总线时钟周期
/*************************************************/
PORTB = 0xA4;
DDRB = 0XFF;
PORTK = 0XFF;
DDRK = 0XFF;
DispInit();
MCCTL_MCZI = 1;
/*************************************************/
for(i=0; i<6; i++)
DispSegTbl[i] = DispHexToSegTbl[16];
EnableInterrupts;
for(;;)
{
DispSegTbl[4] = DispHexToSegTbl[Sec/10];
DispSegTbl[5] = DispHexToSegTbl[Sec%10];
DispSegTbl[2] = DispHexToSegTbl[Min/10];
DispSegTbl[3] = DispHexToSegTbl[Min%10]&0x7f;
DispSegTbl[0] = DispHexToSegTbl[Her/10];
DispSegTbl[1] = DispHexToSegTbl[Her%10]&0x7f;
}
}
//以下代码为TC0定时器中断服务程序
#pragma CODE_SEG NON_BANKED
void interrupt TC0_ISR(void)
{
TFLG1 = 0X01;
TC0+= 62560;
if(Flag%2==0) {
Sec++;
if(Sec >= 60) {
Sec = 0;
Min++;
}
if(Min >= 60) {
Min = 0;
Her++;
}
if(Her > 23) {
Her = 0 ;
}
}
}
#pragma CODE_SEG DEFAULT
//以下代码为TC1定时器中断服务程序
#pragma CODE_SEG NON_BANKED
void interrupt TC1_ISR(void)
{
TFLG1 = 0X02;
Flag = 1;
if(Flag%2) {
Sec++;
if(Sec >= 60) {
Sec = 0;
}
}
}
#pragma CODE_SEG DEFAULT
//以下代码为TC2定时器中断服务程序
#pragma CODE_SEG NON_BANKED
void interrupt TC2_ISR(void)
{
TFLG1 = 0X04;
Flag=1;
if(Flag%2) {
Min++;
if(Min >= 60) {
Min = 0;
}
}
}
#pragma CODE_SEG DEFAULT
//以下代码为TC3定时器中断服务程序
#pragma CODE_SEG NON_BANKED
void interrupt TC3_ISR(void)
{
TFLG1 = 0X08;
Flag = 1;
if(Flag%2) {
Her++;
if(Her >= 24) {
Her = 0;
}
}
}
#pragma CODE_SEG DEFAULT
//以下代码为TC4定时器中断服务程序
#pragma CODE_SEG NON_BANKED
void interrupt TC4_ISR(void)
{
TFLG1 = 0X10;
Flag = 0 ;
}
#pragma CODE_SEG DEFAULT
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -