1: /*-------------------------------------------------------
2: * @ 功能:指定12点行反显
3: * @ 参数:ctrl 0 清除/1点亮/2取反
4: * x1 横坐标 0 - 239
5: * y1 纵坐标 0 - 159
6: * len 长度
7: * @ 返回:
8: * @ 时间:2013/04/12
9: */
10: int LCDDataLineOption(u8 ctrl, u8 y1, u8 x1, u8 len)
11: {
12: u8 x2, y2;
13: if(x1 > 240)
14: return 1;
15: if(y1 > 160)
16: return 2;
17: y1 *= 12;
18: x1 *= 12;
19: y2 = y1 + 12;
20: x2 = x1 + 12 * len;
21: LCDDataOption(ctrl, y1, x1, y2, x2);
22: return 0;
23: }
在LCDDataLineOption模块中,第一次调试时错将第19行的y2 = y1 + 12 写成了:y2 = y2 + 12
且在调试时参数y1都是0, 所以y2自然也就是12了, 但是写错代码时结果似乎也是对的,条件是y2初始值也是0,恰好这里没有初始化,理论没有初始化应该是一个随机数,但是下载到单片机里就不一样了,刚开始试时怎么都是对的,因为单片机RAM没有被覆盖,y2每次都是0,LCD正常用显示;
随着程序跑的时间长了,y2在RAM没有被覆盖了,LCD每次反显时都多一行,因为没有初始化的y2不再是0,细查才发现这个问题:一个错误代码与不严谨的代码导致的问题。