小熊熊 发表于 5 天前

按键按下 怎么数组不会一点大哥帮忙看看

/<<AICUBE_USER_HEADER_REMARK_BEGIN>>
////////////////////////////////////////
// 在此添加用户文件头说明信息
// 文件名称: main.c
// 文件描述:
// 文件版本: V1.0
// 修改记录:
//   1. (2025-09-06) 创建文件
////////////////////////////////////////
//<<AICUBE_USER_HEADER_REMARK_END>>


#include "config.h"                     //默认已包含stdio.h、intrins.h等头文件


//<<AICUBE_USER_INCLUDE_BEGIN>>
// 在此添加用户头文件包含
//<<AICUBE_USER_INCLUDE_END>>


//<<AICUBE_USER_GLOBAL_DEFINE_BEGIN>>
// 在此添加用户全局变量定义、用户宏定义以及函数声明
#define U8 unsigned char
#define U16 unsignedint
U8 num = 0 ;
U8 i;
U8 Run_State = 0;
U16 Key_ms = 0;
U16 Coumt_ms={0,0,0};
U8 State={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,};
//<<AICUBE_USER_GLOBAL_DEFINE_END>>




////////////////////////////////////////
// 项目主函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void main(void)
{
    //<<AICUBE_USER_MAIN_INITIAL_BEGIN>>
    // 在此添加用户主函数初始化代码
    //<<AICUBE_USER_MAIN_INITIAL_END>>

    SYS_Init();
   P40 = 0 ;
    //<<AICUBE_USER_MAIN_CODE_BEGIN>>
    // 在此添加主函数中运行一次的用户代码        
    //<<AICUBE_USER_MAIN_CODE_END>>

    while (1)
      //<<AICUBE_USER_MAIN_LOOP_BEGIN>>
      // 在此添加主函数中用户主循环代码
      P0 = ~State;
   if (Coumt_ms>=20)
      {
         Coumt_ms = 0;
                        if (P32 == 0)
                        {
                       Key_ms ++;
                       if (Key_ms>=5)
                                num ++;
                }
                        else
                        {
                                Key_ms = 0;
                        }
   }
                }
      //<<AICUBE_USER_MAIN_LOOP_END>>
////////////////////////////////////////
// 系统初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void SYS_Init(void)
{
    EnableAccessXFR();                  //使能访问扩展XFR
    AccessCodeFastest();                //设置最快速度访问程序代码
    AccessIXramFastest();               //设置最快速度访问内部XDATA
    IAP_SetTimeBase();                  //设置IAP等待参数,产生1us时基

    //<<AICUBE_USER_PREINITIAL_CODE_BEGIN>>
    // 在此添加用户预初始化代码
    //<<AICUBE_USER_PREINITIAL_CODE_END>>

    P0M0 = 0x00; P0M1 = 0x00;         //初始化P0口为准双向口模式
    P1M0 = 0x00; P1M1 = 0x00;         //初始化P1口为准双向口模式
    P2M0 = 0x00; P2M1 = 0x00;         //初始化P2口为准双向口模式
    P3M0 = 0x00; P3M1 = 0x00;         //初始化P3口为准双向口模式
    P4M0 = 0x00; P4M1 = 0x00;         //初始化P4口为准双向口模式
    P5M0 = 0x00; P5M1 = 0x00;         //初始化P5口为准双向口模式
    P6M0 = 0x00; P6M1 = 0x00;         //初始化P6口为准双向口模式
    P7M0 = 0x00; P7M1 = 0x00;         //初始化P7口为准双向口模式

    PORT0_Init();                     //P0口初始化
    PORT1_Init();                     //P1口初始化
    PORT2_Init();                     //P2口初始化
    PORT3_Init();                     //P3口初始化
    PORT4_Init();                     //P4口初始化
    PORT5_Init();                     //P5口初始化
    TIMER0_Init();                      //定时器0初始化

    //<<AICUBE_USER_INITIAL_CODE_BEGIN>>
    // 在此添加用户初始化代码
    //<<AICUBE_USER_INITIAL_CODE_END>>

    EnableGlobalInt();                  //使能全局中断
}

////////////////////////////////////////
// 微秒延时函数
// 入口参数: us (设置延时的微秒值)
// 函数返回: 无
////////////////////////////////////////
void delay_us(uint16_t us)
{
    do
    {
      NOP(34);                        //(MAIN_Fosc + 500000) / 1000000 - 6
    } while (--us);
}


