找回密码
 立即注册
查看: 42|回复: 3

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

[复制链接]
  • 打卡等级:偶尔看看III
  • 打卡总天数:58
  • 最近打卡:2025-10-15 19:01:34
已绑定手机

14

主题

68

回帖

251

积分

中级会员

积分
251
发表于 5 天前 | 显示全部楼层 |阅读模式
  1. /<<AICUBE_USER_HEADER_REMARK_BEGIN>>
  2. ////////////////////////////////////////
  3. // 在此添加用户文件头说明信息  
  4. // 文件名称: main.c
  5. // 文件描述:
  6. // 文件版本: V1.0
  7. // 修改记录:
  8. //   1. (2025-09-06) 创建文件
  9. ////////////////////////////////////////
  10. //<<AICUBE_USER_HEADER_REMARK_END>>
  11. #include "config.h"                     //默认已包含stdio.h、intrins.h等头文件
  12. //<<AICUBE_USER_INCLUDE_BEGIN>>
  13. // 在此添加用户头文件包含  
  14. //<<AICUBE_USER_INCLUDE_END>>
  15. //<<AICUBE_USER_GLOBAL_DEFINE_BEGIN>>
  16. // 在此添加用户全局变量定义、用户宏定义以及函数声明
  17. #define U8 unsigned char
  18. #define U16 unsigned  int
  19. U8 num = 0 ;
  20. U8 i;
  21. U8 Run_State = 0;
  22. U16 Key_ms = 0;
  23. U16 Coumt_ms[3]={0,0,0};
  24. U8 State[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,};
  25. //<<AICUBE_USER_GLOBAL_DEFINE_END>>
  26. ////////////////////////////////////////
  27. // 项目主函数
  28. // 入口参数: 无
  29. // 函数返回: 无
  30. ////////////////////////////////////////
  31. void main(void)
  32. {
  33.     //<<AICUBE_USER_MAIN_INITIAL_BEGIN>>
  34.     // 在此添加用户主函数初始化代码  
  35.     //<<AICUBE_USER_MAIN_INITIAL_END>>
  36.     SYS_Init();
  37.      P40 = 0 ;
  38.     //<<AICUBE_USER_MAIN_CODE_BEGIN>>
  39.     // 在此添加主函数中运行一次的用户代码        
  40.     //<<AICUBE_USER_MAIN_CODE_END>>
  41.     while (1)
  42.         //<<AICUBE_USER_MAIN_LOOP_BEGIN>>
  43.         // 在此添加主函数中用户主循环代码
  44.         P0 = ~State[num];
  45.      if (Coumt_ms[1]>=20)
  46.         {
  47.          Coumt_ms[1] = 0;
  48.                         if (P32 == 0)
  49.                         {
  50.                          Key_ms ++;
  51.                          if (Key_ms>=5)
  52.                                 num ++;
  53.                 }
  54.                         else
  55.                         {
  56.                                 Key_ms = 0;
  57.                         }
  58.    }
  59.                 }
  60.         //<<AICUBE_USER_MAIN_LOOP_END>>
  61. ////////////////////////////////////////
  62. // 系统初始化函数
  63. // 入口参数: 无
  64. // 函数返回: 无
  65. ////////////////////////////////////////
  66. void SYS_Init(void)
  67. {
  68.     EnableAccessXFR();                  //使能访问扩展XFR
  69.     AccessCodeFastest();                //设置最快速度访问程序代码
  70.     AccessIXramFastest();               //设置最快速度访问内部XDATA
  71.     IAP_SetTimeBase();                  //设置IAP等待参数,产生1us时基
  72.     //<<AICUBE_USER_PREINITIAL_CODE_BEGIN>>
  73.     // 在此添加用户预初始化代码  
  74.     //<<AICUBE_USER_PREINITIAL_CODE_END>>
  75.     P0M0 = 0x00; P0M1 = 0x00;           //初始化P0口为准双向口模式
  76.     P1M0 = 0x00; P1M1 = 0x00;           //初始化P1口为准双向口模式
  77.     P2M0 = 0x00; P2M1 = 0x00;           //初始化P2口为准双向口模式
  78.     P3M0 = 0x00; P3M1 = 0x00;           //初始化P3口为准双向口模式
  79.     P4M0 = 0x00; P4M1 = 0x00;           //初始化P4口为准双向口模式
  80.     P5M0 = 0x00; P5M1 = 0x00;           //初始化P5口为准双向口模式
  81.     P6M0 = 0x00; P6M1 = 0x00;           //初始化P6口为准双向口模式
  82.     P7M0 = 0x00; P7M1 = 0x00;           //初始化P7口为准双向口模式
  83.     PORT0_Init();                       //P0口初始化
  84.     PORT1_Init();                       //P1口初始化
  85.     PORT2_Init();                       //P2口初始化
  86.     PORT3_Init();                       //P3口初始化
  87.     PORT4_Init();                       //P4口初始化
  88.     PORT5_Init();                       //P5口初始化
  89.     TIMER0_Init();                      //定时器0初始化
  90.     //<<AICUBE_USER_INITIAL_CODE_BEGIN>>
  91.     // 在此添加用户初始化代码  
  92.     //<<AICUBE_USER_INITIAL_CODE_END>>
  93.     EnableGlobalInt();                  //使能全局中断
  94. }
  95. ////////////////////////////////////////
  96. // 微秒延时函数
  97. // 入口参数: us (设置延时的微秒值)
  98. // 函数返回: 无
  99. ////////////////////////////////////////
  100. void delay_us(uint16_t us)
  101. {
  102.     do
  103.     {
  104.         NOP(34);                        //(MAIN_Fosc + 500000) / 1000000 - 6
  105.     } while (--us);
  106. }
  107. ////////////////////////////////////////
  108. // 毫秒延时函数
  109. // 入口参数: ms (设置延时的毫秒值)
  110. // 函数返回: 无
  111. ////////////////////////////////////////
  112. void delay_ms(uint16_t ms)
  113. {
  114.     uint16_t i;
  115.     do
  116.     {
  117.         i = MAIN_Fosc / 6000;
  118.         while (--i);
  119.     } while (--ms);
  120. }
  121. ////////////////////////////////////////
  122. // P0口初始化函数
  123. // 入口参数: 无
  124. // 函数返回: 无
  125. ////////////////////////////////////////
  126. void PORT0_Init(void)
  127. {
  128.     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初始化电平
  129.     SetP0nInitLevelLow(PIN_3);          //设置P0.3初始化电平
  130.     SetP0nQuasiMode(PIN_ALL);           //设置P0为准双向口模式
  131.     DisableP0nPullUp(PIN_ALL);          //关闭P0内部上拉电阻
  132.     DisableP0nPullDown(PIN_ALL);        //关闭P0内部下拉电阻
  133.     DisableP0nSchmitt(PIN_ALL);         //使能P0施密特触发
  134.     SetP0nSlewRateNormal(PIN_ALL);      //设置P0一般翻转速度
  135.     SetP0nDrivingNormal(PIN_ALL);       //设置P0一般驱动能力
  136.     SetP0nDigitalInput(PIN_ALL);        //使能P0数字信号输入功能
  137.     //<<AICUBE_USER_PORT0_INITIAL_BEGIN>>
  138.     // 在此添加用户初始化代码  
  139.     //<<AICUBE_USER_PORT0_INITIAL_END>>
  140. }
  141. ////////////////////////////////////////
  142. // P1口初始化函数
  143. // 入口参数: 无
  144. // 函数返回: 无
  145. ////////////////////////////////////////
  146. void PORT1_Init(void)
  147. {
  148.     SetP1nInitLevelLow(PIN_ALL);        //设置P1初始化电平
  149.     SetP1nQuasiMode(PIN_ALL);           //设置P1为准双向口模式
  150.     DisableP1nPullUp(PIN_ALL);          //关闭P1内部上拉电阻
  151.     DisableP1nPullDown(PIN_ALL);        //关闭P1内部下拉电阻
  152.     DisableP1nSchmitt(PIN_ALL);         //使能P1施密特触发
  153.     SetP1nSlewRateNormal(PIN_ALL);      //设置P1一般翻转速度
  154.     SetP1nDrivingNormal(PIN_0);         //设置P1.0一般驱动能力
  155.     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增强驱动能力
  156.     SetP1nDigitalInput(PIN_ALL);        //使能P1数字信号输入功能
  157.     //<<AICUBE_USER_PORT1_INITIAL_BEGIN>>
  158.     // 在此添加用户初始化代码  
  159.     //<<AICUBE_USER_PORT1_INITIAL_END>>
  160. }
  161. ////////////////////////////////////////
  162. // P2口初始化函数
  163. // 入口参数: 无
  164. // 函数返回: 无
  165. ////////////////////////////////////////
  166. void PORT2_Init(void)
  167. {
  168.     SetP2nInitLevelHigh(PIN_ALL);       //设置P2初始化电平
  169.     SetP2nQuasiMode(PIN_ALL);           //设置P2为准双向口模式
  170.     DisableP2nPullUp(PIN_ALL);          //关闭P2内部上拉电阻
  171.     DisableP2nPullDown(PIN_ALL);        //关闭P2内部下拉电阻
  172.     DisableP2nSchmitt(PIN_ALL);         //使能P2施密特触发
  173.     SetP2nSlewRateNormal(PIN_ALL);      //设置P2一般翻转速度
  174.     SetP2nDrivingNormal(PIN_ALL);       //设置P2一般驱动能力
  175.     SetP2nDigitalInput(PIN_ALL);        //使能P2数字信号输入功能
  176.     //<<AICUBE_USER_PORT2_INITIAL_BEGIN>>
  177.     // 在此添加用户初始化代码  
  178.     //<<AICUBE_USER_PORT2_INITIAL_END>>
  179. }
  180. ////////////////////////////////////////
  181. // P3口初始化函数
  182. // 入口参数: 无
  183. // 函数返回: 无
  184. ////////////////////////////////////////
  185. void PORT3_Init(void)
  186. {
  187.     SetP3nInitLevelHigh(PIN_ALL);       //设置P3初始化电平
  188.     SetP3nQuasiMode(PIN_ALL);           //设置P3为准双向口模式
  189.     DisableP3nPullUp(PIN_ALL);          //关闭P3内部上拉电阻
  190.     DisableP3nPullDown(PIN_ALL);        //关闭P3内部下拉电阻
  191.     DisableP3nSchmitt(PIN_ALL);         //使能P3施密特触发
  192.     SetP3nSlewRateNormal(PIN_ALL);      //设置P3一般翻转速度
  193.     SetP3nDrivingNormal(PIN_ALL);       //设置P3一般驱动能力
  194.     SetP3nDigitalInput(PIN_ALL);        //使能P3数字信号输入功能
  195.     //<<AICUBE_USER_PORT3_INITIAL_BEGIN>>
  196.     // 在此添加用户初始化代码  
  197.     //<<AICUBE_USER_PORT3_INITIAL_END>>
  198. }
  199. ////////////////////////////////////////
  200. // P4口初始化函数
  201. // 入口参数: 无
  202. // 函数返回: 无
  203. ////////////////////////////////////////
  204. void PORT4_Init(void)
  205. {
  206.     SetP4nInitLevelHigh(PIN_ALL);       //设置P4初始化电平
  207.     SetP4nQuasiMode(PIN_ALL);           //设置P4为准双向口模式
  208.     DisableP4nPullUp(PIN_ALL);          //关闭P4内部上拉电阻
  209.     DisableP4nPullDown(PIN_ALL);        //关闭P4内部下拉电阻
  210.     DisableP4nSchmitt(PIN_ALL);         //使能P4施密特触发
  211.     SetP4nSlewRateNormal(PIN_ALL);      //设置P4一般翻转速度
  212.     SetP4nDrivingNormal(PIN_ALL);       //设置P4一般驱动能力
  213.     SetP4nDigitalInput(PIN_ALL);        //使能P4数字信号输入功能
  214.     //<<AICUBE_USER_PORT4_INITIAL_BEGIN>>
  215.     // 在此添加用户初始化代码  
  216.     //<<AICUBE_USER_PORT4_INITIAL_END>>
  217. }
  218. ////////////////////////////////////////
  219. // P5口初始化函数
  220. // 入口参数: 无
  221. // 函数返回: 无
  222. ////////////////////////////////////////
  223. void PORT5_Init(void)
  224. {
  225.     SetP5nInitLevelHigh(PIN_ALL);       //设置P5初始化电平
  226.     SetP5nQuasiMode(PIN_ALL);           //设置P5为准双向口模式
  227.     DisableP5nPullUp(PIN_ALL);          //关闭P5内部上拉电阻
  228.     DisableP5nPullDown(PIN_ALL);        //关闭P5内部下拉电阻
  229.     DisableP5nSchmitt(PIN_ALL);         //使能P5施密特触发
  230.     SetP5nSlewRateNormal(PIN_ALL);      //设置P5一般翻转速度
  231.     SetP5nDrivingNormal(PIN_ALL);       //设置P5一般驱动能力
  232.     SetP5nDigitalInput(PIN_ALL);        //使能P5数字信号输入功能
  233.     //<<AICUBE_USER_PORT5_INITIAL_BEGIN>>
  234.     // 在此添加用户初始化代码  
  235.     //<<AICUBE_USER_PORT5_INITIAL_END>>
  236. }
  237. ////////////////////////////////////////
  238. // 定时器0初始化函数
  239. // 入口参数: 无
  240. // 函数返回: 无
  241. ////////////////////////////////////////
  242. void TIMER0_Init(void)
  243. {
  244. #define T0_PSCR                 (5)
  245. #define T0_RELOAD               (65536 - (float)SYSCLK / 12 / (T0_PSCR + 1) * 100 / 1000)
  246.     TIMER0_TimerMode();                 //设置定时器0为定时模式
  247.     TIMER0_12TMode();                   //设置定时器0为12T模式
  248.     TIMER0_Mode0();                     //设置定时器0为模式0 (16位自动重载模式)
  249.     TIMER0_DisableGateINT0();           //禁止定时器0门控
  250.     TIMER0_SetIntPriority(1);           //设置中断为较低优先级
  251.     TIMER0_EnableInt();                 //使能定时器0中断
  252.     TIMER0_SetPrescale(T0_PSCR);        //设置定时器0的8位预分频
  253.     TIMER0_SetReload16(T0_RELOAD);      //设置定时器0的16位重载值
  254.     TIMER0_Run();                       //定时器0开始运行
  255.     //<<AICUBE_USER_TIMER0_INITIAL_BEGIN>>
  256.     // 在此添加用户初始化代码  
  257.     //<<AICUBE_USER_TIMER0_INITIAL_END>>
  258. }
  259. ////////////////////////////////////////
  260. // 定时器0中断服务程序
  261. // 入口参数: 无
  262. // 函数返回: 无
  263. ////////////////////////////////////////
  264. void TIMER0_ISR(void) interrupt TMR0_VECTOR
  265. {
  266.     //<<AICUBE_USER_TIMER0_ISR_CODE1_BEGIN>>
  267.     // 在此添加中断函数用户代码  
  268.     for ( i = 0; i < 3; i++)
  269.     {
  270.        Coumt_ms[i]++;
  271.     }
  272.    
  273.    
  274.     //<<AICUBE_USER_TIMER0_ISR_CODE1_END>>
  275. }
  276. //<<AICUBE_USER_FUNCTION_IMPLEMENT_BEGIN>>
  277. // 在此添加用户函数实现代码  
  278. //<<AICUBE_USER_FUNCTION_IMPLEMENT_END>>
