当前位置:文档之家› 飞思卡尔S12G系列芯片Demo程序之按键中断实验

飞思卡尔S12G系列芯片Demo程序之按键中断实验


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
/*************************************************************/
#pragma CODE_SEG __NEAR_SEG NON_BANKED
/*中断函数置于非分页区内,由于飞思卡尔 16 位单片机的中断向量是 16 位
所以中断函数只有被置于非分页区内才能被寻址到,这就是第一行的作用*/
//#pragma 主要作用是设定编译器状态,指示编译器完成一些特定动作
interrupt void RTI_inter(void)
//锁相环调频启用,用以减少噪音 //等待 PLLCLK 锁定 //使能时钟配置保护
}
/*************************************************************/
/*
初始化实时中断
*/
/*************************************************************/
{
DisableInterrupts; INIT_PLL(); INIT_RTI(); LEDCPU_dir = 1; LEDCPU = 0; EnableInterrupts; for(;;) { } }
以上 Demo 程序已通过本人亲自验证,可实现相关功能,对代码中有疑问的朋友
欢迎在主页区留言交流。
/*
初始化锁相环
*/
/*
使用外部晶振:16MHz
*/
/*
设置总线频率:16MHz
*/
/*************************************************************/
void INIT_PLL(void)
{
CPMUPROT=0x26;
//解除时钟配置保护
CPMUCLKS_PSTP = 0; //禁止 PLL
CPMUPROT= 0x01;
//使能时钟配置保护
}
/*************************************************************/
/*
实时中断函数(声明中断函数)
*/
/*************************************************************/
delay(time); if(directita==0)
data=0x01; } else {
data=data>>1; if(data==0)
data=0x80; }
LED = ~data; } }
//左移一位 //右移一位
2、按键中断
#include <hidef.h>
最后一行即为此作用*/
/*************************************************************/
/*
主函数
*/
/*************************************************************/
void main(void)
{
if(CPMUFLG_RTIF == 1)
CPMUFLG_RTIF = 1;
single +=1;
if (single==15)
{
LEDCPU = ~LEDCPU;
single = 0;
}
}
#pragma CODE_SEG DEFAULT
/*后续代码置于默认区内,由于单片机内部非分页区大小有限,非中断函数一般置于分页区内,
unsigned char direction=1; unsigned char time=5;
//设置灯亮的方向,0 向左,1 向右。 //设置灯闪的速度。
/*************************************************************/
/*
延时函数
*/
void INIT_RTI(void)
{ CPMUPROT=0x26;
//解除时钟配置保护
CPMUCLKS_RTIOSCSEL = 1; //RTI 时钟源为晶振时钟
CPMUINT = 0x80;
//使能实时中断
CPMURTI = 0x6f;
//设置实时中断的时间间隔为 32.768ms,根据机器周期求得
CPMUCLKS_PLLSEL = 1; //设置 PLLCLK 为系统时钟
CPMUOSC_OSCE=1;
//使能外部晶振
CPMUSYNR=0x01;
//SYNDIV 的值为 1,
CPMUREFDIV = 0x81; //REFDIV 的值为 1
CPMUPOSTDIV=0x00;
CPMUPLL=0x10; while(CPMUFLG_LOCK==0); CPMUPROT=0x01;
#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)
/*
主函数
*/
/*************************************************************/
void main(void)
{
DisableInterrupts;
init_led();
init_key(); EnableInterrupts;
for(;;) {
1、按键中断
#include <hidef.h> #include "derivative.h"
#define LED
PORTA
#define LED_dir DDRA
#define KEY1 PTIJ_PTIJ0
#define KEY2 PTIJ_PTIJ1
#define KEY3 PTIJ_PTIJ2
//极性选择寄存器,选择下降沿; //对 PIFJ 的每一位写 1 来清除标志位; //中断使能寄存器;
/*************************************************************/
/*
按键中断函数
*/
/*************************************************************/
#define KEY4 PTIJ_PTIJ3
#define KEY1_dir DDRJ_DDRJ0
#define KEY2_dir DDRJ_DDRJ1
#define KEY3_dir DDRJ_DDRJ2
#define KEY4_dir DDRJ_DDRJ3
unsigned char data=0x01;
/*
初始化按键
*/
/*************************************************************/
void init_key(void)
{ KEY1_dir =0;
//设置为输入
KEY2_dir=0; KEY3_dir=0; KEY4_dir=0; PPSJ = 0x00; PIFJ = 0x0f; PIEJ = 0x0f; }
#include "derivative.h"
#define LEDCPU
PORTD_PD3
#define LEDCPU_dir DDRD_DDRD3
unsigned char single = 0;
/*************************************************************/
/*
初始化 LED 灯
*/
/*************************************************************/
void init_led(void)
{ LED_dir=0xff; LED=~data;
//设置为输出 //点亮 LED1
}
/*************************************************************/
/*************************************************************/
void delay(unsigned int n)
{
unsigned int i,j;
for(j=0;j<n;j++)
for(i=0;i<40000;i++);
}
/*************************************************************/
相关主题