当前位置:文档之家› 输入捕捉中断编程实例

输入捕捉中断编程实例

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