12864液晶显示问题

来源:互联网 发布:mysql中的约束 编辑:程序博客网 时间:2024/05/16 08:15

最近在使用12864液晶,可以显示汉字了,但是AD转换显示不正确,不知道它怎么样可以实时显示正确的电压值

问题是,我的AD转换用数码管可以显示,用1602也可以显示,但是12864,不太清楚怎么使用才会实时显示.

 #include <reg51.h>
#include <intrins.h>
#include<math.h>
#include<string.h>

#define uint unsigned int
#define uchar unsigned char

//ADC0832的引脚
sbit ADCS =P3^4;  //ADC0832 chip seclect
sbit ADDI =P1^1;  //ADC0832 k in
sbit ADDO =P1^1;  //ADC0832 k out
sbit ADCLK =P1^0;  //ADC0832 clock signal

sbit RS=P2^3;
sbit WRD=P2^4;
sbit E=P2^5;
sbit RES=P2^2;
sbit PSB=P2^0;

uint temp;
uchar getdata; //获取ADC转换回来的值
uchar Display_Buffer[]="0.00V" ;

uchar code IC_DAT[ ]={
"液晶显示电压值         "
  };


void delayms(unsigned int n)    //延时子程序
{
unsigned int i,j;
for(i=0;i<n;i++)
   for(j=0;j<2000;j++);
}
void delay(unsigned int m)
{
unsigned int i,j;
for(i=0;i<m;i++)
for(j=0;j<10;j++);
}

 
//采集并返回
unsigned int Adc0832(unsigned char channel)     //AD转换,返回结果
{
    uchar i=0;
    uchar j;
    uint dat=0;
    uchar ndat=0;

    if(channel==0)channel=2;
    if(channel==1)channel=3;
    ADDI=1;
    _nop_();
    _nop_();
    ADCS=0;//拉低CS端
    _nop_();
    _nop_();
    ADCLK=1;//拉高CLK端
    _nop_();
    _nop_();
    ADCLK=0;//拉低CLK端,形成下降沿1
    _nop_();
    _nop_();
    ADCLK=1;//拉高CLK端
    ADDI=channel&0x1;
    _nop_();
    _nop_();
    ADCLK=0;//拉低CLK端,形成下降沿2
    _nop_();
    _nop_();
    ADCLK=1;//拉高CLK端
    ADDI=(channel>>1)&0x1;
    _nop_();
    _nop_();
    ADCLK=0;//拉低CLK端,形成下降沿3
    ADDI=1;//控制命令结束
    _nop_();
    _nop_();
    dat=0;
    for(i=0;i<8;i++)
    {
        dat|=ADDO;//收数据
        ADCLK=1;
        _nop_();
        _nop_();
        ADCLK=0;//形成一次时钟脉冲
        _nop_();
        _nop_();
        dat<<=1;
        if(i==7)dat|=ADDO;
    } 
    for(i=0;i<8;i++)
    {
        j=0;
        j=j|ADDO;//收数据
        ADCLK=1;
        _nop_();
        _nop_();
        ADCLK=0;//形成一次时钟脉冲
        _nop_();
        _nop_();
        j=j<<7;
        ndat=ndat|j;
        if(i<7)ndat>>=1;
    }
    ADCS=1;//拉低CS端
    ADCLK=0;//拉低CLK端
    ADDO=1;//拉高数据端,回到初始状态
    dat<<=8;
    dat|=ndat;
    return(dat);            //return ad k
}

 

 void TransferData(char data1,bit DI) //传送数据或是命令,当DI=0时,传送命令,当DI=1时,传送数据
{
WRD=0;
RS=DI;
delay(1);
P0=data1;
E=1;
delay(1);
E=0;
}

 void lcd_mesg(unsigned char code *addr1)   //显示汉字函数,8*4=32
{
unsigned char i;
TransferData(0x80,0);
delay(100);
for(i=0;i<32;i++)
   {
    TransferData(*addr1,1);
    addr1++;
   }
   TransferData(0x90,0);
   delay(100);
   for(i=32;i<64;i++)
   {
    TransferData(*addr1,1);
    addr1++;
   }
}

void initinal(void)           //初始化,12864有要求的要写上
{
delay(40);
PSB=1;   //并口工作模式
delay(1);
RES=0; //复位
delay(1);
RES=1;   //复位置高
delay(10);
TransferData(0x30,0);
delay(100);
TransferData(0x30,0);
delay(37);
TransferData(0x08,0);
delay(100);
TransferData(0x10,0);
delay(100);
TransferData(0x0C,0);
delay(100);
TransferData(0x01,0);
delay(10);
TransferData(0x06,0);
delay(100);
}

 

/************
读ADC0832函数
************/

 
void main(void)
{  uchar i;
  //while(1)
  { initinal();
  getdata=Adc0832(0);
    //电压值转换,5V做为参考电压,分成256份。
  temp=getdata*50.0/255;
  Display_Buffer[0]=temp%10;  //个位
  Display_Buffer[2]=temp/10%10; //十位
  Display_Buffer[1]=temp/100; //百位
 
  lcd_mesg(IC_DAT);
  delayms(250);
  delayms(250);
  i=0;
  while(Display_Buffer[i]!='/0')
   TransferData( Display_Buffer[i++],1);
  //lcd_(Display_Buffer[i++]);
  delayms(250);
  delayms(250);

  }
}

 

原创粉丝点击