如果只用这种LCD智能显示终端显示AD值那就真是大才小用,白浪费了,
其实这里用于显示只是为了测试方便,在产品中可把AD结合用,AD只是小部份一个功能
费白少说了,开始说学习过程吧`
AD用的是PCF8591,包函有AD和DA功能~,让我最大感触的就是~在用内部晶振时EXT 12脚改须接地,还测会受干扰非常大,或者直接用不了,我在这花了好多时间呢~另外就是当单用一个通信时,指令选择是正确的,如通道1即是0x40,通道4则时0x43,而两个通道以上一起用就不一样了,指令要向后推一个周期,如我四条通道一起用,则第1通道0x41,第四通道即是0x40了,会不一样.
PCF8591是IIC总线通信,IIC通信我就不说了,都玩透啦~直接说主代码吧
bit DACconversion(unsigned char sla,unsigned char c, unsigned char Val)
{
Start_I2c(); //启动总线
SendByte(sla); //发送器件地址
if(ack==0)return(0);
//delay(1);
SendByte(c); //发送控制字节
if(ack==0)return(0);
//delay(1);
SendByte(Val); //发送DAC的数值
if(ack==0)return(0);
Stop_I2c(); //结束总线
return(1);
}
/*******************************************************************
ADC发送字节[命令]数据函数
*******************************************************************/
bit ISendByte(unsigned char sla,unsigned char c)
{
Start_I2c(); //启动总线
SendByte(sla); //发送器件地址
if(ack==0)return(0);
//delay(5); //增加延时2ms
SendByte(c); //发送数据
if(ack==0)return(0);
//delay(5); //增加延时2ms
Stop_I2c(); //结束总线
return(1);
}
/*******************************************************************
ADC读字节数据函数
*******************************************************************/
unsigned char IRcvByte(unsigned char sla)
{ unsigned char c;
Start_I2c(); //启动总线
SendByte(sla+1); //发送器件地址
if(ack==0)return(0);
//delay(5); //增加延时2ms
c="RcvByte"(); //读取数据0
//delay(5); //增加延时2ms
Ack_I2c(1); //发送非就答位
Stop_I2c(); //结束总线
return(c);
}
在main函数则可直接搞用
void main(void)
{
uchar i;
AUXR = 0x02; //禁止内部RAM
IT1 = 0; //外部中断1为电平触发方式。
EA=1; //全局中断使能,(EA=0,关全局中断;EA=1,开全局中断)
EX1 = 1; //外部中断使能置1,允许外部中断
CS0 = 0;
PINT = 1;
Fcolor = 0x0;
//Bcolor = 0xff;//白色背影
Bcolor = 0xdb;//原背影图片颜色做背景
i = 0;
P1=0x00;
P2=0xFF;
while(!(i == 0xF0))
{
i = Read_Byte();
}
P2=0x00;
Lcd_Clr(); //清除全屏。
DIS_BMP(0,0,0);//(x,y,图1)显示位图子程序
DIS_String(100,68,"广州微嵌计算机科技有限公司");
DIS_String(100,68+16,"AD1:");
DIS_String(100,68+32,"AD2:");
DIS_String(100,68+48,"AD3:");
DIS_String(100,68+62,"AD4:");
while(1)
{
switch(AD_CHANNEL)
{
case 0:
ISendByte(PCF8591,0x41);
D[0]=IRcvByte(PCF8591)*2; //ADC2 模数转换1
break;
case 1:
ISendByte(PCF8591,0x42);
D[1]=IRcvByte(PCF8591)*2; //ADC2 模数转换2
break;
case 2:
ISendByte(PCF8591,0x43);
D[2]=IRcvByte(PCF8591)*2; //ADC2 模数转换3
break;
case 3:
ISendByte(PCF8591,0x40);
D[3]=IRcvByte(PCF8591)*2; //ADC2 模数转换4
break;
default:
break;
}
//delay(5); //增加延时2ms
DACconversion(PCF8591,0x40, D[2]/4); //DAC 数模转换
if(++AD_CHANNEL>3)
AD_CHANNEL=0;
DIS_Value(100+80,68+16,D[0],3);
DIS_Value(100+80,68+32,D[1],3);
DIS_Value(100+80,68+48,D[2],3);
DIS_Value(100+80,68+62,D[3],3);
}
}
广州市微嵌计算机科技有限公司
http://www.qxlcd.com/
Email:zhqf@qxlcd.com
地 址: 广州科学城彩频路11号广东软件园B栋301M室
联系人:张权锋 电话:020-32206277 传真:020-62824100
用户297006 2010-4-30 10:18