在红外遥控器试验中,按+、2、4这3个键将产生总线Fault然后上访成硬Fault,导致程序卡在硬Fault中断的死循环里。
原因是这3个键的键值小于32(0x20),这样在ascii表里不是字符,在LCD_DispStr函数里“i = ascii - ;”这一句会产生负数,负数作为一个数组的下标将产生精确的数据访问违例(总线Fault的一种)。
解决方法:
main函数中的:
sprintf(lcd_key_val,"key_val:%c",key_val);
LCD_DispStr(30, 40, lcd_key_val, RED);
这两行代码改成:
sprintf(lcd_key_val,"key_val:%d",key_val);
LCD_DispStr(30, 40, "key_val: ", RED);
LCD_DispStr(30, 40, (uint8_t *)lcd_key_val, RED);
第一行结果以数字形式显示键值,这样就解决了上述BUG。
再加上第二句,是为了使显示完三位数的键值后再显示两位数或者一位数键值时上一次的三位数字后面的数字还存在。
第三行增加了个数据类型转换。虽然不加效果一样,但是有个warning,毕竟不是什么好事。光盘中的《编程修养.pdf》中第31条:不要忽略Warning.
望采纳! |