標題: 52單片機的lcd1602顯示亂碼,求解答 [打印本頁]
作者: BAW 時間: 2020-5-22 03:01
標題: 52單片機的lcd1602顯示亂碼,求解答
#include<reg52.h>
#include<intrins.h>
#include<stdio.h>
#include<math.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
uchar code table[]="cm^2";
sbit lcden=P2^2;
sbit lcdrs=P2^0;
sbit lcdwr=P2^1;
sbit adwr=P3^6;
sbit adrd=P3^7;
sbit adcs=P2^5;
uchar num,ad_val;
void delay(uint z) //延時子函數
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void write_com(uchar com) //寫命令
{
lcdrs=0;
lcdwr=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void write_data(uchar date) //寫數據
{
lcdrs=1;
lcdwr=0;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void init() //液晶初始化
{
lcden=0;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
}
uchar get_ad() //A/D 啟動和轉換程序
{
uchar ad_val;
adwr=1;
_nop_();
adwr=0; //一個向下的脈沖,啟動 A/D 轉換
_nop_();
adwr=1;
delay(5); //延遲 5 微秒,給 A/D 轉換留一定的時間
P1=0xff; //讀取 P1 口之前先給其全寫 1
adrd=1; //選通 ADCS
_nop_();
adrd=0;
_nop_();
ad_val=P1; //AD 數據賦給 P1 口
adrd=1;
return ad_val;
}
void main() //主函數
{
uint A1,A2,A3,A4; //uint 的范圍是 0-65535
ulong ad_val,ad_vo; //ulong 的范圍是 0~2^32-1
adcs=0; //AD 的片選信號選通*/
ad_val=get_ad();
delay(10);
ad_val=ad_val*10000;
ad_vo= (45574-ad_val)/3522; //本來是 y=(4.5574-x)/0.3522
ad_vo=ad_vo*10000; //浮點數不能差分,把它們擴大 10000 倍
A1=ad_vo/100000;
A2=ad_vo%100000/10000;
A3=ad_vo%10000/1000;
A4=ad_vo%1000/100;
init();
write_com(0x80);
{
write_data(A1+48);
write_data(A2+48);
write_data('.');
write_data(A3+48);
write_data(A4+48);
delay(5);
}
write_com(0x80+0x40);
for(num=0;num<4;num++)
{
write_data(table[num]);
delay(5);
}
while(1);
}
十位數顯示亂碼其他正常。求大神解救
作者: man1234567 時間: 2020-5-22 16:02
一般1602能顯示就正常亂碼多是讀數不失常 。
作者: 149820 時間: 2020-5-22 16:27
是不是初始化沒做好,或者時序太快造成lcd的工作不穩定所以十位數顯示亂碼
| 歡迎光臨 (http://m.raoushi.com/bbs/) |
Powered by Discuz! X3.1 |