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

📄 pcf8591-da-lcd1602-c51.lst

📁 RZ-51V20 实例程序
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V8.18   PCF8591_DA_LCD1602_C51                                                01/04/2010 16:31:41 PAGE 1   


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

line level    source

   1          #include <reg52.h>
   2          #include <intrins.h>
   3          #include <string.h>
   4          
   5          #define uchar unsigned char
   6          #define uint  unsigned int
   7          #define disdata  P0              //显示数据码输出口
   8          bit flag;
   9          sbit SCL=P1^2;                   // 将p1.0口模拟时钟口
  10          sbit SDA=P1^3;                   // 将p1.3口模拟数据口
  11          
  12          
  13          sbit LCD_RS = P2^0;
  14          sbit LCD_RW = P2^1;
  15          sbit LCD_EN = P2^2;
  16          
  17          sbit  K1   = P1^4;       
  18          sbit  K2   = P1^5;       //选择健
  19          sbit  K3   = P1^6;       //启动健
  20          sbit  K4   = P1^7;       //停止健
  21          sbit  BEEP = P3^6;       //蜂鸣器
  22          
  23          uchar code dis1[] = {"    PCF-8591    "};
  24          uchar code dis2[] = {"  DA CONVERTER  "};
  25          
  26          uchar code dis3[] = {" K2: D/A CHOOSE "};
  27          uchar code dis4[] = {"K3:ENTER K4:EXIT"};
  28          
  29          uchar code dis5[] = {"   SINE  WAVE   "};
  30          uchar code dis6[] = {"  SQUARE  WAVE  "};
  31          uchar code dis7[] = {" TRIANGLE  WAVE "};
  32          uchar code dis8[] = {" SAWTOOTH  WAVE "};
  33          
  34          bit  out1=0,out2=0,out3=0,out4=0,START=0;
  35          
  36          #define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};
  37          
  38          bit   bdata SystemError;                //从机错误标志位
  39          
  40          uchar N=0x00,k_count;
  41          /*********************** PCF8591专用变量定义 ***********************/
  42          
  43          #define PCF8591_WRITE   0x90
  44          #define PCF8591_READ    0x91
  45          #define  NUM  4                     //接收和发送缓存区的深度
  46          uchar idata receivebuf[NUM];    //数据接收缓冲区
  47          
  48          uchar  code  sin_tab[] =        //正弦波输出表
  49          {
  50               0x80,0x83,0x86,0x89,0x8D,0x90,0x93,0x96,0x99,0x9C,0x9F,0xA2,0xA5,0xA8,0xAB,0xAE,
  51               0xB1,0xB4,0xB7,0xBA,0xBC,0xBF,0xC2,0xC5,0xC7,0xCA,0xCC,0xCF,0xD1,0xD4,0xD6,0xD8,
  52               0xDA,0xDD,0xDF,0xE1,0xE3,0xE5,0xE7,0xE9,0xEA,0xEC,0xEE,0xEF,0xF1,0xF2,0xF4,0xF5,
  53               0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFD,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
  54               0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFD,0xFD,0xFC,0xFB,0xFA,0xF9,0xF8,0xF7,0xF6,
  55               0xF5,0xF4,0xF2,0xF1,0xEF,0xEE,0xEC,0xEA,0xE9,0xE7,0xE5,0xE3,0xE1,0xDF,0xDD,0xDA,
C51 COMPILER V8.18   PCF8591_DA_LCD1602_C51                                                01/04/2010 16:31:41 PAGE 2   

  56               0xD8,0xD6,0xD4,0xD1,0xCF,0xCC,0xCA,0xC7,0xC5,0xC2,0xBF,0xBC,0xBA,0xB7,0xB4,0xB1,
  57               0xAE,0xAB,0xA8,0xA5,0xA2,0x9F,0x9C,0x99,0x96,0x93,0x90,0x8D,0x89,0x86,0x83,0x80,
  58               0x80,0x7C,0x79,0x76,0x72,0x6F,0x6C,0x69,0x66,0x63,0x60,0x5D,0x5A,0x57,0x55,0x51,
  59               0x4E,0x4C,0x48,0x45,0x43,0x40,0x3D,0x3A,0x38,0x35,0x33,0x30,0x2E,0x2B,0x29,0x27,
  60               0x25,0x22,0x20,0x1E,0x1C,0x1A,0x18,0x16,0x15,0x13,0x11,0x10,0x0E,0x0D,0x0B,0x0A,
  61               0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x02,0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x00,
  62               0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,
  63               0x0A,0x0B,0x0D,0x0E,0x10,0x11,0x13,0x15,0x16,0x18,0x1A,0x1C,0x1E,0x20,0x22,0x25,
  64               0x27,0x29,0x2B,0x2E,0x30,0x33,0x35,0x38,0x3A,0x3D,0x40,0x43,0x45,0x48,0x4C,0x4E,
  65               0x51,0x55,0x57,0x5A,0x5D,0x60,0x63,0x66,0x69,0x6C,0x6F,0x72,0x76,0x79,0x7C,0x7E
  66          };
  67          
  68          /*******************************************************************/
  69          /*                                                                 */
  70          /*  延时函数                                                       */
  71          /*                                                                 */
  72          /*******************************************************************/
  73          void delayB(uchar x)    //x*0.14MS
  74           {
  75   1         uchar i;
  76   1         while(x--)
  77   1         {
  78   2           for (i=0; i<13; i++)
  79   2           { }
  80   2         }
  81   1       }
  82          
  83          /*******************************************************************/
  84          /*                                                                 */
  85          /*  延时函数                                                       */
  86          /*                                                                 */
  87          /*******************************************************************/
  88          void delay(int ms)
  89          {
  90   1          while(ms--)
  91   1              {
  92   2            uchar i;
  93   2                for(i=0;i<250;i++)
  94   2                 {
  95   3                  _nop_();
  96   3                  _nop_();
  97   3                  _nop_();
  98   3                  _nop_();
  99   3                 }
 100   2              }
 101   1      }
 102          
 103          /*******************************************************************/
 104          /*                                                                 */
 105          /*  蜂鸣器函数                                                     */
 106          /*                                                                 */
 107          /*******************************************************************/
 108          void beep()
 109           {
 110   1         uchar j;
 111   1         for (j=0;j<180;j++)
 112   1          { 
 113   2           delayB(5);
 114   2           BEEP=!BEEP;                 //BEEP取反
 115   2          } 
 116   1           BEEP=1;                    //关闭蜂鸣器
 117   1               delay(100);
C51 COMPILER V8.18   PCF8591_DA_LCD1602_C51                                                01/04/2010 16:31:41 PAGE 3   

 118   1       }
 119          
 120          
 121          /*******************************************************************/
 122          /*                                                                 */
 123          /*检查LCD忙状态                                                    */
 124          /*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据。      */
 125          /*                                                                 */
 126          /*******************************************************************/
 127          
 128          bit lcd_busy()
 129           {
 130   1          bit result;
 131   1          LCD_RS = 0;
 132   1          LCD_RW = 1;
 133   1          LCD_EN = 1;
 134   1          delayNOP();
 135   1          result = (bit)(P0&0x80);
 136   1          LCD_EN = 0;
 137   1          return(result);
 138   1       }
 139          
 140          /*******************************************************************/
 141          /*                                                                 */
 142          /*写指令数据到LCD                                                  */
 143          /*RS=L,RW=L,E=高脉冲,D0-D7=指令码。                             */
 144          /*                                                                 */
 145          /*******************************************************************/
 146          
 147          void lcd_wcmd(uchar cmd)
 148          
 149          {
 150   1         while(lcd_busy());
 151   1          LCD_RS = 0;
 152   1          LCD_RW = 0;
 153   1          LCD_EN = 0;
 154   1          _nop_();
 155   1          _nop_();
 156   1          P0 = cmd;
 157   1          delayNOP();
 158   1          LCD_EN = 1;
 159   1          delayNOP();
 160   1          LCD_EN = 0;
 161   1      }
 162          
 163          /*******************************************************************/
 164          /*                                                                 */
 165          /*写显示数据到LCD                                                  */
 166          /*RS=H,RW=L,E=高脉冲,D0-D7=数据。                               */
 167          /*                                                                 */
 168          /*******************************************************************/
 169          
 170          void lcd_wdat(uchar dat)
 171          {
 172   1         while(lcd_busy());
 173   1          LCD_RS = 1;
 174   1          LCD_RW = 0;
 175   1          LCD_EN = 0;
 176   1          P0 = dat;
 177   1          delayNOP();
 178   1          LCD_EN = 1;
 179   1          delayNOP();
C51 COMPILER V8.18   PCF8591_DA_LCD1602_C51                                                01/04/2010 16:31:41 PAGE 4   

 180   1          LCD_EN = 0;
 181   1      }
 182          
 183          /*******************************************************************/
 184          /*                                                                 */
 185          /*  LCD初始化设定                                                  */
 186          /*                                                                 */
 187          /*******************************************************************/
 188          
 189          void lcd_init()
 190          {
 191   1          delay(15);
 192   1          lcd_wcmd(0x38);      //16*2显示,5*7点阵,8位数据
 193   1          delay(5);
 194   1          lcd_wcmd(0x38);
 195   1          delay(5);
 196   1          lcd_wcmd(0x38);
 197   1          delay(5);
 198   1      
 199   1          lcd_wcmd(0x0c);      //显示开,关光标
 200   1          delay(5);
 201   1          lcd_wcmd(0x06);      //移动光标
 202   1          delay(5);
 203   1          lcd_wcmd(0x01);      //清除LCD的显示内容
 204   1          delay(5);
 205   1      }
 206          
 207          /*******************************************************************/
 208          /*                                                                 */
 209          /*  设定显示位置                                                   */
 210          /*                                                                 */
 211          /*******************************************************************/
 212          
 213          void lcd_pos(uchar pos)
 214          {
 215   1        lcd_wcmd(pos | 0x80);  //数据指针=80+地址变量
 216   1      }
 217          
 218          //-------------------------------------------------------------------
 219          // 函数名称: iic_start()
 220          // 函数功能: 启动I2C总线子程序
 221          //-------------------------------------------------------------------
 222          void iic_start(void)
 223          { //时钟保持高,数据线从高到低一次跳变,I2C通信开始
 224   1              SDA = 1;
 225   1              SCL = 1;
 226   1              delayNOP();      // 延时5us
 227   1              SDA = 0;
 228   1              delayNOP();
 229   1          SCL = 0;
 230   1      }
 231          //-------------------------------------------------------------------
 232          // 函数名称: iic_stop()
 233          // 函数功能: 停止I2C总线数据传送子程序
 234          //-------------------------------------------------------------------
 235          void iic_stop(void)
 236          {
 237   1              SDA = 0;           //时钟保持高,数据线从低到高一次跳变,I2C通信停止
 238   1              SCL = 1;
 239   1              delayNOP();
 240   1              SDA = 1;
 241   1              delayNOP();
C51 COMPILER V8.18   PCF8591_DA_LCD1602_C51                                                01/04/2010 16:31:41 PAGE 5   

 242   1          SCL = 0;
 243   1      }
 244          //------------------------------------------------------------------
 245          // 函数名称: iicInit_()
 246          // 函数功能: 初始化I2C总线子程序
 247          //------------------------------------------------------------------
 248           void iicInit(void)
 249             {
 250   1         SCL = 0;
 251   1         iic_stop();
 252   1         }
 253          //-------------------------------------------------------------------
 254          // 函数名称: slave_ACK
 255          // 函数功能: 从机发送应答位子程序
 256          //-------------------------------------------------------------------
 257          void slave_ACK(void)
 258          {
 259   1              SDA = 0;
 260   1              SCL = 1;
 261   1              delayNOP();
 262   1              SCL = 0;
 263   1      }
 264          //-------------------------------------------------------------------
 265          // 函数名称: slave_NOACK
 266          // 函数功能: 从机发送非应答位子程序,迫使数据传输过程结束
 267          //-------------------------------------------------------------------
 268          void slave_NOACK(void)
 269          {
 270   1              SDA = 1;
 271   1              SCL = 1;
 272   1              delayNOP();
 273   1              SDA = 0;
 274   1          SCL = 0;
 275   1      }
 276          //-------------------------------------------------------------------
 277          // 函数名称: check_ACK
 278          // 函数功能: 主机应答位检查子程序,迫使数据传输过程结束
 279          //-------------------------------------------------------------------
 280          void check_ACK(void)
 281          {
 282   1          SDA = 1;        // 将p1.1设置成输入,必须先向端口写1
 283   1              SCL = 1;
 284   1              flag = 0;
 285   1              delayNOP();
 286   1              if(SDA == 1)    // 若SDA=1表明非应答,置位非应答标志flag
 287   1          flag = 1;
 288   1              SCL = 0;
 289   1      }
 290          //-------------------------------------------------------------------
 291          // 函数名称: IICSendByte
 292          // 入口参数: ch
 293          // 函数功能: 发送一个字节
 294          //-------------------------------------------------------------------
 295          void IICSendByte(uchar ch)
 296          
 297          {
 298   1              unsigned char idata n=8;     // 向SDA上发送一位数据字节,共八位
 299   1      
 300   1              while(n--)
 301   1              {
 302   2              if((ch&0x80) == 0x80)    // 若要发送的数据最高位为1则发送位1
 303   2                 {
C51 COMPILER V8.18   PCF8591_DA_LCD1602_C51                                                01/04/2010 16:31:41 PAGE 6   

 304   3                              SDA = 1;    // 传送位1
 305   3                              SCL = 1;
 306   3                          delayNOP();
 307   3                      //      SDA = 0;
 308   3                              SCL = 0;
 309   3                 }
 310   2                      else
 311   2                      {
 312   3                              SDA = 0;    // 否则传送位0
 313   3                              SCL = 1;
 314   3                              delayNOP();
 315   3                              SCL = 0;
 316   3                      }
 317   2                      ch = ch<<1;    // 数据左移一位
 318   2              }
 319   1      }
 320          //-------------------------------------------------------------------
 321          // 函数名称: IICreceiveByte

⌨️ 快捷键说明

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