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

📄 iic_rw.lst

📁 一个用于驱动TFT屏的驱动程序,使用IC:1828,program (无EEPROM 无IR,完整说明)IIC只写一个
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V7.50   IIC_RW                                                                09/29/2006 10:54:50 PAGE 1   


C51 COMPILER V7.50, COMPILATION OF MODULE IIC_RW
OBJECT MODULE PLACED IN IIC_RW.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE IIC_RW.c BROWSE DEBUG OBJECTEXTEND CODE

line level    source

   1          //*********************************************************************
   2          //               IIC_RW.c     1828 的通讯程序文件
   3          //               by hibernate  2005.9.29   
   4          //       ShenZhen Challenge Technology Co.,Ltd
   5          //remarks:本文件根据vxis原参考程序中func_shi文件改写
   6          //         修改:IIC改了死循环
   7          //*********************************************************************
   8          #include <reg51.h>
   9          #include <intrins.h>
  10          #include <stdio.h>
  11          
  12          #include "vxis1828.h"
  13          #include "config.h"
  14          
  15          //IIC_RW.c文件中的分开的读写函数定义
  16          char read1828(char address);
  17          void write1828(char address,char buf_data);
  18          
  19          //函数定义
  20          void delay_nop();
  21          void stop_IIC();
  22          void start_IIC();
  23          void nack_IIC();
  24          //void ack_IIC();
  25          bit send_IIC(char bytedata);
  26          char receive_IIC();
  27          
  28          //读写口定义
  29          sbit sda     = SDA_PORT;                                                //to 1828 serial data/address
  30          sbit scl     = SCL_PORT;                                                //to 1828 serial clock
  31          
  32          //****************************************
  33          // 函数:char read1828(char address)
  34          // 作用:从1828的寄存器中读取一个8位数据
  35          // 参数:address  => 8 bits , Reg address
  36          // remarks: 程序的写法可以参考SPEC,
  37          //***************************************
  38          char read1828(char address)
  39          {
  40   1              char buffer;
  41   1              unsigned char i = 0;
  42   1              bit  ack = 0;                                                           // 1 => Acknowledge,0 => No Acknowledge 
  43   1      
  44   1              char device = VX1828;
  45   1              
  46   1              for(i = 0;i < 10 && !ack;i++)                           // 读成功可以返回,最多的重试次数为10次
  47   1              {
  48   2                      stop_IIC();     
  49   2                      delay_nop();
  50   2                      start_IIC();                                                    // Master send command Stop =>Start
  51   2                      
  52   2                      if ((ack = send_IIC(device++)) == 1)    // Send the device number and Set the R/W bit
  53   2                              ack = send_IIC(address);
  54   2                                 
  55   2                      if(!ack)
C51 COMPILER V7.50   IIC_RW                                                                09/29/2006 10:54:50 PAGE 2   

  56   2                              continue;                                                       // 没有响应时进入下次重试
  57   2                      
  58   2                      // Ready for receive data       
  59   2                      buffer = 0x00;
  60   2                      stop_IIC();
  61   2                      delay_nop();
  62   2                      start_IIC();                                                    // Master send command Stop =>Start
  63   2      
  64   2                      if((ack = send_IIC(device++)) == 1)             // Send the device number and Set the R/W bit                                   
  65   2                      {                                       
  66   3                              buffer = receive_IIC();                         // Save received data to buf_data                               
  67   3                              nack_IIC();                             
  68   3                      }               
  69   2              }                                                                                       //设备没有响应时重新尝试读数据
  70   1      
  71   1              delay_nop();
  72   1              stop_IIC();
  73   1              delay_nop();
  74   1      
  75   1              return buffer;
  76   1      }
  77          
  78          //****************************************
  79          // 函数:void write1828(char address,unsigned char count,char *buf_data)
  80          // 作用:向1828写count个数据
  81          // 参数:address  => 8 bits , Reg address
  82          // remarks:程序的写法可以参考SPEC,
  83          //***************************************
  84          void write1828(char address,char buf_data)
  85          {
  86   1              //unsigned char i = 0;
  87   1      
  88   1              //for(i = 0;i < ;i++)                           // 写成功可以返回,最多的重试次数为10次
  89   1              //{
  90   1                      stop_IIC();     
  91   1                      delay_nop();
  92   1                      start_IIC();                                                    // Master send command Stop =>Start
  93   1                      
  94   1                      send_IIC(VX1828);                                       // Send the device number and Set the R/W bit   
  95   1                      send_IIC(address);                      // Send the address of reg
  96   1                      send_IIC(buf_data);             // Send the data pointed the buf_data index                                     
  97   1              //}
  98   1      }
  99          
 100          //********************************************
 101          // 函数:void send_IIC(char data)
 102          // 作用:IIC 向 1828 发送数据
 103          // 参数:bytedata  =>8位,要发送的数据
 104          // remarks:         1、发送数据通过移位一位一位的发送,当位是1时sda写1,位是0时sda写0
 105          //              2、发送成功返回1,否则返回0
 106          //********************************************
 107          bit send_IIC(char bytedata)
 108          {
 109   1              char i = 0;
 110   1              bit  ack;                                                                        // 0 => Acknowledge,1 => No Acknowledge  
 111   1                                                      
 112   1              scl = 0; 
 113   1              delay_nop();    
 114   1      
 115   1              for (i = 8;i > 0;i--)
 116   1              {
 117   2                      //sda = 0;                                                              // sda low
C51 COMPILER V7.50   IIC_RW                                                                09/29/2006 10:54:50 PAGE 3   

 118   2                      if (bytedata & 0x80)
 119   2                              sda = 1;                                                        // sda high
 120   2                      else
 121   2                              sda = 0;
 122   2                      delay_nop();
 123   2                      bytedata <<= 1;                                                 // bytedata left shift
 124   2                              
 125   2                      // Generate SCLK
 126   2                      scl = 1; 
 127   2                      delay_nop();                                                    // scl high     
 128   2                      scl = 0;  
 129   2                      delay_nop();                                                    // scl low              
 130   2              }
 131   1              delay_nop();
 132   1      
 133   1              sda = 1; 
 134   1              delay_nop();                                                            // sda high     
 135   1              scl = 1;
 136   1              delay_nop();                                                            // scl high     
 137   1          ack = sda;
 138   1              delay_nop();                                                            // Read ack  0:Acknowledge;  1:No Acknowledge
 139   1              scl = 0; 
 140   1              delay_nop();                                                            // scl low
 141   1              
 142   1              return !ack;
 143   1      }
 144          
 145          //********************************************
 146          //函数:char receive_IIC()
 147          //作用:从IIC(1828||EEPROM)接收数据
 148          //参数:
 149          //remarks:
 150          //********************************************
 151          char receive_IIC()
 152          {
 153   1              unsigned char i = 0;
 154   1          char receive = 0;                                                    // 8 bits buffer for receive
 155   1              
 156   1              for (i = 0x08;i > 0;i--)                                         // 8位
 157   1              {
 158   2                      receive <<= 1;
 159   2                      scl = 1;                                                             // scl high
 160   2                      delay_nop();
 161   2                      if (sda)
 162   2                        receive |= 0x01;
 163   2              
 164   2                      scl = 0;                                                                 // scl low
 165   2                      delay_nop();
 166   2              }
 167   1              return receive;
 168   1      }
 169          
 170          //********************************************
 171          //函数:void ack_IIC()
 172          //作用:IIC响应时的设置(Acknowledge Function)
 173          //rekmarks:进行多个字节的读取时要使用本函数
 174          //*********************************************
 175          /*
 176          void ack_IIC()
 177          {
 178                  sda = 0;
 179                  delay_nop();                                                            // sda low      
C51 COMPILER V7.50   IIC_RW                                                                09/29/2006 10:54:50 PAGE 4   

 180                  scl = 1;
 181                  delay_nop();                                                            // scl high     
 182                  scl = 0;
 183                  delay_nop();                                                            // scl low      
 184                  sda = 1;
 185                  delay_nop();                                                            // sda high     
 186          }
 187          */
 188          //********************************************
 189          //函数:void nack_IIC()
 190          //作用:IIC没有响应时的设置( Not Acknowledge Function)
 191          //*********************************************
 192          void nack_IIC()
 193          {
 194   1              // Acknowledge active
 195   1              sda = 0;  
 196   1              delay_nop();                                                            // sda low
 197   1              scl = 1;
 198   1              delay_nop();                                                            // scl high     
 199   1              //Stop active
 200   1              sda = 1;
 201   1              delay_nop();                                                            // sda high     
 202   1              scl = 0;
 203   1              delay_nop();                                                            // scl low
 204   1      }
 205          
 206          
 207          //********************************************
 208          //函数:void start_IIC()
 209          //作用:命令IIC开始时的设置(Start Function)
 210          //*********************************************
 211          void start_IIC()
 212          {
 213   1              sda = 1;                                                                        // sda high     
 214   1              delay_nop();    
 215   1              scl = 1;                                                                        // scl high     
 216   1              delay_nop();    
 217   1              sda = 0;                                                                        // sda low      
 218   1              delay_nop();    
 219   1              scl = 0;                                                                        // scl low
 220   1              delay_nop();    
 221   1      }
 222          
 223          //********************************************
 224          //函数:void start_IIC()
 225          //作用:命令IIC开始时的设置(Start Function)
 226          //*********************************************
 227          void stop_IIC()
 228          {
 229   1              scl = 0;
 230   1              delay_nop();                                                            // scl low              
 231   1              sda = 0;
 232   1              delay_nop();                                                            // sda low              
 233   1              scl = 1;
 234   1              delay_nop();                                                            // scl high             
 235   1              sda = 1;
 236   1              delay_nop();                                                            // sda high     
 237   1      }
 238          
 239          //********************************************
 240          // 函数:void delay_nop()
 241          // 作用:延时
