KeilC51下的带进位循环右移指令是什么

发布者:心灵捕手最新更新时间:2016-09-25 来源: eefocus关键字:Keil  C51  带进位循环  右移指令 手机看文章 扫描二维码
随时随地手机看文章
一:C语言实现循环移位:

比如将a=0x45循环左移二位。a循环左移n位,即将原来右面(8-n)位左移n位,而将原来左端的n位移到最右面n位。

实现步骤:

1、将a的左端n位先放到b中的高n位中   
  b=>>(8-n);   
2、将a左移n位,其右面高n位被补0   
  c=< 3、将b,c进行或运算   
  a=c|b;   
程序如下:   
  main()   
  {   
    unsigned   char   a=0x45,b,c;   
    unsigned   int   n=2;   
    b=a>>8-n)   
    c=a<     a=c|b;   
  }  

二:Keil C言实现循环移位

在Keil C51中有这样一个库,其头文件为在C51\INC目录下,有以下几个操作,它不是函数,但象函数,它们有入口出口,但是,没有返回RET语句,如果有这些操作,用disassembly窗口可以看到是将代码直接嵌入到你的代码中,其效率很高,比如一个空操作,_nop_()   嵌入的代码就是一个NOP指令。   在这个库中,有如下操作:   
  unsigned   char   _chkfloat_(float   val)   检查浮点数状态   
  返回值:0:   standard   floating-point   numbers   
                1:   Floating-point   value   0   
                2:+INF   (positive   overflow)   
                3:-INF   (Not   a   number)   error   status   
  unsigned   char   _crol_(         //字节的多次循环左移   
                          unsigned   char   c,   //C左移的字符   
                          unsigned   char   b);//b左移的位数   
  unsigned   char   _cror_(         //字节的多次循环右移   
                          unsigned   char   c,   //C右移的字符   
                          unsigned   char   b);//b右左移的位数   
  unsigned   int     _irol_   (         //字的循环左移   
                          unsigned   int   c,     //c左移的字   
                          unsigned   char   b);//b左移的次数   
  unsigned   int     _iror_   (         //字的循环右移   
                          unsigned   int   c,     //c右移的字   
                          unsigned   char   b);//b右移的次数   
  unsigned   long   _lrol_   (         //4字节(双字)的循环左移   
                          unsigned   long   c,//c左移的双字   
                          unsigned   char   b);//b左移的次数   
  unsigned   long   _lror_   (         //4字节(双字)的循环右移   
                          unsigned   long   c,//c右移的双字   
                          unsigned   char   b);//b右移的次数   
  void   _nop_     (void);         //NOP   8051中的空操作   
  bit     _testbit_   (bit   b);//8051中的JBC指令,测试b,然后清0,返回b的值。

下面是我自己以前写的东西   
      汇编的移位操作很容易   RR   RRC   RL   RLC   
      C51中,移出很容易,<<   >>   ;移入操作中的左移入也容易,困难在右移入   
  一:IC读写应用   
  1:送数   
  送两个单独字节的数据的程序,左送   &0x80             右送   &0x01       
                  bit   out;   
                  out   =   low   &   0x01;                 
                  low   >>=   1;   
                  low   |=   (high   &   0x01)<<7;   
                  high   >>=   1;   
            
    2:取数(不管怎么移入,第一次操作之后获取的那一位数据必须在接受数据的最高位或   者最低位上,从而选择是先取数还是先移位)    a:如果是先接受高位后接受低位   则先左移一位后接受一位数据(i2c总线)   
          uchar   i;   
          uchar   temp   =   0;   
          uchar     date   =   0x82;   
          for   (i   =   0;   i   <   8;   i++)   
          {   
                  temp   <<=   1;                           //左移   
                  temp   |=   (bit)(date   &   0x80);     
                  date   <<=   1;   
          }   
            
        b:如果是先接受低位,后接受高位   则先接受一位数据后循环右移一位   
          uchar   i;   
          uchar   temp   =   0;   
          uchar   date   =   0x82;   
          for   (i   =   0;   i   <   8;   i   ++)   
          {                 
                  temp   |=   (bit)(date   &   0x01);   
                  date   >>=   1;             
                  temp   =   _cror_(temp,1);   
                  //循环右移,应用_cror_()需要包含头文件     
          }   
          如果不用函数   
          则for循环应该这样写   
          for   (i   =   0;   i   <   8;   i   ++)   
          {                 
                  temp   >>=   1;   
                  temp   |=   (date   &   0x01)   <<   7;   
                  date   >>=   1;             
                    
          }   
    三:任意一位的置位或者取反运算   
      置位运算   
  low   |=   0x01;     (置最低位为1)   
  取反运算   
                low   |=   ~low   &   0x01;   
  四:合并和拆分数据   
  1:合并两个单字节数据为一个双字节数据   
          int   len;   
          uchar   low;   
          uchar   high;   
          Len   |=   high;   
          Len   <<=   8;   
          Len   |=   low;   
  2:   拆分一个双字节数据为两个单字节数据   
          int   len;   
          uchar   low;   
          uchar   high;   
          low   |=   len;   
          high   |=   len   >>   8;      

关键字:Keil  C51  带进位循环  右移指令 引用地址:KeilC51下的带进位循环右移指令是什么

上一篇:Keil C51程序调试过程
下一篇:第二部分 与外围设备的接口实例

推荐阅读最新更新时间:2024-03-16 15:11

