小菜鸟一枚,照着书里的程序稍微改了一下放到keil里,编译无错误,但是仿真板上的显示不符合设计要求,请大佬们帮忙看看,谢谢了~
程序目的:实现读取端口电压,在LCD1602上实现读数显示。
问题:端口调用无问题,LCD上也能显示读数,但是读数明显和实际不符。
程序如下:
#include<reg51.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit DIN=P3^4;
sbit CS=P3^5;
sbit DCLK=P3^6;
sbit DOUT=P3^7;
sbit LCDRS=P2^6;
sbit LCDRW=P2^5;
sbit LCDE=P2^7;
uchar VOL[4];
SPI_Write(uchar value)
{
uchar i;
DCLK=0;
for(i=0;i<8;i++)
{
DIN=value>>7;
value=value<<1;
DCLK=0;
DCLK=1;
}
}
uint SPI_Read()
{
uint i,value=0;
DCLK=0;
for(i=0;i<12;i++)
{
value=value<<1;
value|=DOUT;
DCLK=1;
DCLK=0;
}
return value;
}
Read_AD_Value(uchar cmd)
{
uchar i;
uint dat;
CS=0;
DCLK=0;
SPI_Write(cmd);
for(i=0;i<6;i++)
DCLK=1;
_nop_();
_nop_();
DCLK=0;
_nop_();
_nop_();
dat=SPI_Read;
CS=1;
return dat;
}
void delay(uint x)
{
uint i,j;
for(i=x;i>0;i--)
for(j=110;j>0;j--);
}
void LCDBE()
{
LCD_Code(0x38);
LCD_Code(0x0c);
LCD_Code(0x06);
LCD_Code(0x01);
LCD_Code(0x80);
}
void LCD_Code(uchar com)
{
LCDRS=0;
LCDRW=0;
LCDE=0;
P0=com;
delay(1);
LCDE=1;
delay(5);
LCDE=0;
}
void LCD_Data(uchar dat)
{
LCDRS=1;
LCDRW=0;
LCDE=0;
P0=dat;
delay(1);
LCDE=1;
delay(5);
LCDE=0;
}
void main()
{
uchar i;
uint count,AD_Value;
LCDBE();
while(1)
{
if(count==50)
{
count=0;
AD_Value=Read_AD_Data(0x94);
VOL[3]=0x30+(AD_Value/1000);
VOL[2]=0x30+(AD_Value%1000/100);
VOL[1]=0x30+(AD_Value%100/10);
VOL[0]=0x30+(AD_Value%10);
for(i=0;i<4;i++)
LCD_Data(VOL[i]);
}
count++;
LCD_Code(0x80);
}
}
===========================================
请各位大佬看看,谢谢了 |