换成K1 K2试试
供参考:
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
#define LED_PORT P2
sbit LED1 = LED_PORT ^ 0;
sbit LED2 = LED_PORT ^ 1;
sbit LED3 = LED_PORT ^ 2;
sbit LED4 = LED_PORT ^ 3;
sbit K1 = P1 ^ 0;
sbit K2 = P1 ^ 1;
uchar key_ret = 0;
uchar LED[4] = { 0x01,0x02,0x04,0x08 };
void delay(uint ms)
{
uint i, j;
for (i = 0; i < ms; i++)
for (j = 0; j < 125; j++);
}
void LED_Prt(uchar flg = 0)
{
uint i;
if (flg) {
for (i = 3; i >= 0; i--)
{
LED_PORT = LED[i];
delay(500);
}
}
else{
for (i = 0; i < 4; i++)
{
LED_PORT = LED[i];
delay(500);
}
}
}
void Scan_Key()
{
if (K1 == 0) {
delay(50);
if (K1 == 0) {
while (K1 == 0);
key_ret = 1;
}
}
if (K2 == 0) {
delay(50);
if (K2 == 0) {
while (K2 == 0);
key_ret = 2;
}
}
}
void main()
{
P1 = 0xff;
LED_PORT = 0x00;
while (1){
Scan_Key();
switch (key_ret)
{
case 1:LED_Prt(0); break;
case 2:LED_Prt(1); break;
default:
break;
}
}
}
【以下回答由 GPT 生成】
问题的主要原因是选择LED灯的逻辑错误。在代码中,根据开关的状态选择LED灯的方式是使用LED数组的索引。但是这里LED数组的索引是从0到3的,而在循环中,当i
等于0时,P2
被赋值为LED[0]
,这时只有LED1亮起,而其他LED灯都是关闭的。因此,我们需要将循环控制条件中的i
改为i > -1
,同时修改赋值语句为P2 = LED[i]
,以使所有LED灯能够被正确选中。
以下是修改后的代码:
#include <reg5l.h>
#define LEDPORT P2
sbit LED1 = LEDPORTO;
sbit LED2 = LEDPORT1;
sbit LED3 = LEDPORT2;
sbit LED4 = LEDPORT3;
sbit K1 = P1^0;
sbit K2 = P1^1;
unsigned char LED[4] = {0x01, 0x02, 0x04, 0x08};
void delay(unsigned int mg) {
unsigned int i, j;
for(i = 0; i < mg; i++) {
for(j = 0; j < 123; j++) {
// 这里是空循环,用于延时
}
}
}
void main() {
int i, j;
while(1) {
P2 = 0x00;
if (K1 == 0) {
for (i = 3; i > -1; i--) { // 修改循环控制条件
P2 = LED[i];
delay(500);
}
}
if (K2 == 0) {
for (i = 0; i < 4; i++) {
P2 = LED[i];
delay(500);
}
}
}
}
请尝试使用修改后的代码,在嵌入式硬件上测试是否能够解决问题。