复制代码


回复

使用道具 举报 送花

3

主题

1880

回帖

608

积分

等待验证会员

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

一、问题分析

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

您提到“按键按下,怎么数组不会一点”,可能是指按键按下后,State 数组中的值没有发生预期的变化。从代码中我们可以看到:
  1. c
  2. U8 State[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
复制代码

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

2. 变量定义部分
  1. c
  2. U8 num = 0 ;
  3. U8 i;
  4. U8 RunState = 0;
  5. U16 Keyms = 0;
  6. U16 Coumtms[3]={0,0,0};
复制代码

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

3. 按键检测逻辑缺失

在您提供的代码中,并没有看到按键扫描或判断按键是否按下的逻辑。例如:
  1. c
  2. if (KEYDOWN) {
  3.     Delayms(10); // 消抖
  4.     if (KEYDOWN) {
  5.         num++;
  6.         if(num >= 8) num = 0;
  7.     }
  8. }
复制代码

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

二、建议修改方案

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

以下是基于您代码的完整示例,假设使用 P30 作为按键输入,P1 作为输出控制:
  1. c
  2. include "config.h"
  3. define U8 unsigned char
  4. define U16 unsigned int
  5. U8 num = 0;
  6. U8 State[8] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80};
  7. void Delayms(U16 ms) {
  8.     // 简单延时函数实现
  9.     while(ms--) {
  10.         unsigned int i = 123;
  11.         while(i--);
  12.     }
  13. }
  14. void main(void) {
  15.     SYSInit();
  16.     P40 = 0; // 初始化某个输出
  17.     while (1) {
  18.         if (P30 == 0) { // 检测按键是否按下(假设低电平有效)
  19.             Delayms(10); // 消抖
  20.             if (P30 == 0) {
  21.                 num++;
  22.                 if(num >= 8) num = 0;
  23.                 P1 = State[num]; // 更新输出状态
  24.                 while(P30 == 0); // 等待按键释放
  25.             }
  26.         }
  27.     }
  28. }
复制代码

三、关键点说明

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

四、调试建议

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

五、总结

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

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

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

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

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:58
  • 最近打卡:2025-10-15 19:01:34
已绑定手机

14

主题

68

回帖

251

积分

中级会员

积分
251
发表于 5 天前 | 显示全部楼层
用数组座了个流水灯  后面加了个按键 就不能实现了  是对着 教程学习 的额  
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:516
  • 最近打卡:2025-10-16 00:05:49
已绑定手机

154

主题

1889

回帖

2621

积分

金牌会员

积分
2621
发表于 4 天前 | 显示全部楼层
    while (1)
        //<<AICUBE_USER_MAIN_LOOP_BEGIN>>
        // 在此添加主函数中用户主循环代码
        P0 = ~State[num];
     if (Coumt_ms[1]>=20)
        {
         Coumt_ms[1] = 0;
                        if (P32 == 0)
                        {
                         Key_ms ++;
                         if (Key_ms>=5)
                                num ++;
                }
                        else
                        {
                                Key_ms = 0;
                        }
   }
                }

这一段有问题,按键扫描
回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-10-16 05:39 , Processed in 0.137570 second(s), 61 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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