ADDA系列PCF8591的驱动程序(带详细注释)
- 格式:doc
- 大小:44.00 KB
- 文档页数:6
pcf8591setup用法pcf8591是一种数字模拟转换器(DAC)和模数转换器(ADC)的集成电路(IC)。
它可以通过I2C总线与微控制器(MCU)或单片机进行通信,实现模拟信号的输入和输出。
在本文中,我将详细介绍如何设置并使用pcf8591。
第一步是硬件连接。
将pcf8591连接到MCU或单片机的I2C总线上。
连接需要使用四个引脚:VCC(引脚28)、GND(引脚27)、SDA(引脚26)和SCL (引脚25)。
将VCC引脚连接到+5V电源,将GND引脚连接到地线,然后将SDA引脚连接到MCU的SDA引脚,将SCL引脚连接到MCU的SCL引脚。
第二步是软件配置。
在使用pcf8591之前,您需要确保MCU上的I2C总线已经设置好并且可以正常工作。
如果您正在使用Arduino,可以在其官方网站上找到有关I2C总线设置和库的信息。
如果您正在使用其他MCU或单片机,可以参考其官方文档或网络资源进行设置。
第三步是编写代码。
根据您使用的MCU或单片机的编程语言,编写相应的代码来与pcf8591进行通信。
在Arduino中,可以使用Wire库来进行I2C通信。
以下是一个基本的示例代码:C++#include <Wire.h>#define PCF8591_ADDRESS 0x48 I2C地址,默认为0x48void setup() {Wire.begin(); 启动I2C总线}void loop() {Wire.beginTransmission(PCF8591_ADDRESS); 发送I2C起始信号Wire.write(0x00); 设置pcf8591的控制字节为0x00,选择模拟输入通道0 Wire.endTransmission();Wire.requestFrom(PCF8591_ADDRESS, 2); 请求读取两个字节的数据if (Wire.available() >= 2) {int analogValue = Wire.read(); 读取模拟值的低八位analogValue = Wire.read() << 8; 读取模拟值的高八位在这里可以对模拟值进行处理例如,可以将模拟值通过串口输出Serial.println(analogValue);}delay(1000); 延迟1秒钟}以上代码会设置pcf8591的控制字节为0x00,选择模拟输入通道0,并从pcf8591读取模拟值。
PCF8591程序/************************************头文件:PCF8591.h**文件名: PCF8591.c**创建人: 动车组**日期: 2012-8-8**功能描述:PCF8591_Write(uchar DAC_Date);DAC转换输出(8位的)** PCF8591_Read(uchar a[4]);四个单端输入ADC数据(8位的)**占用资源:IIC的两个IO口IIc_Scl、IIc_Sad***********************************/#include"PCF8591.h"#include <intrins.h>#define _NOP_() _nop_();_nop_();_nop_();_nop_();_nop_()/*短暂延时4.7us*//*停止I2C总线*/void IIc_stop(){IIc_Sad = 0;_NOP_();IIc_Scl = 1;_NOP_();IIc_Sad = 1; //总线置于空闲状态}/*IIC初始化子程序*/void IIc_init(){IIc_stop(); //结束之前IIC的操作IIc_Scl = 1; //总线置于空闲状态IIc_Sad = 1;}/* 启动I2C总线*/void IIc_start(){IIc_Sad = 1;IIc_Scl = 1;_NOP_();IIc_Sad = 0;_NOP_();IIc_Scl = 0;}/*IIC写一个字节返回应答信号返回1设备正常*/bit IIc_write_byte(uchar date){uchar i;bit ack;for(i=8;i>0;i--){date <<= 1;IIc_Scl = 0;IIc_Sad = CY;_NOP_();IIc_Scl = 1;_NOP_();}IIc_Scl = 0;_NOP_();IIc_Sad = 1;/*8位发送完后释放数据线,准备接收应答位*/_NOP_();IIc_Scl = 1;if(IIc_Sad==0)//从机设备应答ack=1ack = 1;elseack = 0;IIc_Scl = 0;_NOP_();return(ack);}/*IIC读一个字节主机应答信号Master_ack为1是应答0时非应答*/ uchar IIc_read_byte(bit Master_ack){uchar i,vaule;IIc_Sad=1;for(i = 8;i > 0;i--){vaule <<= 1;IIc_Scl = 1;_NOP_();if(IIc_Sad)vaule++;IIc_Scl = 0;_NOP_();}IIc_Sad = !Master_ack;//主机应答信号_NOP_();IIc_Scl = 1;_NOP_();IIc_Scl = 0;_NOP_();return vaule;}/******************以下是PCF8591的应用函数*********************************************************//*PCF8591的控制字Con和DAC数据这个函数已经写好器件地址了/*函数返回值1写入为正常*/bit PCF8591_Write(uchar DAC_Date){bit ack;// EA=0;IIc_init();IIc_start();ack=IIc_write_byte(Address_PCF8591);//写器件地址if(ack==0) //写入失败从机设备没有相应return(0);ack=IIc_write_byte(Model_PCF8591);//写第二个字节控制字if(ack==0) //写入失败从机设备没有相应return(0);ack=IIc_write_byte(DAC_Date);//写第三个字节DAC数据if(ack==0) //写入失败从机设备没有相应return(0);IIc_stop();/*后面是读一个字节数据用来开始ADC转换的*/IIc_start();ack=IIc_write_byte(Address_PCF8591+1);//写器件地址读数据if(ack==0) //写入失败从机设备没有相应return(0);IIc_read_byte(0); //读一个数据开始ADC转换这个数据没用哦IIc_stop();return(1);// EA=1;}/*从PCF8591中读出四个ADC通道的数据返回1从机设备正常*/bit PCF8591_Read(uchar a[]){bit ack;IIc_init();IIc_start();ack= IIc_write_byte(Address_PCF8591+1);if(ack==0) //写入失败从机设备没有相应return(0);a[0] = IIc_read_byte(1);a[1] = IIc_read_byte(1);a[2] = IIc_read_byte(1);a[3] = IIc_read_byte(0);IIc_stop();return (1);}/************************************//************************************文件名: PCF8591.h**创建人: 动车组**日期: 2012-8-8**功能描述:PCF8591_Write(uchar DAC_Date);DAC转换输出(8位的)** PCF8591_Read(uchar a[4]);四个单端输入ADC数据(8位的)**占用资源:IIC的两个IO口IIc_Scl、IIc_Sad***********************************/#ifndef __PCF8591_H__#define __PCF8591_H__#include <REG52.H>#define uchar unsigned char#define uint unsigned intsbit IIc_Scl=P1^5; //IIC的时钟sbit IIc_Sad=P3^6; //IIC的数据线#define Address_PCF8591 0x90 //PCF8591的硬件地址#define Model_PCF8591 0x44 //模式是四个ADC单端输入允许DAC输出允许自动增量/*PCF8591的DAC数据;函数返回值1写入为正常*/bit PCF8591_Write(uchar DAC_Date);/*从PCF8591中读出四通道的数据返回1从机设备正常*/bit PCF8591_Read(uchar a[4]);//a[]的长度必须大于等于4#endif/******************************/#include <REG52.H>#include"PCF8591.h"#include"LCD1602.h"void main(){uchar i;uchar temp[4];L1602_init();PCF8591_Write(127);PCF8591_Write(200);while(1){PCF8591_Write(i++);if(1){PCF8591_Read(temp);L1602_Uint(1,2,temp[0]);L1602_Uint(1,7,temp[1]);L1602_Uint(2,1,temp[2]);L1602_Uint(2,7,temp[3]);}elseL1602_Uint(2,2,1);}}。
2009年5月企业技术开发引脚序号引脚名称功能描述1~4AIN0~AIN3模拟信号输入端0~5V5~7A 0~A 2器件硬件地址输入端,由硬件电路决定16、8VDD 、VSS 电源、地9、10SDA 、SCL I 2C 总线的数据线、时钟线11OSC 外部时钟输入端,内部时钟输出端12EXT 时钟选择线,EXT =0,使用内部时钟;EXT =1,使用外部时钟13AGND 模拟信号地15AOUT D/A 转换输出端,V AOUT =V AGND +V REF -V AGND2567i=0ΣD i2i基准电源端(0.6~5V ),取值大小影响D/A 转换输出电压。
当取值等于为VDD 时,输出电压为0~5V 。
14V REF表1PCF8591引脚功能描述基于PCF8591的I 2C 总线A/D 、D/A 转换陈柱峰,沈治国摘要:I 2C 总线是Philips(飞利浦)公司推出的串行总线,整个系统仅靠数据线(SDA )和时钟线(SCL )实现完善的全双工数据传输,文章介绍了具有I 2C 总线的A/D 、D/A 转换芯片PCF8591的内部结构图,引脚功能,A/D 、D/A 转换的控制方法,给出了A/D 、D/A 转换的软件编程的流程图和实例。
关键词:I 2C 总线;PCF8591;A/D 、D/A 转换中图分类号:TN792文献标识码:A文章编号:1006-8937(2009)09-0018-04Abstract:I 2C bus is the serial bus that Philips has introduced,the whole system of relying on the data line (SDA)and clock line (SCL)to achieve a comprehensive,full-duplex data transmission,introduced in this paper with I 2C Bus A/D 、D/A conversion chip PCF8591internal structure diagram,pin functions,A/D 、D/A conversion control methods,gave the A/D 、D/A conversion software programming flow chart and examples.Keywords :I 2C bus ;PCF8591;A/D 、D/A conversion (湖南现代物流职业技术学院物流工程系,湖南长沙410131)The I 2C bus A /D 、D /A conversion based on PCF8591CHEN Zhu-feng ,SHEN Zhi-guo(DepartmentofLogisticsEngineering,HunanVocationalandTechnicalCollegeofModernLogisticsEngineering,Changsha,Hunan410131,China)收稿日期:2009-01-30作者简介:陈柱峰(1973—),男,湖南长沙人,大学本科,助理试验师,主要从事电力电子技术方面的教学和科研工作。
PCF8591 8位A/D和D/A转换器1、特性z单电源供电z工作电压:2.5 V ~ 6 Vz待机电流低z I2C总线串行输入/输出z通过3个硬件地址引脚编址z采样速率取决于I2C总线速度z4个模拟输入可编程为单端或差分输入z自动增量通道选择z模拟电压范围:VSS~VDDz片上跟踪与保持电路z8位逐次逼近式A/D转换z带一个模拟输出的乘法DAC2、应用z闭环控制系统z用于远程数据采集的低功耗转换器z电池供电设备z在汽车、音响和TV应用方面的模拟数据采集3、概述PCF8591是单片、单电源低功耗8位CMOS数据采集器件,具有4个模拟输入、一个输出和一个串行I2C总线接口。
3个地址引脚A0、A1和A2用于编程硬件地址,允许将最多8个器件连接至I2C 总线而不需要额外硬件。
器件的地址、控制和数据通过两线双向I2C总线传输。
器件功能包括多路复用模拟输入、片上跟踪和保持功能、8位模数转换和8位数模拟转换。
最大转换速率取决于I2C总线的最高速率。
4、订货信息5、内部框图图1 内部框图6、引脚图2 引脚图 (DIP16).7、功能描述7.1 地址I2C总线系统中的每一片PCF8591通过发送有效地址到该器件来激活。
该地址包括固定部分和可编程部分。
可编程部分必须根据地址引脚A0、A1和A2来设置。
在I2C总线协议中地址必须是起始条件后作为第一个字节发送。
地址字节的最后一位是用于设置以后数据传输方向的读/写位。
(见图4、16、17)图4 地址7.2 控制字发送到PCF8591的第二个字节将被存储在控制寄存器,用于控制器件功能。
控制寄存器的高半字节用于允许模拟输出,和将模拟输入编程为单端或差分输入。
低半字节选择一个由高半字节定义的模拟输入通道(见图5)。
如果自动增量(auto-increment)标志置1,每次A/D转换后通道号将自动增加。
如果自动增量(auto-increment)模式是使用内部振荡器的应用中所需要的,那么控制字中模拟输出允许标志应置1。
微软通用音频架构UAA总线驱动声卡安装注意请严格按照顺序安装先安装微软通用音频架构UAA总线驱动再安装声卡驱动程序ftp:///pub/softpaq/sp33501-34000/sp33867.exe ·声卡此款机器系统会识别出两个总线上的音频设备为保证您的系统运行的稳定性分别完成步骤一和步骤二对应指定避免出现蓝屏或花屏情况。
步骤一安装下面的任意一个程序如果无法安装可以使用下面的手动方式安装ftp:///pub/softpaq/sp46501-47000/sp46981.exe 或ftp:///pub/softpaq/sp38501-39000/sp38558.exe 声卡驱动安装要点1、安装声卡驱动程序之前要首先安装声卡UAA总线驱动程序2、将附加中声卡先解压缩3、到设备管理器中点击Audio Device on High Definition Audio Bus总线上的音频设备右键更新驱动程序4、在硬件更新向导中选择从列表或指定位置安装高级5、下一步选择不要搜索。
我要自己选择要安装的驱动程序6、下一步在硬件类型中选择声音、视频和游戏控制器7、下一步选择从磁盘安装后点击浏览将路径指向解压文件夹8、找到_WDMWinxpSTHDA.inf_驱动文件双击-确定打开“下一步”会出现更新驱动程序警告不要理会该提示继续安装。
安装完成后声卡设备正常工作。
按照步骤一安装完声卡驱动如果还有Audio Device on High Definition Audio Bus总线上的音频设备请执行步骤二。
步骤二请鼠标左键双击另一个总线上的音频设备选择详细信息的标签如果看到有VEN_10DE 字样如果没看到请执行步骤一请您按照以下步骤操作声卡驱动安装要点1、安装声卡驱动程序之前要首先安装声卡UAA总线驱动程序2、将HDAudio-nvidia-hdmi.rar 先解压缩https:///portal/site/hpsc/template.BINARYPORTLET/public/fm/m ain/resource.process/javax.portlet.tpstb0531e1d3b5c65fef3ac2335b053ce01_ws_BIjavax. portlet.prp_b0531e1d3b5c65fef3ac2335b053ce01wsrp-navigationalState3Daction25253 Dthreadview25257Cboardid25253D28925257Cthreadid25253D182336javax.portlet.rst_ b0531e1d3b5c65fef3ac2335b053ce01wsrp-navigationalState3Daction25253Dthreadview 25257Cboardid25253D28925257Cthreadid25253D18233626wsrp-resourceState3Dreplyi d253D1204855257Caction253Dthreadview257Cboardid253D289257Cthreadid253D182 336javax.portlet.rid_b0531e1d3b5c65fef3ac2335b053ce01replyattachmentjavax.portlet.r cl_b0531e1d3b5c65fef3ac2335b053ce01cacheLevelPagejavax.portlet.begCacheTokcom. vignette.cachetokenjavax.portlet.pbp_bb2cff48bc11a5fef3ac2335b053ce01boardid3D289 javax.portlet.pbp_fd292725ea4036fef3ac2335b053ce01boardid3D289javax.portlet.pbp_1 1f72c6d647516fef3ac2335b053ce01boardid3D289javax.portlet.endCacheTokcom.vignet te.cachetoken 来源于HP技术论坛网友总结链接很长请将此链接复制到浏览器地址栏下载3、到设备管理器中点击Audio Device on High Definition Audio Bus总线上的音频设备右键更新驱动程序4、在硬件更新向导中选择从列表或指定位置安装高级5、下一步选择不要搜索。
基于51单片机用PCF8591进行AD,DA转换用1602LCD显示的电流采样福州大学至诚学院本科生课程设计题目: 可编程序控制器实训姓名: 学号:系别:专业:年级: 指导教师:目录1、PCF8591概述 .....................................................3 2、芯片介绍.........................................................3 3、PCF8591的A/D 转换...............................................4 4、A/D转换程序设计流程 .............................................5 5、1602LCD主要技术参数 .............................................7 6、Proteus仿真原理图 . (10)7、程序代码........................................................108、结语............................................................17 9、参考文献.. (17)21、PCF8591 概述PCF8591 是一种具有 I2C 总线接口的 8 位 A/D D/A 转换芯片,在与 CPU的信息传输过程中仅靠时钟线 SCL 和数据线 SDA 就可以实现。
I2C 总线是Philips (飞利浦)公司推出的串行总线,它与传统的通信方式相比具有读写方便,结构简单,可维护性好,易实现系统扩展,易实现模块化标准化设计,可靠性高等优点。
2、芯片介绍2.1内部结构及引脚功能描述PCF8591 为单一电源供电(2.5 6 V)典型值为 5 V,CMOS 工艺 PCF8591 有 4 路 8 位 A/D 输入,属逐次比较型,内含采样保持电路; 1 路 8 位 D/A 输出,内含有 DAC的数据寄存器 A/D D/A 的最大转换速率约为 11 kHz,但是转换的基准电源需由外部提供 PCF8591 的引脚功能如图1所示图1 PCF8591引脚功能2.2片内可编程功能设置在 PCF8591 内部的可编程功能控制字有两个,一个为地址选择字,另一个为转换控制字 PCF8591 采用典型的I2C总线接口的器件寻址方法,即总线地址由器件地址引脚地址和方向位组成 Philips (飞利浦)公司规定 A/D器件高四位地址为1001,低三位地址为引脚地址A0A1A2,由硬件电路决定,地址选择字格式具体描述如表2 所示因此 I2C 系统中最多可接 23=8 个具有总线接口的 A/D 器件地址的最后一位为方向位 R/W,当主控器对 A/D 器件进行读操作时为 1,进行写操作时为 0 总线。
ADDA系列PCF8591的驱动程序(带详细注释)/*************************此部分为I2C总线的驱动程序*************************************/#include<reg52.h>#include <intrins.h>#include <I2C.H>#define NOP() _nop_() /* 定义空指令*/#define _Nop() _nop_() /*定义空指令*/sbit SCL=P2^0; //I2C 时钟sbit SDA=P2^1; //I2C 数据bit ack; /*应答标志位*//*******************************************************************起动总线函数函数原型: void Start_I2c();功能: 启动I2C总线,即发送I2C起始条件.********************************************************************/void Start_I2c(){SDA=1; /*发送起始条件的数据信号*/_Nop();SCL=1;_Nop(); /*起始条件建立时间大于4.7us,延时*/_Nop();_Nop();_Nop();_Nop();SDA=0; /*发送起始信号*/_Nop(); /* 起始条件锁定时间大于4μs*/_Nop();_Nop();_Nop();_Nop();SCL=0; /*钳住I2C总线,准备发送或接收数据*/_Nop();_Nop();}/*******************************************************************结束总线函数函数原型: void Stop_I2c();功能: 结束I2C总线,即发送I2C结束条件.********************************************************************/void Stop_I2c(){SDA=0; /*发送结束条件的数据信号*/_Nop(); /*发送结束条件的时钟信号*/SCL=1; /*结束条件建立时间大于4μs*/_Nop();_Nop();_Nop();_Nop();_Nop();SDA=1; /*发送I2C总线结束信号*/_Nop();_Nop();_Nop();_Nop();}/*******************************************************************字节数据发送函数函数原型: void SendByte(UCHAR c);功能: 将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对此状态位进行操作.(不应答或非应答都使ack=0)发送数据正常,ack=1; ack=0表示被控器无应答或损坏。
********************************************************************/void SendByte(unsigned char c){unsigned char BitCnt;for(BitCnt=0;BitCnt<8;BitCnt++) /*要传送的数据长度为8位*/ {if((c<<BitCnt)&0x80)SDA=1; /*判断发送位*/else SDA=0;_Nop();SCL=1; /*置时钟线为高,通知被控器开始接收数据位*/_Nop();_Nop(); /*保证时钟高电平周期大于4μs*/_Nop();_Nop();_Nop();SCL=0;}_Nop();_Nop();SDA=1; /*8位发送完后释放数据线,准备接收应答位*/_Nop();_Nop();SCL=1;_Nop();_Nop();_Nop();if(SDA==1)ack=0;else ack=1; /*判断是否接收到应答信号*/SCL=0;}/*******************************************************************字节数据接收函数函数原型: UCHAR RcvByte();功能: 用来接收从器件传来的数据,并判断总线错误(不发应答信号),发完后请用应答函数应答从机。
********************************************************************/unsigned char RcvByte(){unsigned char retc;unsigned char BitCnt;retc=0;SDA=1; /*置数据线为输入方式*/for(BitCnt=0;BitCnt<8;BitCnt++){_Nop();SCL=0; /*置时钟线为低,准备接收数据位*/_Nop();_Nop(); /*时钟低电平周期大于4.7μs*/_Nop();_Nop();_Nop();SCL=1; /*置时钟线为高使数据线上数据有效*/_Nop();_Nop();retc=retc<<1;if(SDA==1)retc=retc+1; /*读数据位,接收的数据位放入retc中*/_Nop();_Nop();}SCL=0;_Nop();_Nop();return(retc);}/********************************************************************应答子函数函数原型: void Ack_I2c(bit a);功能: 主控器进行应答信号(可以是应答或非应答信号,由位参数a决定)********************************************************************/void Ack_I2c(bit a){if(a==0)SDA=0; /*在此发出应答或非应答信号*/else SDA=1;_Nop();SCL=1;_Nop();_Nop(); /*时钟低电平周期大于4μs*/_Nop();_Nop();_Nop();SCL=0; /*清时钟线,钳住I2C总线以便继续接收*/_Nop();_Nop();}#include<reg52.h>#include <I2C.H>#define PCF8591 0x90 //PCF8591 地址//else IOsbit LS138A=P2^2;sbit LS138B=P2^3;sbit LS138C=P2^4;//此表为LED 的字模, 共阴数码管0-9 -unsigned char code Disp_Tab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};unsigned char AD_CHANNEL;unsigned long xdata LedOut[8];unsigned int D[32];/*******************************************************************DAC 变换, 转化函数*******************************************************************/bit DAC conversion(unsigned char sla,unsigned char c, unsigned char Val){Start_I2c(); //启动总线SendByte(sla); //发送器件地址if(ack==0)return(0);SendByte(c); //发送控制字节if(ack==0)return(0);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);SendByte(c); //发送数据if(ack==0)return(0);Stop_I2c(); //结束总线return(1);}/*******************************************************************ADC读字节数据函数*******************************************************************/unsigned char IRcvByte(unsigned char sla){ unsigned char c;Start_I2c(); //启动总线SendByte(sla+1); //发送器件地址,地址加一的原因是地址字的最后一位0为写,1为读if(ack==0)return(0);c=RcvByte(); //读取数据0Ack_I2c(1); //发送非就答位Stop_I2c(); //结束总线return(c);}//******************************************************************/main(){ char i,j;while(1){/********以下AD-DA处理*************/switch(AD_CHANNEL){case 0: ISendByte(PCF8591,0x41);D[0]=IRcvByte(PCF8591)*2; //ADC0 模数转换1,乘以2的原因是把结果00~0xff换算成0~510,除以100就是实际采样值了break;case 1: ISendByte(PCF8591,0x42);D[1]=IRcvByte(PCF8591)*2; //ADC1 模数转换2break;case 2: ISendByte(PCF8591,0x43);D[2]=IRcvByte(PCF8591)*2; //ADC2 模数转换3break;case 3: ISendByte(PCF8591,0x40);D[3]=IRcvByte(PCF8591)*2; //ADC3 模数转换4break;case 4: DACconversion(PCF8591,0x40, D[4]/4); //DAC 数模转换break;}// D[4]=400; //数字--->>模拟输出D[4]=D[3];if(++AD_CHANNEL>4) AD_CHANNEL=0;/********以下将AD的值送到LED数码管显示*************/LedOut[0]=Disp_Tab[D[1]%10000/1000];LedOut[1]=Disp_Tab[D[1]%1000/100];LedOut[2]=Disp_Tab[D[1]%100/10]|0x80;LedOut[3]=Disp_Tab[D[1]%10];LedOut[4]=Disp_Tab[D[0]%10000/1000];LedOut[5]=Disp_Tab[D[0]%1000/100];LedOut[6]=Disp_Tab[D[0]%100/10]|0x80;LedOut[7]=Disp_Tab[D[0]%10];for( i=0; i<8; i++){ P1 = LedOut[i];switch(i) //使用switch 语句控制138译码器也可以是用查表的方式学员可以试着自己修改{case 0:LS138A=0; LS138B=0; LS138C=0; break;case 1:LS138A=1; LS138B=0; LS138C=0; break;case 2:LS138A=0; LS138B=1; LS138C=0; break;case 3:LS138A=1; LS138B=1; LS138C=0; break;case 4:LS138A=0; LS138B=0; LS138C=1; break;case 5:LS138A=1; LS138B=0; LS138C=1; break;case 6:LS138A=0; LS138B=1; LS138C=1; break;case 7:LS138A=1; LS138B=1; LS138C=1; break;}for (j = 0 ; j<90 ;j++) { ;} //扫描间隔时间}P1 = 0;}}。