尝试通过延时循环确保每次输出后都有足够延时来等待信号稳定:
// 延时函数(通过空循环提供延时)
void delay_short(void) {
volatile unsigned int i;
for (i = 0; i < 200; i++); // 根据需要调整循环次数
}
void SCAN_DIP_SET(){
unsigned char scan_mark, scan_cnt;
asm("NOP");
scan_dip_buf = 0;
PORTA = 0x00; // 清所有scan输出PORTA bit3~b0
//-------------
// 读取4位 DIP_SW
//-------------
for(scan_cnt = 1; scan_cnt <= 8; scan_cnt <<= 1) { // 8421左移4次,故范围=8
PORTA = scan_cnt; // 输出"高态"供读取
delay_short(); // 增加延时等待信号稳定
if (return2) // 取回=RETURN2
scan_mark = 1; // 若有ON则移入"1"
else
scan_mark = 0;
scan_dip_buf <<= 1; // 结果变量=往MSB左移1位=空出bit0
scan_dip_buf |= scan_mark;// 映入bit0
delay_short(); // 可选延时
}
//-------------
// 读取2位 DIP_SW
//-------------
for(scan_cnt = 1; scan_cnt <= 2; scan_cnt <<= 1) { // 32_16左移2次,相同SCAN1~2
PORTA = scan_cnt;
delay_short();
if (return3)
scan_mark = 1;
else
scan_mark = 0;
scan_dip_buf <<= 1;
scan_dip_buf |= scan_mark;
delay_short();
}
}
|