详解keil4怎样新建一个工程且新建文件
学习单片机要用到keil等的代码编译软件,初学者需要从第一步新建工程走起,做好第一步,才能越走越远。 工具/原料 电脑,keil软件 方法/步骤 打开keil软件,找到project,下拉菜单有一项new uvision project。点击这个项目,会出现一个项目路径 自定义项目名称和保存位置。 选择需要烧代码的单片机芯片的生产公司以及相应的芯片型号 上一步做好以后,出现一个提示,点是就会生成一个51的启动文件,否就不会出现,如图,是点了是 以上步骤就新建了一个工程。我们可以直接add进去已有的文件。本次介绍如何自己新建文件。点标题栏的新建按钮,出现了一个随机的text1,点击保存
[单片机]
详解<font color='red'>keil</font>4怎样新建一个工程且新建文件
【单片机笔记】keil c51编译环境不能跳转函数的解决办法
keil c51 不能使用:Go to Definition of....的解决方法 最近使用keil c51 开发usb固件,当向vc一样使用Go to Definition of....时,出现警告对话框: no browse information available in'工程目录' check- then rebuild the target! 查了一些资料,原因大概有二: 1、代码中嵌有汇编,汇编代码去掉后能查看。 2、选中target1,然后点击右键,选择 option for target 'target1' ,在弹出的对话框中选择output选项卡,看Browse
[单片机]
STM32 SRAM启动的 KeiL 配置
BOOT 引脚改成从SRAM 启动,即 BOOT0=1,BOOT1=1 如果使用ST提供的库函数 3.5 打开(system_stm32f10x.c) #define VECT_TAB_SRAM 2.x 可以通过调用以下两个函数切换中断向量表的指向。 NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x00); NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0); KEIL 的配置 (SYM32F103C8T6 (64kFlash/20kSram);
[单片机]
STM32 SRAM启动的 <font color='red'>KeiL</font> 配置
单片机C语言C51构造数据类型
A. 数组 一.一维数组 一维数组只有一个下标,定义的形式如下: 数据类型说明符 数组名 各部分说明如下: (1)“数据类型说明符”说明了数组中各个元素存储的数据的类型。 (2)“数组名”是整个数组的标识符,它的取名方法与变量的取名方法相同。 (3)“常量表达式”,常量表达式要求取值要为整型常量,必须用方括号“ ”括起来。用于说明该数组的长度,即该数组元素的个数。 (4)“初值部分”用于给数组元素赋初值,这部分在数组定义时属于可选项。对数组元素赋值,可以在定义时赋值,也可以定义之后赋值。在定义时赋值,后面须带等号,初值须用花括号括起来,括号内的初值两两之间用逗号间隔,可以对数组的全部元素赋值,也可
[单片机]
C51程序设计中的编程中的字节对齐问题
一.什么是字节对齐,为什么要对齐? 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特 定的内存地址访问,这就需要各种类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐。 对齐的作用和原因:各个硬件平台对存储空间的处理上有很大的不同。一些平台对某些特定类型的数据只能从某些特定地址开始存取。比如有些架构的CPU在访问 一个没有进行对齐的变量的时候会发生错误,那么在这种架构下编程必须保证字节对齐.其他平台可能没有这种情况,但是最常见的是如果不按照适合其平台要求对 数据存放进行对齐,会在存取效率上带来损失。比如
[单片机]
基于stm32的keil开发环境搭建
1 只要按照下面的一步步来,绝对能从0开始建立一个STM32工程。不仅包括工程建立过程,还有Jlink设置方法。本文使用芯片为STM32F103CB。 1 下载stm32F10x的官方库 2 新建工程 工程名设为stm32_demo,选择芯片型号为STM32F103B,如图: 因为下载的stm32库中有启动代码,所以这里选择 否 ,不拷贝启动代码。 在工程文件下,新建Startup 、Headers、User、Libraries、CMSIS、Lists、Output文件夹。 至此,stm32的工程文件结构如下 3 库文件拷贝 把下载stm32库中文件拷贝到新建工程中 文件
[单片机]
基于stm32的<font color='red'>keil</font>开发环境搭建
[单片机][KEIL5] 参数的意义和使用 L #L @L K #K $, #, %, @, ~, ^
使用键序列从µVision传递参数给外部用户程序。 键序列是键码和文件码的组合。 键序列可以使用,例如,在对话框工具,SVCS,选项的目标用户,或从命令行。 以下规则适用: 当从命令行使用时,某些关键代码必须重复。 使用符号$,#,%,@,~,^ 用$$,##,%%,@@,~~,^^来转义它们。 当使用可能包含特殊字符(空格、~或#)的文件夹名称时,将键序列用引号( )括起来。 关键码及档案码列于下表: |C:MYPROJECTPROJECT1.UVPROJX |带扩展名的完整路径和文件名 @| PROJECT1| 没有扩展名或路径说明的文件名 $| C:MYPROJECT | 用反斜杠扩展的文件路径名。
[单片机]
[单片机][<font color='red'>KEIL</font>5] 参数的意义和使用 L #L @L K #K $, #, %, @, ~, ^
C51的编程规范说明
现在单片机的程序设计,C51已经得到广泛的推广和应用,算是单片机的主流设计程序,甚至可以说作为单片机开发人员必须要掌握的一门语言了。 作为一门工具,最终的目的就是实现功能。在满足这个前提条件下,我们希望我们的程序能很容易地被别人读懂,或者能够很容易地读懂别人的程序,在团体合作开发中就能起到事半功倍之效。在网上请求帮助时,如能以规范的写法贴出程序,网友会比较容易地明白你的问题,则会比较快的得到网友的帮助,否则让人看上半天也不明所以然,这样就达不到预期的效果了。因此,为了便于源程序的交流,减少合作开发中的障碍,希望大家能够探讨一下C51的编程规范。把各人认为好的建议提出来,然后做一个总结,作为一种大家一致认同的规范,我认为将会是一件很
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved