程序的严格性似乎总是被很多人遗忘,在编写程序时,一定要把隐患消灭掉,否则后患无穷。这里以1602液晶屏为例,希望可以作为一个切入点,但是要通过问题表象,看到问题本质,而不仅仅局限于1602液晶屏,思想更加重要。大家都知道1602液晶屏的数据口是8位数据口,但是实际上还有一种模式,就是4位数据口,实质上很简单,就是利用4位数据口传送数据,传送两次而已,其他无差别,但这不是这里讨论的关键。下面看一下网友的代码(只放关键部分):#define DataPort P0
void LCD_Write_Data(unsigned char Data)
{
//while(LCD_Check_Busy()); //忙则等待
DelayMs(5);
RS_SET;
RW_CLR;
EN_SET;
DataPort= Data;
_nop_();
EN_CLR;
EN_SET;
DataPort= Data<<4;
_nop_();
EN_CLR;
}
其中,我们之关心两句话,就是DataPort= Data; 和DataPort= Data<<4; 这两句话什么意思呢 ? 就是通过P0端口的高4个Bit,把数据传送两次,使用的是P04,P05,P06,P07。这里的实验网友成功了,他认为这个代码没有问题,但是这里的隐患确实非常明显的,如果不该掉,可能导致这样的情况发生:在1602的液晶屏4位数据口模式的独立实验中成功了,但是在一个复杂的系统设计中,却出现了很多意料之外的情况。实际上,问题较为突出,比如第一句DataPort= Data ; 从上面我们看出,对于1602而言,他只关心和他的4位数据口连接的 P04,P05,P06,P07的状态,但是上面的复制,却影响到了P00,P01,P02,P03,这里明显不行的,比如P00,P01,P02,P03连接了LED或者其他设备,这时候会影响到他们的运行。所以我的建议是,修改为:
第一次传送:
DataPort &= 0x0f ; /*P0高4位清零,准备传送数据*/
DataPort |= (temp & 0xf0) ;/*P0传送数据temp的高4位,P0的低4位不受影响*/
第二次传送:
DataPort &= 0x0f ; /*P0高4位清零,准备传送数据*/
DataPort |= ((temp & 0x0f)<<4) ;/*P0传送数据temp的低4位,P0的低4位不受影响*/
这里,希望新手可以通过这表象,看到问题的本质,将隐患扼杀在摇篮,否则简单的1602的4位数据口模式,会成为你调试复杂系统调试的噩梦。
|