在线时间2 小时
UID3739447
注册时间2021-5-18
NXP金币0
该用户从未签到
新手上路
- 积分
- 33
- 最后登录
- 2021-9-27
|
程序头部定义了:static uint8 key_num = 0;//全局变量 用来计算按键 0 1 2 模式; 但不知道怎么回事 这个数总是会超出这三个数,变成其他数据,这个数只有再:KBI中断里面会变,也只再0 1 2 三个数之间变化; 但是经常会出现一些其他数据
芯片用的是mc9s8pa4 环境是 codewarrior 10.5
#include <hidef.h> /* for EnableInterrupts macro */
#include "derivative.h" /* include peripheral declarations */
#define LED_00 PORT_PTAD_PTAD0 //驱动MOS管
#define LED_01 PORT_PTAD_PTAD1 //驱动MOS管
#define SIGNAL_KEY PORT_PTAD_PTAD2 //刹车信号或者开关信号
#define MOS_ON 1 //LED点亮
#define MOS_OFF 0 //LED熄灭
typedef char int8;
typedef unsigned char uint8;
typedef int int16;
typedef unsigned int uint16;
typedef long int int32;
typedef unsigned long int uint32;
static uint8 key_num = 0;//全局变量
//==========================================
// 延时函数 1us 测试过与实际差不多 1ms比实际慢一点点
//==========================================
void delay32bit(uint32 i)
{ uint32 t=0;
for(t=0;t<i;t++)__RESET_WATCHDOG();}
void delay1us(uint8 t)
{ uint8 j;
for(t=0;t<10;t++)
{for(j=0;j<82;j++)__RESET_WATCHDOG();}}
void delay1ms(uint16 t)
{ uint16 i;
for(i=0;i<t;i++)delay32bit(24);}
void delay1ms_scan_key(uint16 t,uint8 key_mode)
{ uint16 i;
for(i=0;i<t;i++)
{
delay32bit(24);
if(key_num != key_mode)
break;
}
}
void LED_Mode_xunhang(void); //巡航灯模式
void LED_Mode_baoshan(void); //爆闪4次模式
void LED_Mode_hengliang(void); //恒亮模式
//=========================
//函数名:Init_KBI()
//功能:初始化键盘中断 PA2
//=========================
void Init_KBI(void)
{
PORT_PTAPE_PTAPE2 = 1;//引脚上拉使能 PA2
KBI0_SC = 0x02;//键盘中断状态和控制寄存器,下降沿有效;中断使能
KBI0_PE_KBIPE2 = 1;//键盘中断2使能
KBI0_SC_KBACK = 1;//清除外部中断标志位
}
void main(void) {
uint8 key_num_buf = 0;
PORT_PTAIE_PTAIE2 = 1; //使能输入口
PORT_PTAOE_PTAOE0 = 1; //使能输出口
PORT_PTAOE_PTAOE1 = 1; //使能输出口
LED_00 = 0;
LED_01 = 0;
Init_KBI();
EnableInterrupts;
while(1)
{
key_num_buf = key_num;
switch(key_num_buf)
{
case 0: //0:巡航
LED_Mode_xunhang();
break;
case 1: //1:爆闪
LED_Mode_baoshan();
break;
case 2: //2:恒亮
LED_Mode_hengliang();
break;
case 3:
LED_01 = MOS_ON;
delay1ms(500);
LED_01 = MOS_OFF;
delay1ms(500);
break;
}
}
}
//==========================================
// 灯点亮模式:巡航
//==========================================
void LED_Mode_xunhang(void)
{
LED_00 = MOS_ON;//高电平MOS导通 开灯
//delay1ms_scan_key(300,0);
delay1ms(300);
LED_00 = MOS_OFF;//高电平MOS导通 开灯
//delay1ms_scan_key(700,0);
delay1ms(700);
}
//==========================================
// 灯点亮模式:爆闪
//==========================================
void LED_Mode_baoshan(void)
{
uint8 i,j;
uint8 k;
uint8 l;
LED_00 = MOS_OFF;//高电平MOS导通 开灯 关闭对外输出
for(i=0;i<5;i++)
{
LED_00 = MOS_ON;//高电平MOS导通 开灯
//delay1ms_scan_key(30,1);
delay1ms(30);
LED_00 = MOS_OFF;//高电平MOS导通 开灯
//delay1ms_scan_key(40,1);
delay1ms(40);
}
LED_00 = MOS_OFF;//高电平MOS导通 开灯
//delay1ms_scan_key(650,1);
delay1ms(650);
}
//==========================================
// 灯点亮模式:恒亮
//==========================================
void LED_Mode_hengliang(void)
{
uint8 i,j;
uint8 k;
uint8 l;
LED_00 = MOS_ON;//高电平MOS导通 开灯
delay1ms(1);
}
//==================================================
//函数名:KBI_ISR
//作用:键盘中断服务程序,点亮与按键对应的LED灯
//==================================================
interrupt VectorNumber_Vkbi0 void KBI_ISR(void)
{
uint8 i,j,k=0;
DisableInterrupts;//禁止总中断
/*
for(i=0;i<10;i++)
{
delay1us(100);
if(SIGNAL_KEY)
{
KBI0_SC_KBACK = 1;//清除外部中断标志位
EnableInterrupts;//开启总中断
return;//判断为干扰跳出中断程序
}
}
*/
delay1ms(10);
while(!SIGNAL_KEY)__RESET_WATCHDOG();//等待高电平,高电平就跳出等待
if(key_num ==0)
key_num=1;
else if(key_num ==1)
key_num = 2;
else if(key_num ==2)
key_num = 0;
else
key_num=3;
KBI0_SC_KBACK = 1;//清除外部中断标志位
EnableInterrupts;//开启总中断
}
|
-
|