请选择 进入手机版 | 继续访问电脑版
查看: 2858|回复: 7

全局变量 怎么数据会乱跳

[复制链接]

该用户从未签到

2

主题

5

帖子

0

新手上路

Rank: 1

积分
33
最后登录
2021-9-27
发表于 2021-5-18 10:29:41 | 显示全部楼层 |阅读模式
程序头部定义了: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;//开启总中断
}
1.jpg
回复

使用道具 举报

该用户从未签到

0

主题

14

帖子

0

注册会员

Rank: 2

积分
106
最后登录
2022-10-26
发表于 2021-5-18 10:40:00 | 显示全部楼层
key_num = (key_num++)% 3;你那个if改成这个
回复 支持 反对

使用道具 举报

该用户从未签到

2

主题

5

帖子

0

新手上路

Rank: 1

积分
33
最后登录
2021-9-27
 楼主| 发表于 2021-5-18 11:38:04 | 显示全部楼层
谢谢你的解答,这个可以把key_num值限制再3以内(0 1 2),但是没改变 key_num值无规律变化问题,现在问题key_num乱跳,值不对,不知道哪里引起他乱跳;
看到其他人也有类似问题:https://www.nxpic.org.cn/module/ ... p;page=1#pid2569750

不知道我这问题跟他是不是一样原因导致,还是我的程序哪里写的不对;是不是我程序哪里写不够严谨
回复 支持 反对

使用道具 举报

该用户从未签到

2

主题

5

帖子

0

新手上路

Rank: 1

积分
33
最后登录
2021-9-27
 楼主| 发表于 2021-5-18 13:44:07 | 显示全部楼层
能帮我看一下吗
回复 支持 反对

使用道具 举报

该用户从未签到

0

主题

14

帖子

0

注册会员

Rank: 2

积分
106
最后登录
2022-10-26
发表于 2021-5-18 15:45:37 | 显示全部楼层

这个很奇怪啊,真看不出来哪里能改值了。加个if判断,如果大于3就清0。把static去掉呢?
回复 支持 反对

使用道具 举报

  • TA的每日心情
    开心
    5 天前
  • 签到天数: 1334 天

    [LV.10]以坛为家III

    88

    主题

    4290

    帖子

    12

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    9020
    最后登录
    2024-3-28
    发表于 2021-5-19 09:36:14 | 显示全部楼层
    看了楼主的代码——需要提高的地方肯定不少。
    目前遇到的问题,我觉得非常可能是编译器“帮你优化”了。
    当key_num = 3后,其 值已经没有意义了。

    程序的运行进入了另外一种固定的状态了。所以编译器帮你做了最优的处理。很可能其不再判断该值了。
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2024-2-8 09:39
  • 签到天数: 217 天

    [LV.7]常住居民III

    92

    主题

    1087

    帖子

    29

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    7288

    热心会员

    最后登录
    2024-3-28
    发表于 2021-5-19 15:39:40 | 显示全部楼层
    你这变量扔中断了吧,加一个volatile修饰一下。
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2022-12-30 08:07
  • 签到天数: 87 天

    [LV.6]常住居民II

    0

    主题

    242

    帖子

    1

    金牌会员

    Rank: 6Rank: 6

    积分
    1097
    最后登录
    2022-12-30
    发表于 2021-5-19 20:45:35 | 显示全部楼层
    中断被多次触发,按键抖动,触发电压不稳什么的
    生命不息,奋斗不止!
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2024-3-28 21:35 , Processed in 0.137875 second(s), 25 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表