C51 COMPILER V7.50   IIC_RW                                                                09/29/2006 10:54:50 PAGE 5   

 242          // remarks:
 243          // Machine cycle = 24x2 + 12x3 = 84
 244          // Crystal Frequency = 20 MHz
 245          // Delay Time: 4.2us
 246          //********************************************
 247          void delay_nop()
 248          {
 249   1        //_nop_ ();
 250   1        //_nop_ ();
 251   1        //_nop_ ();
 252   1      }
 253          
 254          
 255          
C51 COMPILER V7.50   IIC_RW                                                                09/29/2006 10:54:50 PAGE 6   

ASSEMBLY LISTING OF GENERATED OBJECT CODE


             ; FUNCTION _read1828 (BEGIN)
                                           ; SOURCE LINE # 38
0000 8F00        R     MOV     address,R7
                                           ; SOURCE LINE # 39
                                           ; SOURCE LINE # 41
0002 E4                CLR     A
0003 F500        R     MOV     i,A
                                           ; SOURCE LINE # 42
0005 C200        R     CLR     ack
                                           ; SOURCE LINE # 44
0007 7500DE      R     MOV     device,#0DEH
                                           ; SOURCE LINE # 46
000A F500        R     MOV     i,A
000C         ?C0001:
000C 200046      R     JB      ack,?C0002
                                           ; SOURCE LINE # 47
                                           ; SOURCE LINE # 48
000F 120000      R     LCALL   stop_IIC

⌨️ 快捷键说明

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