注册会员
- 积分
- 28
- 威望
- 26
- 贡献
- 2
- 兑换币
- 2
- 注册时间
- 2015-5-7
- 在线时间
- 0 小时
- 毕业学校
- WuHan University of Technology
|
interrupt void scan(void) 为什么没有声明 就能直接引用中断?
#include <hidef.h> /* common defines and macros */
#include "derivative.h" /* derivative-specific definitions */
#define CONT1 PORTK_PK3
#define CONT2 PORTK_PK2
#define CONT3 PORTK_PK1
#define CONT4 PORTK_PK0
#define CONT1_dir DDRK_DDRK3
#define CONT2_dir DDRK_DDRK2
#define CONT3_dir DDRK_DDRK1
#define CONT4_dir DDRK_DDRK0
#define DATA PTP
#define DATA_dir DDRP
#define KEY1 PTIH_PTIH3
#define KEY1_dir DDRH_DDRH3
#define LEDCPU PORTK_PK4
#define LEDCPU_dir DDRK_DDRK4
#define BUZZ PORTK_PK5
#define BUZZ_dir DDRK_DDRK5
#define BUS_CLOCK 32000000 //总线频率
#define OSC_CLOCK 16000000 //晶振频率
byte data1 = 0;
byte data2 = 10;
byte data3 = 0;
byte data4 = 0;
byte single = 1;
unsigned char fen=99,miao=0;
unsigned char statesingle = 0; //0为等待,1为开始计时,2计时时间到
unsigned int temp;
unsigned int cycle=0;
byte shuma[20]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f, //0~9对应的段码
0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef}; //0~9后加小数点对应的段码
/*************************************************************/
/* 初始化锁相环 */
/*************************************************************/
void INIT_PLL(void)
{
CLKSEL &= 0x7f; //set OSCCLK as sysclk
PLLCTL &= 0x8F; //Disable PLL circuit
CRGINT &= 0xDF;
#if(BUS_CLOCK == 40000000)
SYNR = 0x44;
#elif(BUS_CLOCK == 32000000)
SYNR = 0x43;
#elif(BUS_CLOCK == 24000000)
SYNR = 0x42;
#endif
REFDV = 0x81; //PLLCLK=2×OSCCLK×(SYNDIV+1)/(REFDIV+1)=64MHz ,fbus=32M
PLLCTL =PLLCTL|0x70; //Enable PLL circuit
asm NOP;
asm NOP;
while(!(CRGFLG&0x08)); //PLLCLK is Locked already
CLKSEL |= 0x80; //set PLLCLK as sysclk
}
/************************************************************/
/* 初始化ECT模块 */
/************************************************************/
void initialize_ect(void){
TSCR1_TFFCA = 1; // 定时器标志位快速清除
TSCR1_TEN = 1; // 定时器使能位. 1=允许定时器正常工作; 0=使主定时器不起作用(包括计数器)
TIOS = 0xff; //指定所有通道为输出比较方式
TCTL1 = 0x00; // 后四个通道设置为定时器与输出引脚断开
TCTL2 = 0x00; // 前四个通道设置为定时器与输出引脚断开
TIE = 0x01; // 允许通道0定时中断
TSCR2 = 0x07; // 预分频系数pr2-pr0:111,,时钟周期为4us,
TFLG1 = 0xff; // 清除各IC/OC中断标志位
TFLG2 = 0xff; // 清除自由定时器中断标志位
}
/*************************************************************/
/* 初始化端口 */
/*************************************************************/
void INIT_port(void)
{
CONT1_dir = 1; //DDRK3
CONT2_dir = 1;
CONT3_dir = 1;
CONT4_dir = 1;
CONT1 = 0;
CONT2 = 0; //PORTK
CONT3 = 0;
CONT4 = 0;
DATA_dir = 0xff;
DATA = 0x00; //PTP连接数码管
}
/*************************************************************/
/* 初始化按键 */
/*************************************************************/
void INIT_KEY(void)
{
KEY1_dir=0; //PH3
PPSH = 0x00; //极性选择寄存器,选择下降沿;
PIFH = 0xFF; //对PIFH的每一位写1来清除标志位;
PIEH = 0x08; //中断使能寄存器;
}
/*************************************************************/
/* PIT模块初始化函数 */
/*************************************************************/
void init_PIT(){
PITMTLD0=249; //为0通道8位计数器赋值
PITLD0=63999; //为0通道16位计数器赋值 //(249+1)*(63999+1)=16000000个总线周期=0.5秒
PITMUX_PMUX0=0; //第0通道使用微计数器0
PITCFLMT=0X80; //使能周期中断定时器
}
/*************************************************************/
/* 延时函数 */
/*************************************************************/
void delay(void)
{
unsigned int i,j;
for(j=0;j<200;j++)
for(i=0;i<60000;i++);
}
/*************************************************************/
/* 中断扫描函数 */
/*************************************************************/
#pragma CODE_SEG __NEAR_SEG NON_BANKED
interrupt void scan(void)
{
if(TFLG1_C0F == 1)
{
TFLG1_C0F = 1;
TC0 = TCNT + 1250; //设置输出比较时间为5ms
}
switch(single)
{
case 1:
CONT1 = 1; //CONT1 PORTK_PK3
CONT2 = 0;
CONT3 = 0;
CONT4 = 0;
if(data1==0)
DATA=0; //DATA PTP
else
DATA=shuma[data1];
break;
case 2:
CONT1 = 0;
CONT2 = 1;
CONT3 = 0;
CONT4 = 0;
DATA=shuma[data2];
break;
case 3:
CONT1 = 0;
CONT2 = 0;
CONT3 = 1;
CONT4 = 0;
DATA=shuma[data3];
break;
case 4:
CONT1 = 0;
CONT2 = 0;
CONT3 = 0;
CONT4 = 1;
DATA=shuma[data4];
break;
default:
break;
}
single +=1;
if(single == 5) single = 1;
}
/*************************************************************/
/* 按键中断函数 */
/*************************************************************/
interrupt void PTH_inter(void)
{
if(PIFH != 0) //判断中断标志
{
PIFH = 0xff; //清除中断标志
if(KEY1 == 0) //按键1按下
{
if(statesingle==0)
{
statesingle=1;
PITCE_PCE0=1; //PIT第0通道计数器工作
PITINTE_PINTE0=1; //PIT0通道定时器定时中断被使能
}
}
}
}
/*************************************************************/
/* 计时中断函数 */
/*************************************************************/
interrupt void PIT_INTER(void)
{
if(PITTF_PTF0 == 1)
PITTF_PTF0 = 1; //清除标志位
cycle+=1;
if(cycle>1)
{
cycle=0;
if(miao==0)
{
fen-=1;
miao=59;
}
else
miao-=1;
data1=fen/10; //分的十位数
data2=fen%10; //分的个位数
data2=data2+10; //加小数点小数点跟在分钟个位数
data3=miao/10; //秒的十位数
data4=miao%10; //秒的个位数
if(fen==0&&miao==0)
{
PITCE_PCE0=0; //禁止PIT第0通道计数器工作
PITINTE_PINTE0=0; //PIT0通道定时器定时中断被禁止
statesingle=2;
}
}
}
#pragma CODE_SEG DEFAULT
/*************************************************************/
/* 主函数 */
/*************************************************************/
void main(void) {
DisableInterrupts;
INIT_PLL();
initialize_ect();
INIT_port();
INIT_KEY();
init_PIT();
LEDCPU_dir=1; //LEDCPU PORTK_PK4 output
LEDCPU=0;
BUZZ_dir=1;
BUZZ=0; //ring
EnableInterrupts;
TFLG1_C0F = 1;
TC0 = TCNT + 1250; //设置输出比较时间为5ms
data1=fen/10;
data2=fen%10;
data2=data2+10; //加小数点
data3=miao/10;
data4=miao%10;
for(;;)
{
if(statesingle==2)
{
BUZZ=1;
delay();
BUZZ=0;
for(;;);
}
}
}
|
|