飞思卡尔S12G系列芯片Demo程序之【按键中断实验】
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1、按键中断
#include <hidef.h>
#include "derivative.h"
#define LED PORTA
#defineLED_dirDDRA
#define KEY1PTIJ_PTIJ0
#define KEY2PTIJ_PTIJ1
#define KEY3 PTIJ_PTIJ2
#define KEY4PTIJ_PTIJ3
#define KEY1_dirDDRJ_DDRJ0
#define KEY2_dir DDRJ_DDRJ1
#define KEY3_dir DDRJ_DDRJ2
#define KEY4_dir DDRJ_DDRJ3
unsigned char data=0x01;
unsigned char direction=1; //设置灯亮的方向,0向左,1向右。
unsigned char time=5; //设置灯闪的速度。
/*************************************************************/ /* 延时函数*/ /*************************************************************/ void delay(unsigned int n)
{
unsignedinti,j;
for(j=0;j<n;j++)
for(i=0;i<40000;i++);
}
/*************************************************************/ /* 初始化LED灯*/ /*************************************************************/ voidinit_led(void)
{
LED_dir=0xff; //设置为输出
LED=~data; //点亮LED1
}
/*************************************************************/ /* 初始化按键*/ /*************************************************************/ voidinit_key(void)
{
KEY1_dir =0; //设置为输入
KEY2_dir=0;
KEY3_dir=0;
KEY4_dir=0;
PPSJ = 0x00; //极性选择寄存器,选择下降沿;
PIFJ = 0x0f; //对PIFJ的每一位写1来清除标志位;
PIEJ = 0x0f; //中断使能寄存器;
}
/*************************************************************/ /* 按键中断函数*/ /*************************************************************/ #pragma CODE_SEG __NEAR_SEG NON_BANKED
interrupt void PTJ_inter(void)
{
if(PIFJ != 0) //判断中断标志
{
PIFJ = 0xff; //清除中断标志
if(KEY1 == 0) //按键1按下
{
time-=1;
if(time==0)
time=1;
}
if(KEY2 == 0)
{
time+=1;
if(time>10)
time=10;
}
if(KEY3 == 0)
direction=0;
if(KEY4 == 0)
direction=1;
}
}
#pragma CODE_SEG DEFAULT
/*************************************************************/ /* 主函数*/ /*************************************************************/ void main(void)
{
DisableInterrupts;
init_led();
init_key();
EnableInterrupts;
for(;;)
{
delay(time);
if(direction==1)
{
data=data<<1; //左移一位
if(data==0)
data=0x01;
}
else
{
data=data>>1; //右移一位
if(data==0)
data=0x80;
}
LED = ~data;
}
}
2、按键中断
#include <hidef.h>
#include "derivative.h"
#define LEDCPU PORTD_PD3
#define LEDCPU_dirDDRD_DDRD3
unsigned char single = 0;
/*************************************************************/ /* 初始化锁相环*/ /* 使用外部晶振:16MHz */ /* 设置总线频率:16MHz */ /*************************************************************/ void INIT_PLL(void)
{
CPMUPROT=0x26; //解除时钟配置保护
CPMUCLKS_PSTP = 0; //禁止PLL
CPMUCLKS_PLLSEL = 1; //设置PLLCLK为系统时钟
CPMUOSC_OSCE=1; //使能外部晶振
CPMUSYNR=0x01; //SYNDIV的值为1,
CPMUREFDIV = 0x81; //REFDIV的值为1
CPMUPOSTDIV=0x00;
CPMUPLL=0x10; //锁相环调频启用,用以减少噪音
while(CPMUFLG_LOCK==0); //等待PLLCLK锁定
CPMUPROT=0x01; //使能时钟配置保护
}
/*************************************************************/
/* 初始化实时中断*/
/*************************************************************/
void INIT_RTI(void)
{
CPMUPROT=0x26; //解除时钟配置保护
CPMUCLKS_RTIOSCSEL = 1; //RTI时钟源为晶振时钟
CPMUINT = 0x80; //使能实时中断
CPMURTI = 0x6f; //设置实时中断的时间间隔为32.768ms,根据机器周期求得CPMUPROT= 0x01; //使能时钟配置保护
}
/*************************************************************/
/* 实时中断函数(声明中断函数)*/
/*************************************************************/
#pragma CODE_SEG __NEAR_SEG NON_BANKED
/*中断函数置于非分页区内,由于飞思卡尔16位单片机的中断向量是16位
所以中断函数只有被置于非分页区内才能被寻址到,这就是第一行的作用*/
//#pragma主要作用是设定编译器状态,指示编译器完成一些特定动作
interrupt void RTI_inter(void)
{
if(CPMUFLG_RTIF == 1)
CPMUFLG_RTIF = 1;
single +=1;
if (single==15)
{
LEDCPU = ~LEDCPU;
single = 0;
}
}
#pragma CODE_SEG DEFAULT
/*后续代码置于默认区内,由于单片机内部非分页区大小有限,非中断函数一般置于分页区内,最后一行即为此作用*/
/*************************************************************/
/* 主函数*/
/*************************************************************/
void main(void)
{
DisableInterrupts;
INIT_PLL();
INIT_RTI();
LEDCPU_dir = 1;
LEDCPU = 0;
EnableInterrupts;
for(;;)
{
}
}
以上Demo程序已通过本人亲自验证,可实现相关功能,对代码中有疑问的朋友欢迎在主页区留言交流。