⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pcf8591.lst

📁 RZ-51V20 实例程序
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V8.02   PCF8591                                                               12/31/2009 10:21:57 PAGE 1   


C51 COMPILER V8.02, COMPILATION OF MODULE PCF8591
OBJECT MODULE PLACED IN PCF8591.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE PCF8591.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          
   2          //-----------------------函数声明,变量定义------------------------
   3          #include <reg51.h>
   4          #include <intrins.h>
   5          sbit SCL=P1^2;                   // 将p1.2口模拟时钟口
   6          sbit SDA=P1^3;                   // 将p1.3口模拟数据口
   7          bit askflag;
   8          
   9          #define uchar unsigned char
  10          #define uint  unsigned int
  11          #define disdata  P0              //显示数据码输出口
  12          
  13          sbit LCD_RS = P2^0;             
  14          sbit LCD_RW = P2^1;
  15          sbit LCD_EN = P2^2;
  16          
  17          uint data dis[4]={0x00,0x00,0x00,0x00}; 
  18                                    //定义3个显示数据单元和1个数据存储单元
  19          
  20          uchar code dis4[] = {"1- .  V  2- .  V"};
  21          uchar code dis5[] = {"3- .  V  4- .  V"};
  22          
  23          
  24          #define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};
  25                                   
  26          bit   bdata SystemError;                //从机错误标志位
  27          
  28          /*********************** PCF8591专用变量定义 ***********************/
  29          
  30          #define PCF8591_WRITE   0x90
  31          #define PCF8591_READ    0x91
  32          #define  NUM  4                     //接收和发送缓存区的深度
  33          uchar idata receivebuf[NUM];    //数据接收缓冲区
  34          
  35          /*******************************************************************/
  36          /*                                                                 */
  37          /*  延时函数                                                       */
  38          /*                                                                 */
  39          /*******************************************************************/
  40          
  41          void delay(int ms)
  42          {
  43   1          while(ms--)
  44   1              {
  45   2            uchar i;
  46   2                for(i=0;i<250;i++)  
  47   2                 {
  48   3                  _nop_();                       
  49   3                      _nop_();
  50   3                      _nop_();
  51   3                      _nop_();
  52   3                 }
  53   2              }
  54   1      }               
  55          
C51 COMPILER V8.02   PCF8591                                                               12/31/2009 10:21:57 PAGE 2   

  56          /*******************************************************************/
  57          /*                                                                 */
  58          /*检查LCD忙状态                                                    */
  59          /*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据。      */
  60          /*                                                                 */
  61          /*******************************************************************/ 
  62          
  63          bit lcd_busy()
  64           {                          
  65   1          bit result;
  66   1          LCD_RS = 0;
  67   1          LCD_RW = 1;
  68   1          LCD_EN = 1;
  69   1          delayNOP();
  70   1          result = (bit)(P0&0x80);
  71   1          LCD_EN = 0;
  72   1          return(result); 
  73   1       }
  74          
  75          /*******************************************************************/
  76          /*                                                                 */
  77          /*写指令数据到LCD                                                  */
  78          /*RS=L,RW=L,E=高脉冲,D0-D7=指令码。                             */
  79          /*                                                                 */
  80          /*******************************************************************/
  81          
  82          void lcd_wcmd(uchar cmd)
  83          
  84          {                          
  85   1         while(lcd_busy());
  86   1          LCD_RS = 0;
  87   1          LCD_RW = 0;
  88   1          LCD_EN = 0;
  89   1          _nop_();
  90   1          _nop_(); 
  91   1          P0 = cmd;
  92   1          delayNOP();
  93   1          LCD_EN = 1;
  94   1          delayNOP();
  95   1          LCD_EN = 0;  
  96   1      }
  97          
  98          /*******************************************************************/
  99          /*                                                                 */
 100          /*写显示数据到LCD                                                  */
 101          /*RS=H,RW=L,E=高脉冲,D0-D7=数据。                               */
 102          /*                                                                 */
 103          /*******************************************************************/
 104          
 105          void lcd_wdat(uchar dat)
 106          {                          
 107   1         while(lcd_busy());
 108   1          LCD_RS = 1;
 109   1          LCD_RW = 0;
 110   1          LCD_EN = 0;
 111   1          P0 = dat;
 112   1          delayNOP();
 113   1          LCD_EN = 1;
 114   1          delayNOP();
 115   1          LCD_EN = 0; 
 116   1      }
 117          
