这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界» 论坛首页» 嵌入式开发» STM32» TLC2543采集的数据用12864显示,结果不准确!!!求大神指点!!

共3条 1/1 1 跳转至

TLC2543采集的数据用12864显示,结果不准确!!!求大神指点!!

菜鸟
2014-07-19 15:50:49 打赏
#include
#include
#include
#include "12864.c"

#define uint unsigned int
#define uchar unsigned char

sbit clock = P1^0;
sbit input = P1^1;
sbit output = P1^2;
sbit CS = P1^3;

uchar voltage=0;
uint u,data0=0;//,datal,datah; //转换结果,低位,高位
uchar data disp_buf[] ={"0000"};//显示缓冲区
uchar data disp_buf1[] ={"0.00"};

void delay(uchar N)
{
while(N--);
}

uint read2543(uchar CON_WORD) //通道号
{
uint ad=0;
uchar i;
CON_WORD<<=4;
clock=0;
CS=0;
for(i=0;i<12;i++) //默认12位ADC,输出十二个二进制数
{
if(output==1)
ad=ad|0x01;
if(CON_WORD&0x80)
input=1;
else
input=0;
clock=1;
delay1(10);
clock=0;
delay1(10);
CON_WORD<<=1;
ad<<=1;
}
CS=1;
ad>>=1;
return(ad);
}

void calculate()
{
uchar temp1,temp2;
disp_buf[0]=(uchar)((data0/1000)+'0'); //千位
temp1=(data0%1000);
disp_buf[1]=(uchar)((temp1/100)+'0'); //百位
temp2=(temp1%100);
disp_buf[2]=(uchar)((temp2/10)+'0'); //十位
disp_buf[3]=(uchar)((temp2%10)+'0'); //个位
//u=(uint)(data0+'0');//disp_buf[0]*1000+disp_buf[1]*100+disp_buf[2]*10+disp_buf[3];
voltage=(uchar)(((data0*5)/4096)+'0');
disp_buf1[0]=(uchar)(voltage+'0');
}

void Display()
{
uchar i;
lcd_pos(1,0); //设置显示位置为第一行
for(i=0;i<4;i++)
{
lcd_wdat(disp_buf);
delay(10);
}

lcd_pos(2,0);
for(i=0;i<4;i++)
{
lcd_wdat(disp_buf1);
delay(10);
}

delay(30);
}

void main()
{
lcd_init();
while(1)
{
data0=read2543(0); //0表示通道号,可以改变。 data0是测得的AD转换数据
calculate();
Display(); //调显示函数
}
}
/*******************************************************************************
* 描述: *
* 12864标准字库液晶演示 数据p1,控制p2 *
********************************************************************************/
#include
#include
#define uchar unsigned char
#define uint unsigned int
/************* 12864LCD引脚定义 *************/
#define LCD_data P0 //数据口
sbit LCD_RS = P2^4; //寄存器选择输入
sbit LCD_RW = P2^3; //液晶读/写控制
sbit LCD_EN = P2^2; //液晶使能控制
sbit LCD_PSB = P3^6; //串/并方式控制
sbit LCD_RST = P3^7; //液晶复位端口
#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};


void delay2(int ms)
{
while(ms--)
{
uchar i;
for(i=0;i<150;i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
/*******************************************************************/
/* 延时函数 */
/*******************************************************************/
void delay1(int ms)
{
while(ms--)
{
uchar y;
for(y=0;y<100;y++) ;
}
}
/*******************************************************************/
/*检查LCD忙状态 */
/*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据。 */
/*******************************************************************/
bit lcd_busy()
{
bit result;
LCD_RS = 0;
LCD_RW = 1;
LCD_EN = 1;
delayNOP();
result = (bit)(P0&0x80);
LCD_EN = 0;
return(result);
}
/*******************************************************************/
/*写指令数据到LCD */
/*RS=L,RW=L,E=高脉冲,D0-D7=指令码。 */
/*******************************************************************/
void lcd_wcmd(uchar cmd)
{
while(lcd_busy());
LCD_RS = 0;
LCD_RW = 0;
LCD_EN = 0;
_nop_();
_nop_();
P0 = cmd;
delayNOP();
LCD_EN = 1;
delayNOP();
LCD_EN = 0;
}
/*******************************************************************/
/*写显示数据到LCD */
/*RS=H,RW=L,E=高脉冲,D0-D7=数据。 */
/*******************************************************************/
void lcd_wdat(uchar dat)
{
while(lcd_busy());
LCD_RS = 1;
LCD_RW = 0;
LCD_EN = 0;
P0 = dat;
delayNOP();
LCD_EN = 1;
delayNOP();
LCD_EN = 0;
}
/*********************************/
/* LCD初始化设定 */
/*********************************/

void lcd_init()
{
LCD_PSB = 1; //并口方式

LCD_RST = 0; //液晶复位
delay2(3);
LCD_RST = 1;
delay2(3);

lcd_wcmd(0x34); //扩充指令操作
delay2(5);
lcd_wcmd(0x30); //基本指令操作
delay2(5);
lcd_wcmd(0x0C); //显示开,关光标
delay2(5);
lcd_wcmd(0x01); //清除LCD的显示内容
delay2(5);
}
/*********************************************************/
/* 设定显示位置 */
/*********************************************************/
void lcd_pos(uchar X,uchar Y)
{
uchar pos;
if (X==1)
{X=0x80;}
else if (X==2)
{X=0x90;}
else if (X==3)
{X=0x88;}
else if (X==4)
{X=0x98;}
pos = X+Y ;

lcd_wcmd(pos); //显示地址
}
/*********************************************************
* 闪烁函数 *
*********************************************************/

void clr_screen()
{
lcd_wcmd(0x34); //扩充指令操作
delay2(5);
lcd_wcmd(0x30); //基本指令操作
delay2(5);
lcd_wcmd(0x01); //清屏
delay2(5);
}





5V的时候显示:





0V的时候显示:






3.3V的时候显示:




0V和5V的时候显示都是准确的,可是他们之间的电压显示就有误差,有各位大神指点!!!!!



关键词: TLC2543 12864 采集 数据

助工
2014-07-19 18:08:16 打赏
2楼
我就看看有没有大神来指导

院士
2014-07-21 22:28:57 打赏
3楼

就是这样的排版,看起来真是不舒服啊~~~

算了吧,我还是回答其他网友的问题吧


共3条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册]