#include<reg52.h>
#include<intrins.h>
#include<stdlib.h>
#define uchar unsigned char
#define uint unsigned int
#define lcd_data P0
uchar table[5];
//uint sda=8000;
//sbit eoc=P1^1;//EOC
//sbit clk=P1^2;//clock
//sbit sdi=P1^3;//data input
//sbit sdo=P1^4;//data ouput
//sbit cs=P1^5;//cs
//sbit lcd_rs=P2^6;
//sbit lcd_rw=P2^5;
//sbit lcd_en=P2^7;
//sbit lcd_psb=P3^2;
//sbit lcd_rst=P3^4;
sbit CS=P1^2;
sbit CLK=P1^3;
sbit SDO=P1^0;
sbit SDI=P1^1;
sbit EOC=P1^4;
//sbit eoc=P3^3;//EOC
//sbit clk=P3^4;//clock
//sbit sdi=P3^5;//data input
//sbit sdo=P3^6;//data ouput
//sbit cs=P3^7;//cs
sbit lcd_rs=P2^7;
sbit lcd_rw=P2^6;
sbit lcd_en=P2^5;
sbit lcd_psb=P2^4;
sbit lcd_rst=P2^3;
void delay_ms(uchar t)
{
uint j,k;
for(k=t;k>0;k--)
for(j=110;j>0;j--);
}
void write_com(uchar com)
{
lcd_rs=0;
lcd_rw=0;
lcd_en=0;
P0=com;
delay_ms(5);
lcd_en=1;
delay_ms(5);
lcd_en=0;
}
void write_dat(uchar date)
{
lcd_rs=1;
lcd_rw=0;
lcd_en=0;
P0=date;
delay_ms(5);
lcd_en=1;
delay_ms(5);
lcd_en=0;
}
void clear()
{
write_com(0x01);
delay_ms(2);
}
void lcd_pos(uchar X,uchar Y)
{
uchar pos;
if(X==0)
{X=0x80;}
else if(X==1)
{X=0x90;}
else if(X==2)
{X=0x88;}
else if(X==3)
{X=0x98;}
pos=X+Y;
write_com(pos);
}
void display1(uchar x,uchar y,uchar *disp)
{
lcd_pos(x,y);
while(*disp) //显示函数
{
write_dat(*disp);
disp=disp+1;
delay_ms(1);
}
}
void lcd_init()
{
lcd_psb=1;
lcd_rst=0;
delay_ms(5);
lcd_rst=1;
delay_ms(5);
write_com(0x30); // 基本操作指令 delay_ms(5);
write_com(0x0c); // 显示开,关光标 delay_ms(5);
write_com(0x01); // 清除LCD的显示内容 delay_ms(5);
}
unsigned int A_D(unsigned char CH_i) //CH_i,通道值
{
unsigned int AD_Val; //储存12位的A/D转换结果
unsigned char i;
AD_Val=0;
CS=1; //一个转换周期开始
EOC=0;
CLK=0; //为第一个脉冲作准备
_nop_();
_nop_();
CS=0; //CS置0,片选有效
EOC=1; //EOC开始应设为高电平
CH_i<<=4; //将通道值(D7,D6,D5,D4)移入高四位,转换通道设置
CH_i|=0x02; //D3,D2,D1,D0=0,0,1,0 ,输出数据为12位,先输出低位
for(i=0;i<8;i++) //将A/D转换方式控制字写入TLC2543,并读取低8位转换结果
{
AD_Val>>=1; //将读取结果逐位右移(先输出的是低位)
CLK=0;
_nop_();
if((CH_i&0x80)==0x80)
SDI=1;
else
SDI=0;
CH_i<<=1; //在脉冲上升沿,从高位至低位依次将控制字写入TLC2543
CLK=1;
_nop_();
if(SDO==1) //在脉冲下降沿,TLC2543输出数据,写入AD_Val的第12位
{
AD_Val|=0x800;
}
else
{
AD_Val|=0x000;
}
}
SDI=0; //8个数据流输入后,SDI端必须保持在一个固定的电平上,指引EOC变高
for(i=8;i<12;i++) //读取转换值的第8至第11位
{
AD_Val>>=1;
CLK=0;
_nop_();
CLK=1;
_nop_();
if(SDO==1)
{
AD_Val|=0x800; //在脉冲下降沿,TLC2543输出数据,写入AD_Val的第12位
}
else
{
AD_Val|=0x000; //第12位写 ‘0’
}
}
CLK=0; //在第12个时钟下降沿来临时,EOC开始变低,开始对本次采样的模拟量进行A/D转换,
_nop_(); //给硬件一点转换时间
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
CS=1; // 停止转换,高电平无效
EOC=0;
return AD_Val;
}
void display(uchar x,uchar y,uint temp)
{
uchar i=0;
temp=temp*5000.0/4096;
table[0]=temp/1000;
table[1]=-2;//显示小数点
table[2]=temp%1000/100;
table[3]=temp%1000%100/10;
table[4]=temp%1000%100%10;
lcd_pos(x,y);
for(i=0;i<5;i++)
{
write_dat('0'+table);
delay_ms(5);
}
}
void main()
{
double AD2=0;
lcd_init();
clear();
//read();
display1(0,0,"电压值");
;
while(1)
{
AD2=A_D(0x00);//通道0测试
display(0,5,AD2);
delay_ms(10);
}
}
这是和谐别人的,帮忙看下,我测了一下通道0与地,发现有1~2V的电压,然后我并一只10k的电阻,然发现不乱跳了显示为0000,但是有模糊重影,但测量是还是乱跳 |