////////////////////////////////////////
// 毫秒延时函数
// 入口参数: ms (设置延时的毫秒值)
// 函数返回: 无
////////////////////////////////////////
void delay_ms(uint16_t ms)
{
    uint16_t i;

    do
    {
      i = MAIN_Fosc / 6000;
      while (--i);
    } while (--ms);
}

////////////////////////////////////////
// P0口初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void PORT0_Init(void)
{
    SetP0nInitLevelHigh(PIN_7 | PIN_6 | PIN_5 | PIN_4 | PIN_2 | PIN_1 | PIN_0); //设置P0.7,P0.6,P0.5,P0.4,P0.2,P0.1,P0.0初始化电平
    SetP0nInitLevelLow(PIN_3);          //设置P0.3初始化电平
    SetP0nQuasiMode(PIN_ALL);         //设置P0为准双向口模式

    DisableP0nPullUp(PIN_ALL);          //关闭P0内部上拉电阻
    DisableP0nPullDown(PIN_ALL);      //关闭P0内部下拉电阻
    DisableP0nSchmitt(PIN_ALL);         //使能P0施密特触发
    SetP0nSlewRateNormal(PIN_ALL);      //设置P0一般翻转速度
    SetP0nDrivingNormal(PIN_ALL);       //设置P0一般驱动能力
    SetP0nDigitalInput(PIN_ALL);      //使能P0数字信号输入功能

    //<<AICUBE_USER_PORT0_INITIAL_BEGIN>>
    // 在此添加用户初始化代码
    //<<AICUBE_USER_PORT0_INITIAL_END>>
}

////////////////////////////////////////
// P1口初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void PORT1_Init(void)
{
    SetP1nInitLevelLow(PIN_ALL);      //设置P1初始化电平
    SetP1nQuasiMode(PIN_ALL);         //设置P1为准双向口模式

    DisableP1nPullUp(PIN_ALL);          //关闭P1内部上拉电阻
    DisableP1nPullDown(PIN_ALL);      //关闭P1内部下拉电阻
    DisableP1nSchmitt(PIN_ALL);         //使能P1施密特触发
    SetP1nSlewRateNormal(PIN_ALL);      //设置P1一般翻转速度
    SetP1nDrivingNormal(PIN_0);         //设置P1.0一般驱动能力
    SetP1nDrivingStrong(PIN_7 | PIN_6 | PIN_5 | PIN_4 | PIN_3 | PIN_2 | PIN_1); //设置P1.7,P1.6,P1.5,P1.4,P1.3,P1.2,P1.1增强驱动能力
    SetP1nDigitalInput(PIN_ALL);      //使能P1数字信号输入功能

    //<<AICUBE_USER_PORT1_INITIAL_BEGIN>>
    // 在此添加用户初始化代码
    //<<AICUBE_USER_PORT1_INITIAL_END>>
}

////////////////////////////////////////
// P2口初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void PORT2_Init(void)
{
    SetP2nInitLevelHigh(PIN_ALL);       //设置P2初始化电平
    SetP2nQuasiMode(PIN_ALL);         //设置P2为准双向口模式

    DisableP2nPullUp(PIN_ALL);          //关闭P2内部上拉电阻
    DisableP2nPullDown(PIN_ALL);      //关闭P2内部下拉电阻
    DisableP2nSchmitt(PIN_ALL);         //使能P2施密特触发
    SetP2nSlewRateNormal(PIN_ALL);      //设置P2一般翻转速度
    SetP2nDrivingNormal(PIN_ALL);       //设置P2一般驱动能力
    SetP2nDigitalInput(PIN_ALL);      //使能P2数字信号输入功能

    //<<AICUBE_USER_PORT2_INITIAL_BEGIN>>
    // 在此添加用户初始化代码
    //<<AICUBE_USER_PORT2_INITIAL_END>>
}

////////////////////////////////////////
// P3口初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void PORT3_Init(void)
{
    SetP3nInitLevelHigh(PIN_ALL);       //设置P3初始化电平
    SetP3nQuasiMode(PIN_ALL);         //设置P3为准双向口模式

    DisableP3nPullUp(PIN_ALL);          //关闭P3内部上拉电阻
    DisableP3nPullDown(PIN_ALL);      //关闭P3内部下拉电阻
    DisableP3nSchmitt(PIN_ALL);         //使能P3施密特触发
    SetP3nSlewRateNormal(PIN_ALL);      //设置P3一般翻转速度
    SetP3nDrivingNormal(PIN_ALL);       //设置P3一般驱动能力
    SetP3nDigitalInput(PIN_ALL);      //使能P3数字信号输入功能

    //<<AICUBE_USER_PORT3_INITIAL_BEGIN>>
    // 在此添加用户初始化代码
    //<<AICUBE_USER_PORT3_INITIAL_END>>
}

