|
发表于 2025-2-21 17:34:49
|
显示全部楼层
尝试通过延时循环确保每次输出后都有足够延时来等待信号稳定:
- // 延时函数(通过空循环提供延时)
- 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();
- }
- }
复制代码 |
|