原标题:单片机C语言实现NOP 循环移位

首先声明:我学习 单片机C语言还不到半年,所以我还是菜鸟,我贴出的东西或许你们都知道,但我只想把我学习的经历给记录下来,希望你能找到你所想要的.

我记得做学单片机做的第一个实验就是做循环彩灯的实验,如果用汇编RL和RR很容易实现 循环移位,但是C语言编程的移位指指令不能循环,移了后以0填充。

如果用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;

}

记得我才学单片机的时候做的第一个实验就是循环彩灯(那时候用的汇编)

学单片机C语言的时候,第一个实验当然也就是循环彩灯了,C没有直接循环移位的指令没关系,用上面的语句即可实现。:)

如果用keil C的话,它的内部函数_cror_, _crol_实现了这个,包含即可,由于是intrins函数,步步生成函数调用代码,效率很高

用C51自己编一个多字节的循环移位是一件比较麻烦的事,自己可以嵌入汇编的方

法,但是这给编程者容易隐含错误,特别是对于汇编语言不熟的人用汇编是一件

难事。其实在KEIL C51中有这样一个库,其头文件为intrins.h在C51INC目录下

,有以下几个操作,它不是函数,但象函数,它们有入口出口,但是,没有返回R

ET语句,如果有这些操作,用disassembly窗口可以看到是将代码直接嵌入到你的

代码中,其效率很高,比如一个空操作,_nop_() 嵌入的代码就是一个NOP指令。

在这个库中,有如下操作:

unsigned char _chkfloat_(float val) 检查浮点数状态

返回值:0: standard floating-point numbers

1: Floating-point value 0

2:+INF (positive overf low)

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;

责任编辑:

c语言移位函数intrins,单片机C语言实现NOP 循环移位相关推荐

  1. 51c语言延时作用,51单片机C语言延时函数怎么定义和使用

    描述 51单片机C语言延时函数怎么定义 C语言定义延时函数主要通过无意义指令的执行来达到延时的目的.C程序中可使用不同类型的变量来进行延时设计.经实验测试,使用unsigned char类型具有比un ...

  2. 51单片机c语言试题及答案,单片机C语言期末考试题..

    单片机C语言期末考试题..,单片机的c语言应用程序设计,单片机c语言编程,51单片机c语言程序100例,单片机c语言,单片机c语言编程思想,c语言开发单片机,c语言单片机程序,新概念51单片机c语言教 ...

  3. r语言c函数怎么用,R语言学习笔记——C#中如何使用R语言setwd()函数

    在R语言编译器中,设置当前工作文件夹可以用setwd()函数. > setwd("e://桌面//") > setwd("e:\桌面\") > ...

  4. c语言程序 中断函数示例,单片机_C语言函数_中断函数(中断服务程序)

    c语言中的中断函数注意事项 单片机_C语言函数_中断函数(中断服务程序) 在开始写中断函数之前,我们来一起回顾一下,单片机的中断系统. 中断的意思(学习过微机原理与接口技术的同学,没学过单片机,也应该 ...

  5. _nop_在c语言里什么作用,单片机c语言中nop函数的使用方法和延时计算

    原标题:单片机c语言中nop函数的使用方法和延时计算 标准的C语言中没有空语句.但在 的C语言编程中,经常需要用几个空指令产生短延时的效果. 这在汇编语言中很容易实现,写几个nop就行了. 在C51中 ...

  6. c语言单片机常用函数,C51单片机C语言函数编辑 -单片机-电子工程世界网

    其实一直出现在例子中的 main()也算是一个函数,只不过它比较特殊,编译时以它做为程序的开始段.有了函数C 语言就有了模块化的优点,一般功能较多的程序,会在编写程序时把每项单独的功能分成数个子程序模 ...

  7. 51单片机c语言编程100,51单片机C语言编程100例.doc

    51单片机C语言编程100例.doc 目 录实例3用单片机控制第一个灯亮3实例4用单片机控制一个灯闪烁认识单片机的工作频率3实例5将 P1口状态分别送入P0.P2.P3口认识I/O口的引脚功能4实例6 ...

  8. c语言程序设计分段定时器,单片机C语言编程定时器的几种表达方式

    原标题:单片机C语言编程定时器的几种表达方式 吴鉴鹰单片机开发板地址 店铺:[吴鉴鹰的小铺] 地址:[https://item.taobao.com/item.htm?_u=ukgdp5a7629&a ...

  9. 单片机独立式按键c语言程序,(原创)51单片机C语言程序设计--速学教程实例(入门篇)之独立按键(查询)...

    (原创)51单片机C语言程序设计--速学教程实例(入门篇)之独立按键(查询) /************************************************************ ...

最新文章

  1. Logistic Regression(逻辑回归)原理及公式推导
  2. python基础8(来自廖雪峰的官方网站)
  3. 【知识星球】数据集板块重磅发布,海量数据集介绍与下载
  4. LATEX学习篇【二】:论文中的公式技巧QA
  5. cmake打包ICONV库
  6. 小米12系列旗舰最新爆料:内藏5000mAh电池但机身更薄
  7. 服务器用netstat卡_PHP安全:服务器端口安全
  8. 用java编写圆锥_求java大神帮忙 求大神帮助!Java
  9. 在MFC中调用DLL .
  10. [RMAN]使用RMAN删除过期归档日志
  11. Encryption and decryption、Steganography、Decryption Tools
  12. Reactive Extensions 初识
  13. baymax平台导入任务错误日志报错: Please login with USER and PASS.
  14. C编程实例-“约瑟夫问题” 解法
  15. 程序员投入时间和精力实现财富增长之道,这可能会伴随你程序员整个生涯(请不要连续点赞)
  16. 内网主机通过公网域名解析访问内网服务器,存在什么问题,如何解决?
  17. matlab遗传算法配送路径,基于遗传算法的生鲜配送的路径优化问题
  18. 阿里云ECS后台利用“安全组”屏蔽恶意攻击ip地址
  19. 使用pymysql报错RuntimeError ‘cryptography‘ package is required for sha256_password or caching_sha2_passw
  20. QT报错:Gtk-Message:Failed to load module “gail“

热门文章

  1. Centos7下安装配置开源存储虚拟化QuadStor(4)----Vdisk Clone
  2. webRTC(二十三):web远程androidandroid远程android的实现
  3. 2019智能手表推荐_2020年买什么智能手表合适?
  4. AD PCB设计入门总结(二)
  5. Pandas 时间序列 - 实例方法与重采样
  6. 多个系统间是怎么保证统一登录的
  7. 《互联网+流通——F2R助力传统产业创新与转型》一一1.1 “互联网+”的本质、演进与发展趋势...
  8. 15 | SpringBoot + thymeleaf 的登陆页面如何实现国际化
  9. Flutter唤醒屏幕(Android)
  10. cat全链路监控_CAT分布式监控系统(一):CAT功能介绍 CAT监控系统是什么、能做什么?...