////////////////////////////////////////
// P4口初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void PORT4_Init(void)
{
    SetP4nInitLevelHigh(PIN_ALL);       //设置P4初始化电平
    SetP4nQuasiMode(PIN_ALL);         //设置P4为准双向口模式

    DisableP4nPullUp(PIN_ALL);          //关闭P4内部上拉电阻
    DisableP4nPullDown(PIN_ALL);      //关闭P4内部下拉电阻
    DisableP4nSchmitt(PIN_ALL);         //使能P4施密特触发
    SetP4nSlewRateNormal(PIN_ALL);      //设置P4一般翻转速度
    SetP4nDrivingNormal(PIN_ALL);       //设置P4一般驱动能力
    SetP4nDigitalInput(PIN_ALL);      //使能P4数字信号输入功能

    //<<AICUBE_USER_PORT4_INITIAL_BEGIN>>
    // 在此添加用户初始化代码
    //<<AICUBE_USER_PORT4_INITIAL_END>>
}

////////////////////////////////////////
// P5口初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void PORT5_Init(void)
{
    SetP5nInitLevelHigh(PIN_ALL);       //设置P5初始化电平
    SetP5nQuasiMode(PIN_ALL);         //设置P5为准双向口模式

    DisableP5nPullUp(PIN_ALL);          //关闭P5内部上拉电阻
    DisableP5nPullDown(PIN_ALL);      //关闭P5内部下拉电阻
    DisableP5nSchmitt(PIN_ALL);         //使能P5施密特触发
    SetP5nSlewRateNormal(PIN_ALL);      //设置P5一般翻转速度
    SetP5nDrivingNormal(PIN_ALL);       //设置P5一般驱动能力
    SetP5nDigitalInput(PIN_ALL);      //使能P5数字信号输入功能

    //<<AICUBE_USER_PORT5_INITIAL_BEGIN>>
    // 在此添加用户初始化代码
    //<<AICUBE_USER_PORT5_INITIAL_END>>
}

////////////////////////////////////////
// 定时器0初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void TIMER0_Init(void)
{
#define T0_PSCR               (5)
#define T0_RELOAD               (65536 - (float)SYSCLK / 12 / (T0_PSCR + 1) * 100 / 1000)

    TIMER0_TimerMode();               //设置定时器0为定时模式
    TIMER0_12TMode();                   //设置定时器0为12T模式
    TIMER0_Mode0();                     //设置定时器0为模式0 (16位自动重载模式)
    TIMER0_DisableGateINT0();         //禁止定时器0门控
    TIMER0_SetIntPriority(1);         //设置中断为较低优先级
    TIMER0_EnableInt();               //使能定时器0中断
    TIMER0_SetPrescale(T0_PSCR);      //设置定时器0的8位预分频
    TIMER0_SetReload16(T0_RELOAD);      //设置定时器0的16位重载值
    TIMER0_Run();                     //定时器0开始运行

    //<<AICUBE_USER_TIMER0_INITIAL_BEGIN>>
    // 在此添加用户初始化代码
    //<<AICUBE_USER_TIMER0_INITIAL_END>>
}


////////////////////////////////////////
// 定时器0中断服务程序
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void TIMER0_ISR(void) interrupt TMR0_VECTOR
{
    //<<AICUBE_USER_TIMER0_ISR_CODE1_BEGIN>>
    // 在此添加中断函数用户代码
    for ( i = 0; i < 3; i++)
    {
       Coumt_ms++;
    }
   
   
    //<<AICUBE_USER_TIMER0_ISR_CODE1_END>>
}


//<<AICUBE_USER_FUNCTION_IMPLEMENT_BEGIN>>
// 在此添加用户函数实现代码
//<<AICUBE_USER_FUNCTION_IMPLEMENT_END>>




国芯人工智能 发表于 5 天前

