- ADC0832和AT89C52连接,但是LCD显示的模拟量一直是255
#include <REGX51.H>
#include <intrins.H>
sbit ADC_CS = P3^4;
sbit ADC_CLK = P3^2;
sbit ADC_DATA = P3^3;
unsigned char Get_ADValue() //获取AD转换结果
{
unsigned char i,temp;
ADC_CS = 1; ADC_CLK = 0;
ADC_CS = 0; //芯片低电平使能
ADC_CLK = 1;
_nop_();
ADC_DATA = 1; //DI端输出第一个逻辑高,表示起始位,上升沿时数据移入寄存器
ADC_CLK = 0;
ADC_CLK = 1;
_nop_();
ADC_DATA = 1; //1为双通道单极性输入,上升沿时数据移入寄存器
ADC_CLK = 0;
ADC_CLK = 1;
_nop_();
ADC_DATA = 0; //选择通道0,上升沿时数据移入寄存器
ADC_CLK = 0;
ADC_DATA = 1; //释放总线
for(i=0;i<8;i++)
{
ADC_CLK = 1;
_nop_();
if(ADC_DATA == 1)
{
temp=((temp<<1)|0x01);
}
else
{
temp=((temp<<1)|0x00);
}
ADC_CLK = 0;
}
ADC_DATA = 1;
ADC_CLK = 1;
ADC_CS = 1;
return temp;
}
#include <REGX52.H>
#include "LCD1602.h"
#include "AD.h"
void main()
{
unsigned char Value;
Init_LCD();
Value = Get_ADValue();
LCD_ShowBinNum(1,1,Value,8);
while(1)
{
}
}
#include <REGX51.H>
#include <intrins.H>
sbit LCD_RS = P2^5;
sbit LCD_RW = P2^6; //一般不进行读取操作,可直接接低电平
sbit LCD_EN = P2^7;
#define LCD_DATA P0
void Delay5ms() //@12.000MHz
{
unsigned char i, j;
i = 10;
j = 183;
do
{
while (--j);
} while (--i);
}
void Delay40us() //@12.000MHz
{
unsigned char i;
_nop_();
i = 17;
while (--i);
}
/*写命令*/
void WriteCommand(unsigned char Command)
{
LCD_EN = 0;
LCD_RS = 0; //RS为0选择命令
LCD_RW = 0; //RW为0时写入
LCD_DATA = Command; //EN上升沿写入命令
LCD_EN = 1;
Delay40us();
LCD_EN = 0;
}
/*写数据*/
void WriteDATA(unsigned char DATA)
{
LCD_EN = 0;
LCD_RS = 1; //RS为0选择数据
LCD_RW = 0; //RW为0时写入
LCD_DATA = DATA; //EN上升沿写入数据
LCD_EN = 1;
Delay40us();
LCD_EN = 0;
}
/*设置光标位置*/
void SetPosition(unsigned char line,unsigned char column)
{
if(line == 1)
{
WriteCommand(0x80|(column-1)); //设定 DDRAM 地址指令
}
else if(line == 2)
{
WriteCommand(0x80|(column-1+0x40)); ////设定 DDRAM 地址指令
}
}
/*初始化*/
void Init_LCD()
{
Delay5ms();
WriteCommand(0x38); //功能设定:8位数据总线、显示2行、5x7点阵/每字符
WriteCommand(0x0C); //显示控制:显示功能开、无光标不闪烁
WriteCommand(0x06); //模式设置:写入新数据后光标右移、屏幕不变
WriteCommand(0x01); //清屏
}
void LCD_ShowChar(unsigned char line,char column,char Char)
{
SetPosition(line,column);
WriteDATA(Char);
}
void LCD_ShowString(unsigned char Line,unsigned char Column,char *String)
{
unsigned char i;
SetPosition(Line,Column);
for(i=0;String[i]!='\0';i++)
{
WriteDATA(String[i]);
}
}
/**
* @brief 返回值=X的Y次方
*/
int LCD_Pow(int X,int Y)
{
unsigned char i;
int Result=1;
for(i=0;i<Y;i++)
{
Result*=X;
}
return Result;
}
/**
* @brief 在LCD1602指定位置开始显示所给数字
* @param Line 起始行位置,范围:1~2
* @param Column 起始列位置,范围:1~16
* @param Number 要显示的数字,范围:0~65535
* @param Length 要显示数字的长度,范围:1~5
* @retval 无
*/
void LCD_ShowNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)
{
unsigned char i;
SetPosition(Line,Column);
for(i=Length;i>0;i--)
{
WriteDATA(Number/LCD_Pow(10,i-1)%10+'0');
}
}
/**
* @brief 在LCD1602指定位置开始以有符号十进制显示所给数字
* @param Line 起始行位置,范围:1~2
* @param Column 起始列位置,范围:1~16
* @param Number 要显示的数字,范围:-32768~32767
* @param Length 要显示数字的长度,范围:1~5
* @retval 无
*/
void LCD_ShowSignedNum(unsigned char Line,unsigned char Column,int Number,unsigned char Length)
{
unsigned char i;
unsigned int Number1;
SetPosition(Line,Column);
if(Number>=0)
{
WriteDATA('+');
Number1=Number;
}
else
{
WriteDATA('-');
Number1=-Number;
}
for(i=Length;i>0;i--)
{
WriteDATA(Number1/LCD_Pow(10,i-1)%10+'0');
}
}
/**
* @brief 在LCD1602指定位置开始以十六进制显示所给数字
* @param Line 起始行位置,范围:1~2
* @param Column 起始列位置,范围:1~16
* @param Number 要显示的数字,范围:0~0xFFFF
* @param Length 要显示数字的长度,范围:1~4
* @retval 无
*/
void LCD_ShowHexNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)
{
unsigned char i,SingleNumber;
SetPosition(Line,Column);
for(i=Length;i>0;i--)
{
SingleNumber=Number/LCD_Pow(16,i-1)%16;
if(SingleNumber<10)
{
WriteDATA(SingleNumber+'0');
}
else
{
WriteDATA(SingleNumber-10+'A');
}
}
}
/**
* @brief 在LCD1602指定位置开始以二进制显示所给数字
* @param Line 起始行位置,范围:1~2
* @param Column 起始列位置,范围:1~16
* @param Number 要显示的数字,范围:0~1111 1111 1111 1111
* @param Length 要显示数字的长度,范围:1~16
* @retval 无
*/
void LCD_ShowBinNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)
{
unsigned char i;
SetPosition(Line,Column);
for(i=Length;i>0;i--)
{
WriteDATA(Number/LCD_Pow(2,i-1)%2+'0');
}
}
结果就是读取不到
LCD一直显示0XFF
这是为什么?换了其他程序,换了io口都不行