使用的是STM32F103C8T6最小系统版,LCD1602液晶
乱码如图:
代码如下
#include "led.h"
#include "delay.h"
#include "sys.h"
#include "key.h"
#include "usart.h"
#include "timer.h"
#include "lcd1602.h"
#include "useri2c.h"
char dis_temp[16];//ÏÔʾÊý×éÔÝ´æ
char dis_temp1[16];//ÏÔʾÊý×éÔÝ´æ
int dist_high = 1000;
int dist_low = 200;
u8 setFlag = 0;
u8 getFlag = 0;
//¶¨ÒåÒ»¸ö¹²Í¬Ì壬½á¹û¶ÁÈ¡µ½distanÊý×éÖУ¬distanc¾ÍÊǾàÀëµÄÕûÊýÖµ£¬²»ÐèÒªÔÙд³ÌÐòת»»
union distance_union
{
unsigned long distance;
unsigned int distanc;
unsigned char distan[4];
};
int main(void)
{
unsigned char dat[1] = {0};
union distance_union dist;
delay_init(); //ÑÓʱº¯Êý³õʼ»¯
NVIC_Configuration();//ÉèÖÃNVICÖжϷÖ×é2:2λÇÀÕ¼ÓÅÏȼ¶£¬2λÏìÓ¦ÓÅÏȼ¶
USARTx_Init(USART1,9600); //´®¿Ú³õʼ»¯
UserI2c_Init();
LED_Init(); //LED¶Ë¿Ú³õʼ»¯
KEY_Init(); //°´¼ü¶Ë¿Ú³õʼ»¯
TIM3_Int_Init(499,7199);//10KhzµÄ¼ÆÊýƵÂÊ£¬¼ÆÊýµ½500Ϊ50ms
Lcd_Init(); //Òº¾§³õʼ»¯
delay_ms(20);
Lcd_Puts(0,0,"Laser ranging");//ÏÔʾ
delay_ms(1000);
SensorWritenByte(dat,0x09,1);//ÉèΪ±»¶¯¶Áȡģʽ
while(1)
{
if(getFlag){//500msÖÃλһ´Î£¬¼´0.5ÃëÖ´ÐÐÒ»´Î²â¾à
getFlag=0;//Çå³ý±ê־λ
SensorReadnByte(dist.distan,0x02,4);//¶ÁÈ¡Â˲¨ºó¾àÀë
}
KeyScan();//ɨÃè°´¼ü
if(KeyIsPress(key_set)){//Èç¹ûÉèÖð´¼ü°´ÏÂ
setFlag++;//ÉèÖñêÖ¾Öµ¼Ó1
setFlag%=3;//ʹÉèÖñêÖ¾ÖµÔÚ0~2Ö®¼ä±ä»¯£¬0Ϊ²»ÉèÖã¬1ΪÉèÖÃÏÂÏÞ£¬2ΪÉèÖÃÉÏÏÞ
}
if(setFlag==1){//Èç¹ûµ±Ç°±êÖ¾ÊÇÉèÖÃÏÂÏÞÖµ
if(KeyIsPress(key_dec)){//Èç¹û¡°¼õ¡±°´¼ü°´ÏÂ
if(dist_low>20){//Èç¹ûÏÂÏÞÖµ´óÓÚ20£¨²âÁ¿¾àÀë¹ýСʱ²»×¼È·£©
dist_low-=10;//ÏÂÏÞÖµµÝ¼õ10£¬µ¥Î»mm
}
}
if(KeyIsPress(key_inc)){//Èç¹û¡°¼Ó¡±°´¼ü°´ÏÂ
if(dist_low<(dist_high-10)){//Èç¹ûÏÂÏÞֵСÓÚÉÏÏÞ¼õ10£¨ÏÂÏÞ²»ÄÜ´óÓÚÉÏÏÞ£©
dist_low+=10;//ÏÂÏÞÖµµÝÔö10£¬µ¥Î»mm
}
}
sprintf(dis_temp1," SL:%4d H:%4d",dist_low,dist_high); //´òÓ¡
}
else if(setFlag==2){//Èç¹ûµ±Ç°±êÖ¾ÊÇÉèÖÃÉÏÏÞÖµ
if(KeyIsPress(key_dec)){//Èç¹û¡°¼õ¡±°´¼ü°´ÏÂ
if(dist_high>(dist_low+10)){//Èç¹ûÉÏÏÞÖµ´óÓÚÏÂÏÞ¼Ó10£¨ÏÂÏÞ²»ÄÜ´óÓÚÉÏÏÞ£©
dist_high-=10;//ÉÏÏÞÖµµÝ¼õ10£¬µ¥Î»mm
}
}
if(KeyIsPress(key_inc)){//Èç¹û¡°¼Ó¡±°´¼ü°´ÏÂ
if(dist_high<2000){//Èç¹ûÉÏÏÞֵСÓÚ2000£¨×î´ó²âÁ¿¾àÀ룩
dist_high+=10;//ÉÏÏÞÖµµÝÔö10£¬µ¥Î»mm
}
}
sprintf(dis_temp1," L:%4d SH:%4d",dist_low,dist_high); //´òÓ¡
}
else{
sprintf(dis_temp1," L:%4d H:%4d",dist_low,dist_high); //´òÓ¡
}
Lcd_Puts(0,1,dis_temp1);//ÏÔʾ
if(dist.distanc>=dist_high || dist.distanc<=dist_low){//²»ÔÚãÐÖµ·¶Î§ÄÚ
beep = 1;//·äÃùÆ÷±¨¾¯
}
else{
beep = 0;//¹Ø±Õ·äÃùÆ÷
}
sprintf(dis_temp,"dis:%dmm ",dist.distanc); //´òÓ¡
Lcd_Puts(0,0,dis_temp);//ÏÔʾ
}
}
上电时,需要延时100ms,再操作LCD
之前能正常显示,后面显示乱码,有可能是接线有问题,检查一下接线。是否有松动。