lcd正常的(注释实在弄不出来,我一直对keil里的字符编码不知怎么弄),代码如下:
#include<reg52.h>
#include<math.h>
#include<intrins.h>
#define uint unsigned int
#define uchr unsigned char
void PrintError1();
void LcdDisstr(uchr *p);
sbit EN=P1^2;
sbit RS=P1^0;
sbit RW=P1^1;
sbit SDA=P1^3;
sbit SCL=P1^4;
uchr code error1a[]="Sorry! Device w-";
uchr code error1b[]="ith no response!";
uchr code str1[16];
uint Intime=0;
uchr T0RH;
uchr T0RL;
bit flag=0;
void delay1ms(uint x)
{
uchr i;
uint j;
for(j=0;j<x;j++)
for(i=0;i<110;i++);
}
void delaynus()
{
_nop_();
_nop_();
_nop_();
}
void Wcom16(uchr com) //1602D′Ö¸áî
{
RS=0;
RW=0;
P2=com;
EN=1;
delay1ms(5);
EN=0;
}
void Wdat16(uchr dat)
{
RS=1;
RW=0;
P2=dat;
EN=1;
delay1ms(5);
EN=0;
}
void Init16()
{
EN=1;
Wcom16(0x38);
Wcom16(0x0c);
Wcom16(0x06);
Wcom16(0x01);
}
void lcdtest()
{
Wcom16(0x80);
Wdat16('t');
Wdat16('e');
Wdat16('s');
Wdat16('t');
Wdat16('!');
}
/************************************
I2C2¿·Ö
*************************************/
void I2cStart()
{
SDA=1;
SCL=1;// è·±£SDAoíSCLÎa1
delaynus();
SDA=0;
delaynus();
SCL=0;
}
void I2cStop()
{
SCL=0; //ê×Ïèè·±£SDAoíSCL¶¼êÇμíμçÆ½
SDA=0;
delaynus();
SCL=1; //Ïèà-¸ßSCL£¬Ôùà-¸ßSDA£»
delaynus();
SDA=1;
delaynus();
}
bit I2cWrite(uchr dat) //¸ßλÔúǰ£¬μíλÔúoó
{
bit ask;
uchr i;
for(i=0x80;i!=0;i>>=1)
{
if((dat&i)==0)
SDA=0;
else
SDA=1;
delaynus();
SCL=1;
delaynus();
SCL=0;
}
SDA=1;
delaynus();
SCL=1;
delaynus();
ask=SDA;
delaynus();
SCL=0;
return (~ask);
}
uchr I2cReadN() //I2c×üÏß¶á2ù×÷£¬2¢·¢Ëí·Çó|′eDÅoÅ
{
uchr mask;
uchr dat;
SDA=1;
for(mask=0x80;mask!=0;mask>>=1)
{
delaynus();
SCL=1;
if(SDA==0)
dat&=~mask;
else
dat|=mask; //Îa1ê±£¬datÖD¶Ôó|λÖÃ1
delaynus();
SCL=0;
}
SDA=1; //8λêy¾Y·¢Ëííêoó£¬à-¸ßSDA£¬·¢Ëí·Çó|′eDÅoÅ
delaynus();
SCL=1;
delaynus();
SCL=0;
return dat;
}
uchr I2cReadA() //I2c×üÏß¶á2ù×÷£¬2¢·¢Ëíó|′eDÅoÅ
{
uchr mask;
uchr dat;
SDA=1;
for(mask=0x80;mask!=0;mask>>=1)
{
delaynus();
SCL=1;
if(SDA==0)
dat&=~mask;
else
dat|=mask; //Îa1ê±£¬datÖD¶Ôó|λÖÃ1
delaynus();
SCL=0;
}
SDA=0; //8λêy¾Y·¢Ëííêoó£¬à-¸ßSDA£¬·¢Ëíó|′eDÅoÅ
delaynus();
SCL=1;
delaynus();
SCL=0;
return dat;
}
void PrintError1()
{
uchr i;
Wcom16(0x80);
for(i=0;i<16;i++)
{
Wdat16(error1a);
delay1ms(5);
}
Wcom16(0xc0);
for(i=0;i<16;i++)
{
Wdat16(error1b);
delay1ms(5);
}
}
uchr GetadcNum(uchr chn)
{
uchr num=3;
I2cStart();
if(!I2cWrite(0x90))
{
PrintError1();
I2cStop();
return 0;
}
I2cWrite(0x40|chn);
I2cStart();
I2cWrite(0x91);
I2cReadA();
num=I2cReadN();
I2cStop();
return num;
}
void NumtoStr(uchr *p,uchr num)
{
num=(num*50)/255; //òto¬ò»Î»ê®½øÖÆD¡êy
p[0]=(num/10)+'0'; //Õûêy2¿·Ö
p[1]='.'; //D¡êyμã
p[2]=(num%10)+'0';
p[3]='v';
p[4]='\0';
LcdDisstr(p);
while(1);
}
void SetT0(uint ms,uchr x,uchr mode)
{
unsigned long tmp;
tmp = x*1000000 / 12; //¶¨ê±Æ÷¼ÆêyÆμÂê
tmp = (tmp * ms) / 1000; //¼ÆËãËùDè¼ÆêyÖμ=ÿÃëÖóÆμÂê*Ãëêy£¨òaÇóμÄmsêy/1000£©
tmp = 65536 - tmp; //×°ÔØÖμ
tmp = tmp + 12; //DTÕyÖD¶ÏÏìó|Ñóê± ÖD¶Ïò»°ãÑóê±3-8¸öÖüÆú
T0RH = (unsigned char)(tmp >> 8); //×°ÔØ¼ÆêyÆ÷¸ßλ
T0RL = (unsigned char)tmp;
TMOD&=0xf0;
TMOD |=mode; //Ä£ê½ò»
TH0 = T0RH; //×°ÔØ3õê¼Öμ
TL0 = T0RL;
ET0 = 1; //¿at0ÖD¶Ï
TR0 = 1; //¿aê¼¼Æê±
}
void LcdDisstr(uchr *p)
{
uchr i;
Wcom16(0x80);
for(i=0;i<6;i++)
{
Wdat16(p);
delay1ms(5);
}
}
void main()
{
uchr val;
EA=1;
SetT0(10,12,0x01);
Init16();
while(1)
{
if (flag==1)
{
flag = 0;
val = GetadcNum(0); //¶áè¡í¨μà0μÄÖμ
NumtoStr(str1, val); //½«Öμ×aÎa×Ö·û′®
LcdDisstr(str1);
}
}
}
void timer1 () interrupt 1
{
TH0=T0RH;
TL0=T0RL;
Intime++;
if(Intime>=30)
{
Intime=0;
flag=1;
}
}
哪位大神看看下,谢谢了!!!
这是仿真的硬件连接
|