原创 液晶显示+AD

2008-6-20 22:51 2344 6 6 分类: MCU/ 嵌入式

#include "reg51.h"
#include "intrins.h"
#define uchar unsigned char
#define uint unsigned int
#define Port P0
sbit RS="P2"^0;
sbit RW="P2"^1;
sbit E="P2"^2;
sbit OE="P2"^3;
sbit ST="P2"^4;
sbit EOC="P2"^5;
uint getdata,volt;
uchar Read();
uchar code str0[]={"ChinaI Love You!"};   /*定义数组*/
uchar code str1[]={"       V"};


uchar a[6];
/*延时子函数*/
void delay(uint k)
{
  uint i,j;
  for(i=0;i  {
    for(j=0;j<60;j++)
          {;}
  }
}


/*写状态函数*/
void WriteCommand(uchar WLCD,uchar Busy)
{
  if(Busy) Read();     //若Busy为1,则调用Read子函数进行忙检测
  Port="WLCD";           //将变量WLCD中的指令传送至P1口
  RS="0";                //选中指令寄存器
  RW="0";                //写模式
  E="1";                 //置E端为高电平,写使能
  _nop_();             //延时一段时间
  _nop_();
  _nop_();
  E="0";                 //置E端为低电平
  delay(5);
}


/*写数据子函数*/
void WriteData(uchar WDLCD)
{
  Read();
  Port="WDLCD";
  RS="1";
  RW="0";
  E="1";                  //置E端为高电平,读使能
  _nop_();
  _nop_();
  _nop_();
  E="0";
  delay(5);
}


/*读状态子函数*/
uchar Read(void)
{
  Port="0xff";
  RS="0";
  RW="1";
  E="0";_nop_();
  E="1";
  while(Port&0x80);      /*检测忙信号,当P1口内容与80H相与后不为0时,程序原地踏步*/
  return(Port);
}


void RESET()
{
  WriteCommand(0x30,0);
  WriteCommand(0x38,1);   //设置工作方式,8位数据传送,2行显示,检测忙信号
  WriteCommand(0x0c,1);   //设置状态模式,显示屏打开,光标不显示、不闪烁、检测忙信号
  WriteCommand(0x01,1);   //清屏,检测忙信号
  WriteCommand(0x06,1);   //输入方式设置,显示光标右移设置,检测忙信号
}
/*显示指定坐标的一个字符子函数*/
void DisplayOnechar(uchar x,uchar y,uchar Data)
{
  y&=0x01;                //y的变化范围0~1
  x&=0x0f;                //x的变化范围0~15
  if(y) x|=0x40;          //若y为1,地址码+0x40
  x|=0x80;                //指令码为地址码+0x80
  WriteCommand(x,0);      //将指令x写入LCD,忽略忙信号检测
  WriteData(Data);        //再将数据Data写入LCD
}
//显示指定坐标的一串字符子函数
void DisplayChar(uchar x,uchar y,uchar *Data)
{
  uchar Length="0";
  y&=0x1;
  x&=0xf;
  while((x<0xf)&(Data[Length]!='\0'))     //x<15时进入while语句循环
  {
    DisplayOnechar(x,y,Data[Length]);     //显示单个字符
    Length++;                             //数据指针递增
    x++;                                  //x轴坐标递增
  }
}
intput(uint j)
{
   uchar i;


   a[0]=(j/1000)%10;
   a[1]='.';
   a[2]=(j/100)%10;
   
   a[3]=(j/10)%10;
   a[4]=(j/1)%10;
   for(i=0;i<5;i++)
   {  if(i==1) a='.';
    else a=a+'0';
   }
   DisplayChar(0,1,&a[0]);
}
void main()
{
    RESET();
    DisplayChar(0,0,&str0[0]);
    DisplayChar(0,1,&str1[0]);
    while(1)
    {
    ST="1";
    ST="0";
    while(EOC==0);
    OE="1";
    getdata="P1";
    OE="0";
    volt="getdata"*1.0*5000/255;
    intput(volt);
    delay(10);
    }
}

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
6
关闭 站长推荐上一条 /3 下一条