热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

msp430——软件模拟II2C实例

运行代码复制代码#include#defineSDABIT1#defineSCLBIT2#defineSEG_A0xA00x0200---0x027F




运行代码 
  1.  
  2. #include  
  3. #define   SDA              BIT1  
  4. #define   SCL              BIT2  
  5.      
  6. #define  SEG_A  0xA0   //0x0200---0x027F    
  7. #define  SEG_B  0xB0   //0x0280---0x02FF  
  8. #define  SEG_C  0xC0   //0x0300---0x037F  
  9.  
  10. //0x0380---0x0400  
  11. __no_init char wokao@0x243;  
  12. //=============================  
  13.  char *send_ptr;  
  14.  char  DEVICE_ADR=0;  
  15.  char WORD_ADR=0;  
  16.  char  REC_DATA=0;  
  17.  char START_flag = 0;  
  18.  char STOP_flag = 0;  
  19.  char PreState = 0;  
  20.  char NowState = 0;  
  21. //*********************函数声明*************************************  
  22. void ACK(void);  
  23.  
  24. //****************************************************************  
  25. void main( void )  
  26. {  
  27.   // Stop watchdog timer to prevent time out reset  
  28.   WDTCTL = WDTPW + WDTHOLD;  
  29.    
  30.   //======================MCLK=16MHz=====================================  
  31.   DCOCTL = CALDCO_16MHZ;  
  32.   BCSCTL1 = CALBC1_16MHZ;    //MCLK=DCO=16MHz  
  33.  P3DIR &= ~(SDA+SCL);  
  34.   while(1)  
  35.   {  
  36.     NN=10;  
  37.     PreState = READ_SDA;  
  38.     while(READ_SCL && NN--)  
  39.     {      
  40.       NowState = READ_SDA;  
  41.       if(PreState && !NowState)  
  42.       {  
  43.         START_flag = 1;  
  44.         _DINT();  
  45.       }  
  46.       if(!PreState && NowState)  
  47.       {  
  48.         STOP_flag = 1;  
  49.         _EINT();  
  50.       }    
  51.       PreState = NowState;  
  52.       if(START_flag)  
  53.       {  
  54.         START_flag=0;  
  55.         while(READ_SCL);          //START时的SCL高电平状态就等待  
  56.         for(gg=8;gg>0;gg--)       //接收器件地址  
  57.         {  
  58.           while(!READ_SCL);       //SCL低电平状态就等待  
  59.            
  60.           DEVICE_ADR<<&#61;1;  
  61.           if(READ_SDA)            //数据的第一个CLK高电平来临  
  62.             DEVICE_ADR |&#61; 0x01;  
  63.            
  64.           while(READ_SCL);        //SCL高电平状态就等待  
  65.         }  
  66.         ACK();                    //对设备地址ACK应答信  
  67.         //-----------以上收到了设备地址&#xff0c;并知晓主机要对从机进行读还是写操作---  
  68.           
  69.         for(gg&#61;8;gg>0;gg--)       //接收内存单元地址  
  70.         {  
  71.           while(!READ_SCL);  
  72.            
  73.           WORD_ADR<<&#61;1;  
  74.           if(READ_SDA)  
  75.             WORD_ADR |&#61; 0x01;  
  76.            
  77.           while(READ_SCL);  
  78.         }      
  79.         //-----------以上就已经接收到内存单元地址------------  
  80.         ACK();                  //对内存单元ACK应答信号  
  81.           
  82.           
  83.         if(DEVICE_ADR & 0x01)     //从机发数据给主机  R/W&#61;1  
  84.         {  
  85.           if(DEVICE_ADR&#61;&#61;SEG_A&#43;0x01)  
  86.           {  
  87.             send_ptr &#61;(char*)(0x0200 &#43; WORD_ADR);  
  88.           }  
  89.           else if(DEVICE_ADR&#61;&#61;SEG_B&#43;0x01)  
  90.           {  
  91.             send_ptr &#61;(char*)(0x0280 &#43; WORD_ADR);  
  92.           }  
  93.           else if(DEVICE_ADR&#61;&#61;SEG_C&#43;0x01)  
  94.           {  
  95.             send_ptr &#61;(char*)(0x0300 &#43; WORD_ADR);  
  96.           }  
  97.            
  98.           //--------以上是判断出为主机读从机&#xff0c;要把要读的地址单元赋给指针---  
  99.            
  100.           for(gg&#61;8;gg>0;gg--)  
  101.           {  
  102.             while(!READ_SCL);  
  103.             if( *send_ptr & 0x80)  
  104.               _NOP();  
  105.             else  
  106.             {  
  107.               P3DIR |&#61; SDA;     //输出0  
  108.             }  
  109.             while(READ_SCL);    //SCL为1&#xff0c;就保持SDA输出不变  
  110.             P3DIR &&#61; ~SDA;      //SCL为0&#xff0c;就把SDA从新切换到接收状态  
  111.             *send_ptr <<&#61;1;  
  112.           }  
  113.           ACK();                //从机数据发送完毕&#xff0c;应答信号  
  114.           _NOP();  
  115.           //------------------以上是从机发数据给主机-----------------  
  116.         }  
  117.         else  //主机写从机  R/W&#61;0  
  118.         {  
  119.           for(gg&#61;8;gg>0;gg--)     //接收主机要写到该器件内存单元的数据  
  120.           {  
  121.             while(!READ_SCL);  
  122.              
  123.             REC_DATA <<&#61;1;  
  124.             if(READ_SDA)  
  125.               REC_DATA |&#61; 0x01;  
  126.              
  127.             while(READ_SCL);  
  128.           }  
  129.           if(DEVICE_ADR&#61;&#61;SEG_A)  
  130.           {  
  131.             send_ptr &#61;(char*)(0x0200 &#43; WORD_ADR);  
  132.             *send_ptr &#61; REC_DATA;  
  133.           }  
  134.           else if(DEVICE_ADR&#61;&#61;SEG_B)  
  135.           {  
  136.             send_ptr &#61;(char*)(0x0280 &#43; WORD_ADR);  
  137.             *send_ptr &#61; REC_DATA;  
  138.           }  
  139.           else if(DEVICE_ADR&#61;&#61;SEG_C)  
  140.           {  
  141.             send_ptr &#61;(char*)(0x0300 &#43; WORD_ADR);  
  142.             *send_ptr &#61; REC_DATA;  
  143.           }  
  144.           ACK();    
  145.           _NOP();  
  146.           while(!READ_SCL);  
  147.         }  
  148.       }// if(START_flag)  
  149.        
  150.     }//while(NN--)  
  151.     _EINT();  
  152.     _NOP();  
  153.   }//while(1)  
  154. }  
  155. //****************************************************  
  156. void ACK(void)  
  157. {  
  158.   // while(READ_SCL);  
  159.   while(!READ_SCL);  
  160.   P3DIR |&#61; SDA;        //第9个CLK变高的情况下&#xff0c;SDA输出0  
  161.   while(READ_SCL);    
  162.   P3DIR &&#61; ~SDA;       //第9个CLK变低的情况下&#xff0c;SDA输出1  
  163. }  


推荐阅读
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • c语言\n不换行,c语言printf不换行
    本文目录一览:1、C语言不换行输入2、c语言的 ... [详细]
  • 本文介绍了一种划分和计数油田地块的方法。根据给定的条件,通过遍历和DFS算法,将符合条件的地块标记为不符合条件的地块,并进行计数。同时,还介绍了如何判断点是否在给定范围内的方法。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • 本文介绍了为什么要使用多进程处理TCP服务端,多进程的好处包括可靠性高和处理大量数据时速度快。然而,多进程不能共享进程空间,因此有一些变量不能共享。文章还提供了使用多进程实现TCP服务端的代码,并对代码进行了详细注释。 ... [详细]
  • 本文介绍了解决二叉树层序创建问题的方法。通过使用队列结构体和二叉树结构体,实现了入队和出队操作,并提供了判断队列是否为空的函数。详细介绍了解决该问题的步骤和流程。 ... [详细]
  • 本文介绍了C函数ispunct()的用法及示例代码。ispunct()函数用于检查传递的字符是否是标点符号,如果是标点符号则返回非零值,否则返回零。示例代码演示了如何使用ispunct()函数来判断字符是否为标点符号。 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • Linux环境变量函数getenv、putenv、setenv和unsetenv详解
    本文详细解释了Linux中的环境变量函数getenv、putenv、setenv和unsetenv的用法和功能。通过使用这些函数,可以获取、设置和删除环境变量的值。同时给出了相应的函数原型、参数说明和返回值。通过示例代码演示了如何使用getenv函数获取环境变量的值,并打印出来。 ... [详细]
  • 本文介绍了PE文件结构中的导出表的解析方法,包括获取区段头表、遍历查找所在的区段等步骤。通过该方法可以准确地解析PE文件中的导出表信息。 ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 本文介绍了基于c语言的mcs51单片机定时器计数器的应用教程,包括定时器的设置和计数方法,以及中断函数的使用。同时介绍了定时器应用的举例,包括定时器中断函数的编写和频率值的计算方法。主函数中设置了T0模式和T1计数的初值,并开启了T0和T1的中断,最后启动了CPU中断。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • 本文介绍了汉诺塔问题的迭代算法实现,通过递归的方式将盘子从一个地方搬到另一个地方,并打印出移动的顺序。详细介绍了算法的思路和步骤,以及示例代码的运行结果。 ... [详细]
author-avatar
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有