1、10.3.3 输入捕捉中断编程实例下面程序验证定时器1通道0(引脚21)输入捕捉中断的产生,当中断发生时取反指示灯PTA1。定时器1通道0的输入捕捉中断向量的地址是$FFF6。(1) 输入捕捉中断编程实例汇编语言程序实例编号:A05_2 路径:ASM A05_2定时器输入捕捉(Ch0main.asm) *-*工 程 名:Tim1Ch0.ASM *硬件接线:1:PTA.1接指示灯 * 2:PTD.4,即定时器1通道0(21脚)接开关 *程序描述:输入捕捉中断方式,使开关拨动时指示灯PTA.1闪烁 *目 的:学习HC08系列定时器输入捕捉功能 *说 明:本例是将定时器1通道0(21脚)设为跳变沿捕
2、捉 *-嵌入式应用技术基础教程教学实例-*头文件$include GP32ASM.H ;包含GP32的头文件*两个起始地址名RAMstartAddr equ $0040 ;RAM的起始地址FlashStartAddr equ $8000 ;程序开始地址*指示灯定义Light_P equ PTA ;灯(Light)接在PTA口Light_D equ DDRA ;相应的方向寄存器Light_Pin equ 1 ;所在的引脚CH0FBit equ 7 ;定时器1通道标志位*=*主程序 org FlashStartAddr ;程序起始地址MainInit: ;复位后程序从此开始执行 ;系统初始化 SE
3、I ;关总中断 LDHX #$023F ;堆栈初始化 TXS JSR GP32Init ;调系统初始化子程序GP32Init ;I/O初始化 BSET Light_Pin,Light_D ;令指示灯引脚为输出 BSET Light_Pin,Light_P ;初始时,指示灯暗 ;定时器1通道0初始化 ;不允许溢出中断、不启动计数、分频因子=1 LDA #%00110000 STA T1SC ;输入捕捉模式,允许输入捕捉中断,跳变沿捕捉 LDA #%01001100 STA T1SC0 ;允许定时器1计数寄存器计数 BCLR 5,T1SC CLI ;开总中断 ;主循环开始MainLoop: NOP
4、 JMP MainLoop *内部直接调用子程序存放处*Tim1CH0Int:定时器1通道0输入捕捉中断子程序-*功能:定时器输入捕捉中断处理,开关拨动时指示灯PTA.1闪烁 *入口:无 *出口:无 *-* Tim1CH0Int: PSHH ;保护 H ;至此,可读取计数器的值,可在此处添加用户的程序.本程 ;序仅为实验例程,用指示等状态改变,说明发生了中断 ;指示灯状态变换 BRCLR Light_Pin,Light_P,Tim1CH0Int_1 BCLR Light_Pin,Light_P ;若原来灯暗,则变亮 BRA Tim1CH0Int_2Tim1CH0Int_1: BSET Ligh
5、t_Pin,Light_P ;若原来灯亮,则转暗Tim1CH0Int_2: ;清除定时器1通道0输入捕捉中断标志位 LDA T1SC0 BCLR CH0FBit,T1SC0 PULH ;恢复H RTI*外部子程序存放处$include GP32Init.ASM*中断向量 ORG $FFF6 ;定时器1通道0输入捕捉中断向量 DW Tim1CH0Int ORG $FFFE ;复位向量 DW MainInit(2)输入捕捉中断编程实例C语言主程序实例编号:C05_2 路径:CC05_2定时器输入捕捉(tim1ch0.prj)/*-*文件名:Tim1Ch0I.prj *硬件接线:1:PTA.1接指示
6、灯 * 2:PTD.4,即定时器1通道0(21脚),接开关 *程序描述:以输入捕捉中断方式, * 开关拨动使捕捉中断取反指示灯PTA1,使其闪动 *目的:学习HC08系列定时器溢出捕捉功能 *说明:本例是将定时器1通道0(21脚)设为跳变沿捕捉 * (即电平发生变化时产生中断),验证方法是将21脚不 * 断接高电平、低电平,此时指示灯PTA1状态跟随改变 * *-嵌入式应用技术基础教程教学实例-*/#include GP32C.h#define Light_P PTA /灯(Light)接在PTA口#define Light_D DDRA /相应的方向寄存器#define Light_Pin
7、1 /所在的引脚#define CH0FBit 7 /定时器1通道标志位/*函数声明*/void SetTim1Ch0I(void); /定时器1和定时器1通道0初始化void main() asm(SEI); /禁止所有中断 /I/O初始化 Light_D|=1Light_Pin; /令指示灯引脚为输出 Light_P|=1Light_Pin; /初始时,指示灯暗 /定时器1和定时器1通道0初始化 SetTim1Ch0I(); asm(CLI); /开放中断 /主循环开始,为空操作 /等待输入捕捉中断,(开关的拨动) while(1);/*SetTim1Ch0I:定时器1和定时器1通道0 初
8、始化-* 功能:初始化定时器1和定时器1通道0 * * 参数:无 * 返回:无 *-*/void SetTim1Ch0I() T1SC=0b00110000; /不允许溢出中断、不启动计数、分频因子=1 T1SC0=0b01001100;/允许CH0输入捕捉中断,跳变沿捕捉 T1SC&=(15); /允许定时器1计数寄存器计数 (3)输入捕捉中断编程实例C语言矢量表文件输入捕捉中断编程C语言程序例矢量表文件(vectors08.c)#include GP32C.h/*引脚定义*/#define Light_P PTA /灯(Light)接在PTA口#define Light_D DDRA /相
9、应的方向寄存器#define Light_Pin 1 /所在的引脚#define CH0FBit 7 /定时器1通道标志位/ vectors08.c 用于定义中断矢量表/*isrTim1Ch0I:输入捕捉中断处理函数-*功 能: 当前灯的状态 *-*/#pragma interrupt_handler isrTim1Ch0Ivoid isrTim1Ch0I(void) unsigned char temp=Light_P; temp&=1Light_Pin; /取得当前灯的状态if(temp!=0) /原来指示灯暗,则变亮 Light_P&=1Light_Pin; else /原来指示灯亮,则
10、变暗 Light_P|=1Light_Pin;T1SC0&=(1CH0FBit); /清除定时器溢出标志位 #pragma interrupt_handler isrDummyvoid isrDummy(void) /中断矢量表,如果需要定义其它中断函数,/请修改下表中的相应项目#pragma abs_address:0xffdcvoid (* const _vectab)(void) = isrDummy, /Timebase isrDummy, /ADC isrDummy, /KBI isrDummy, /SCI TC/TE isrDummy, /SCI RF/IDLE isrDummy,
11、 /SCI PE/FE/NF/OR isrDummy, /SPI TE isrDummy, /SPI MOD/OVR/RF isrDummy, /TIM2 OVR isrDummy, /TIM2 channel 1isrDummy, /TIM2 channel 0isrDummy, /TIM1 OVR isrDummy, /TIM1 channel 1isrTim1Ch0I, /TIM1 channel 0 isrDummy, /CGM isrDummy, /IRQ isrDummy /SWI /*RESET也是中断,定义在 crt08.o中 */;#pragma end_abs_address