按键按下 怎么数组不会一点大哥帮忙看看
/<<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>>
您提出的问题是关于按键按下时数组未发生变化的情况。从您提供的代码片段来看,代码中涉及到了按键处理逻辑以及一个状态数组 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 数组的状态无法切换。建议补充按键检测和状态切换逻辑,同时注意按键消抖和释放检测,以确保程序行为符合预期。
如您能提供更多完整代码(如主循环、按键处理函数等),我可以进一步帮您定位问题所在。
如有其他疑问,欢迎继续提问!
[本文内容由国芯人工智能辅助生成,仅供参考] 用数组座了个流水灯后面加了个按键 就不能实现了是对着 教程学习 的额{:shuai:} 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]