c语言移位函数intrins,单片机C语言实现NOP 循环移位
原标题:单片机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 循环移位相关推荐
- 51c语言延时作用,51单片机C语言延时函数怎么定义和使用
描述 51单片机C语言延时函数怎么定义 C语言定义延时函数主要通过无意义指令的执行来达到延时的目的.C程序中可使用不同类型的变量来进行延时设计.经实验测试,使用unsigned char类型具有比un ...
- 51单片机c语言试题及答案,单片机C语言期末考试题..
单片机C语言期末考试题..,单片机的c语言应用程序设计,单片机c语言编程,51单片机c语言程序100例,单片机c语言,单片机c语言编程思想,c语言开发单片机,c语言单片机程序,新概念51单片机c语言教 ...
- r语言c函数怎么用,R语言学习笔记——C#中如何使用R语言setwd()函数
在R语言编译器中,设置当前工作文件夹可以用setwd()函数. > setwd("e://桌面//") > setwd("e:\桌面\") > ...
- c语言程序 中断函数示例,单片机_C语言函数_中断函数(中断服务程序)
c语言中的中断函数注意事项 单片机_C语言函数_中断函数(中断服务程序) 在开始写中断函数之前,我们来一起回顾一下,单片机的中断系统. 中断的意思(学习过微机原理与接口技术的同学,没学过单片机,也应该 ...
- _nop_在c语言里什么作用,单片机c语言中nop函数的使用方法和延时计算
原标题:单片机c语言中nop函数的使用方法和延时计算 标准的C语言中没有空语句.但在 的C语言编程中,经常需要用几个空指令产生短延时的效果. 这在汇编语言中很容易实现,写几个nop就行了. 在C51中 ...
- c语言单片机常用函数,C51单片机C语言函数编辑 -单片机-电子工程世界网
其实一直出现在例子中的 main()也算是一个函数,只不过它比较特殊,编译时以它做为程序的开始段.有了函数C 语言就有了模块化的优点,一般功能较多的程序,会在编写程序时把每项单独的功能分成数个子程序模 ...
- 51单片机c语言编程100,51单片机C语言编程100例.doc
51单片机C语言编程100例.doc 目 录实例3用单片机控制第一个灯亮3实例4用单片机控制一个灯闪烁认识单片机的工作频率3实例5将 P1口状态分别送入P0.P2.P3口认识I/O口的引脚功能4实例6 ...
- c语言程序设计分段定时器,单片机C语言编程定时器的几种表达方式
原标题:单片机C语言编程定时器的几种表达方式 吴鉴鹰单片机开发板地址 店铺:[吴鉴鹰的小铺] 地址:[https://item.taobao.com/item.htm?_u=ukgdp5a7629&a ...
- 单片机独立式按键c语言程序,(原创)51单片机C语言程序设计--速学教程实例(入门篇)之独立按键(查询)...
(原创)51单片机C语言程序设计--速学教程实例(入门篇)之独立按键(查询) /************************************************************ ...
最新文章
- Logistic Regression(逻辑回归)原理及公式推导
- python基础8(来自廖雪峰的官方网站)
- 【知识星球】数据集板块重磅发布,海量数据集介绍与下载
- LATEX学习篇【二】:论文中的公式技巧QA
- cmake打包ICONV库
- 小米12系列旗舰最新爆料:内藏5000mAh电池但机身更薄
- 服务器用netstat卡_PHP安全:服务器端口安全
- 用java编写圆锥_求java大神帮忙 求大神帮助!Java
- 在MFC中调用DLL .
- [RMAN]使用RMAN删除过期归档日志
- Encryption and decryption、Steganography、Decryption Tools
- Reactive Extensions 初识
- baymax平台导入任务错误日志报错: Please login with USER and PASS.
- C编程实例-“约瑟夫问题” 解法
- 程序员投入时间和精力实现财富增长之道,这可能会伴随你程序员整个生涯(请不要连续点赞)
- 内网主机通过公网域名解析访问内网服务器,存在什么问题,如何解决?
- matlab遗传算法配送路径,基于遗传算法的生鲜配送的路径优化问题
- 阿里云ECS后台利用“安全组”屏蔽恶意攻击ip地址
- 使用pymysql报错RuntimeError ‘cryptography‘ package is required for sha256_password or caching_sha2_passw
- QT报错:Gtk-Message:Failed to load module “gail“
热门文章
- Centos7下安装配置开源存储虚拟化QuadStor(4)----Vdisk Clone
- webRTC(二十三):web远程androidandroid远程android的实现
- 2019智能手表推荐_2020年买什么智能手表合适?
- AD PCB设计入门总结(二)
- Pandas 时间序列 - 实例方法与重采样
- 多个系统间是怎么保证统一登录的
- 《互联网+流通——F2R助力传统产业创新与转型》一一1.1 “互联网+”的本质、演进与发展趋势...
- 15 | SpringBoot + thymeleaf 的登陆页面如何实现国际化
- Flutter唤醒屏幕(Android)
- cat全链路监控_CAT分布式监控系统(一):CAT功能介绍 CAT监控系统是什么、能做什么?...