从根本上来说,如果你使用UART1,就不要同时使用PD3和PD2做GPIO用,如果非要复用的话,也要确保它们不同时生效,但你上面的程序显然不是这样。像你上面这样连接的话,即便修正了你的程序串口能够收到数据,但PD3和PD2的方向和高低也是由UART1控制,而非你所控制;也就是说显示不正确!
其次,要恢复PD3和PD2的GPIO功能是禁用UART1,而不是关闭全局中断!
再次,超级循环体中反复开关全局中断,而你的串口接收又是中断驱动的,当然接收不正常!
要纠正,这样:
1. 使用PORTD以外的端口连接LED,或者使用UART1之外的串口收发数据
2. 串口接收中断中收到有效数据置位标志
3. 超级循环体判断上述标志,如置位则:发送到PORTx,清零标志
4. 无需反复开关全局中断
又看了一下,貌似LED在PORTE上面,这样的话和PORTD的IO功能就没什么关系了吧。
删除超级循环体上的全局中断开关代码应该可以运行,但还是建议按前述流程操作,这样利用中断规范些!
是编译通不过执行不了 还是执行结果不理想?
如果使用PORTD做控制LED灯的IO口,那么先定义为输出:
DDRD |= 0XFF;
再输出各位的bool值:
PORTD |= 0xFF;