您提出的问题是关于按键按下时数组未发生变化的情况。从您提供的代码片段来看,代码中涉及到了按键处理逻辑以及一个状态数组 State,但尚未提供完整的代码结构(例如按键检测逻辑、主循环等),因此我将基于常见的嵌入式 C 语言编程逻辑,对可能的问题点进行分析,并提出修改建议。

一、问题分析

1. 数组未发生变化的可能原因

您提到“按键按下,怎么数组不会一点”,可能是指按键按下后,State 数组中的值没有发生预期的变化。从代码中我们可以看到:

c
U8 State={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};

这个数组是一个常量状态数组,通常用于表示 LED 灯的点亮状态、位选状态等。如果您的意图是通过按键改变 State 的索引或其值,那么需要额外的变量来控制当前状态(如 num),而不是直接修改数组本身。

2. 变量定义部分

c
U8 num = 0 ;
U8 i;
U8 RunState = 0;
U16 Keyms = 0;
U16 Coumtms={0,0,0};

这里定义了 num,但未在代码片段中看到其如何被修改。如果 num 是用于索引 State 数组的变量,那么必须在按键检测逻辑中对其进行增减操作。

3. 按键检测逻辑缺失

在您提供的代码中,并没有看到按键扫描或判断按键是否按下的逻辑。例如:

c
if (KEYDOWN) {
    Delayms(10); // 消抖
    if (KEYDOWN) {
      num++;
      if(num >= 8) num = 0;
    }
}

如果没有这部分逻辑,即使按键被按下,num 也不会变化,从而 State 也不会变化。

二、建议修改方案

1. 完整示例代码(含按键逻辑)

以下是基于您代码的完整示例,假设使用 P30 作为按键输入,P1 作为输出控制:

c
include "config.h"

define U8 unsigned char
define U16 unsigned int

U8 num = 0;
U8 State = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80};

void Delayms(U16 ms) {
    // 简单延时函数实现
    while(ms--) {
      unsigned int i = 123;
      while(i--);
    }
}

void main(void) {
    SYSInit();
    P40 = 0; // 初始化某个输出

    while (1) {
      if (P30 == 0) { // 检测按键是否按下(假设低电平有效)
            Delayms(10); // 消抖
            if (P30 == 0) {
                num++;
                if(num >= 8) num = 0;
                P1 = State; // 更新输出状态
                while(P30 == 0); // 等待按键释放
            }
      }
    }
}

三、关键点说明

| 项目 | 说明 |
|------|------|
| State 数组 | 用于表示状态,不建议直接修改内容,而是通过索引 num 来选择状态 |
| num 变量 | 用于控制当前状态索引,需在按键处理中进行自增/自减 |
| 按键检测 | 必须包含消抖和按键释放判断,否则容易重复触发 |
| P1 = State; | 假设将状态输出到 P1 口,用于控制 LED 或其他设备 |

四、调试建议

1. 检查按键引脚是否正确:确保按键连接到的引脚与代码中一致,且电平变化符合预期。
2. 添加调试输出:可以在每次按键后打印 num 的值,确认是否变化。
3. 使用示波器或逻辑分析仪:查看按键信号是否稳定,是否有抖动。
4. 注意全局变量作用域:确保 num 和 State 没有被其他函数意外修改。

五、总结

您当前的代码片段中缺少按键检测逻辑,导致 num 无法变化,进而 State 数组的状态无法切换。建议补充按键检测和状态切换逻辑,同时注意按键消抖和释放检测,以确保程序行为符合预期。

如您能提供更多完整代码(如主循环、按键处理函数等),我可以进一步帮您定位问题所在。

如有其他疑问,欢迎继续提问!

[本文内容由国芯人工智能辅助生成,仅供参考]

小熊熊 发表于 5 天前

用数组座了个流水灯后面加了个按键 就不能实现了是对着 教程学习 的额{:shuai:}

vb2002 发表于 4 天前

    while (1)
      //<<AICUBE_USER_MAIN_LOOP_BEGIN>>
      // 在此添加主函数中用户主循环代码
      P0 = ~State;
   if (Coumt_ms>=20)
      {
         Coumt_ms = 0;
                        if (P32 == 0)
                        {
                         Key_ms ++;
                         if (Key_ms>=5)
                              num ++;
                }
                        else
                        {
                              Key_ms = 0;
                        }
   }
                }

这一段有问题,按键扫描
页: [1]
查看完整版本: 按键按下 怎么数组不会一点大哥帮忙看看