C51 COMPILER V8.02   PCF8591                                                               12/31/2009 10:21:57 PAGE 3   

 118          /*******************************************************************/
 119          /*                                                                 */
 120          /*  LCD初始化设定                                                  */
 121          /*                                                                 */
 122          /*******************************************************************/
 123          
 124          void lcd_init()
 125          { 
 126   1          delay(15);                   
 127   1          lcd_wcmd(0x38);      //16*2显示,5*7点阵,8位数据
 128   1          delay(5);
 129   1          lcd_wcmd(0x38);         
 130   1          delay(5);
 131   1          lcd_wcmd(0x38);         
 132   1          delay(5);
 133   1      
 134   1          lcd_wcmd(0x0c);      //显示开,关光标
 135   1          delay(5);
 136   1          lcd_wcmd(0x06);      //移动光标
 137   1          delay(5);
 138   1          lcd_wcmd(0x01);      //清除LCD的显示内容
 139   1          delay(5);
 140   1      }
 141          
 142          /*******************************************************************/
 143          /*                                                                 */
 144          /*  设定显示位置                                                   */
 145          /*                                                                 */
 146          /*******************************************************************/
 147          
 148          void lcd_pos(uchar pos)
 149          {                          
 150   1        lcd_wcmd(pos | 0x80);  //数据指针=80+地址变量
 151   1      }
 152          
 153          /******************************************************************/
 154          /*                                                                */
 155          /* 数据处理与显示                                                 */
 156          /* 将采集到的数据进行16进制转换为ASCLL码。                        */
 157          /*                                                                */
 158          /******************************************************************/
 159          
 160          show_value(uchar ad_data)
 161          
 162          {   
 163   1          dis[2]=ad_data/51;   //AD值转换为3为BCD码,最大为5.00V。
 164   1          dis[2]=dis[2]+0x30;  //转换为ACSII码
 165   1          dis[3]=ad_data%51;   //余数暂存
 166   1          dis[3]=dis[3]*10;    //计算小数第一位
 167   1          dis[1]=dis[3]/51;
 168   1          dis[1]=dis[1]+0x30;  //转换为ACSII码
 169   1          dis[3]=dis[3]%51;
 170   1          dis[3]=dis[3]*10;    //计算小数第二位
 171   1          dis[0]=dis[3]/51;                                                                             //
 172   1          dis[0]=dis[0]+0x30;  //转换为ACSII码           
 173   1      } 
 174          //-------------------------------------------------------------------
 175          // 函数名称: iic_start()
 176          // 函数功能: 启动I2C总线子程序
 177          //-------------------------------------------------------------------
 178          void iic_start(void)
 179          { //时钟保持高,数据线从高到低一次跳变,I2C通信开始
C51 COMPILER V8.02   PCF8591                                                               12/31/2009 10:21:57 PAGE 4   

 180   1              SDA = 1;     
 181   1              SCL = 1;
 182   1              delayNOP();      // 延时5us 
 183   1              SDA = 0;
 184   1              delayNOP();
 185   1          SCL = 0;
 186   1      }
 187          //-------------------------------------------------------------------
 188          // 函数名称: iic_stop()
 189          // 函数功能: 停止I2C总线数据传送子程序
 190          //-------------------------------------------------------------------
 191          void iic_stop(void)
 192          {       
 193   1              SDA = 0;           //时钟保持高,数据线从低到高一次跳变,I2C通信停止
 194   1              SCL = 1;
 195   1              delayNOP();
 196   1              SDA = 1;
 197   1              delayNOP();
 198   1          SCL = 0;
 199   1      }
 200          //------------------------------------------------------------------
 201          // 函数名称: iicInit_()
 202          // 函数功能: 初始化I2C总线子程序
 203          //------------------------------------------------------------------
 204           void iicInit(void)
 205             {
 206   1         SCL = 0;
 207   1         iic_stop();  
 208   1         }  
 209          //-------------------------------------------------------------------
 210          // 函数名称: slave_ACK
 211          // 函数功能: 从机发送应答位子程序
 212          //-------------------------------------------------------------------
 213          void slave_ACK(void)
 214          {
 215   1              SDA = 0;  
 216   1              SCL = 1;
 217   1              delayNOP();     
 218   1              SCL = 0;
 219   1      }
 220          //-------------------------------------------------------------------
 221          // 函数名称: slave_NOACK
 222          // 函数功能: 从机发送非应答位子程序,迫使数据传输过程结束
 223          //-------------------------------------------------------------------
 224          void slave_NOACK(void)
 225          { 
 226   1              SDA = 1;
 227   1              SCL = 1;
 228   1              delayNOP();
 229   1              SDA = 0;
 230   1          SCL = 0;  
 231   1      }
 232          //-------------------------------------------------------------------
 233          // 函数名称: check_ACK
 234          // 函数功能: 主机应答位检查子程序,迫使数据传输过程结束
 235          //-------------------------------------------------------------------
 236          void check_ACK(void)
 237          {           
 238   1          SDA = 1;        // 将p1.1设置成输入,必须先向端口写1
 239   1              SCL = 1;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -