老古开发网首页
导航:老古开发网首页文章索引索引第2406页文章分类单片机第37页→[单片机C环境下位操作的实现方法]
| -文章搜索 - 最新文章 - |

第2422篇:单片机C环境下位操作的实现方法

发布时间:2006年7月23日 点击次数:1184
来源:   作者:
 
单片机C环境下位操作的实现方法
黑龙江工程学院 刘海成

C语言既有高级语言的各种特点,又可对硬件进行操作,并对进行结构化程序设计,用C语言编写的程序较容易移植,它们可生成简洁可靠的目标代码,在代码效率和代码执行速度上完全可以和汇编媲美。采用C语言进行单片机编程是嵌入式程序设计的发展趋势。但是,在嵌入式控制等领域,经常需要控制某一个二进制位,然而除了Keil C51等C环境外,很多单片机C环境都没有扩充对位变量定义的关键字,甚至单片机本身的硬件上也没有对单个位操作的汇编指令,这使得已习惯MCS-51内核单片机Keil C51编程的用户都为其C环境不能对位变量进行位操作而烦恼。

1 用“读-修改-写”方法实现对单个位的位操作

ANSIC中,一般采用“读-修改-写”的方法实现单个位的位操作,通过与0“与”操作,将某一位清0。如使i变量的b0位为0,实现方法为i=i&0xfe。通过与1“或”操作,将某一位置1。如使i变量的b0位为1,实现方法为i=i 0x01。通过与1“异或”操作,将某一位取反。如使i变量的b0位取反,实现方法为i=i^0x01。

注意:错误“读-修改-写”方法时不要影响其他位,即某位清零时,其他位与1“与”;某位置1时,其他位与0“或”;取反时,其他位与0“异或”。

为了方便程序设计和增加程序可读性,很多程序员喜欢采用下面的移位方式实现单个位的位操作,语句简练,可读性强,比如在某单片机的B口连接1个发光二极管,其点亮操作方法如下:

#define bit(x) (1<<(x))

#define LED 2

使用方法如下:

PORTB =bit(LED);//将PORTB第3位置1,点

           //亮连接在I/O口的LED

该方式下,程序运行时会增加移位操作,生成的代码较大,而且执行时间长,实时性差,一些C环境按如下方式直接定义位,则生成的代码就不会有移位操作:

2 通过位域的方法实现位操作

标准C提供了一种基于结构体的数据结构--位域(BitField),位域就是把一个存储单元中的二进制划分为几个不同的区域。并说明每个区域的位数。每一个域有一个域名,允许在程序中按域名进行操作,位域的定义格式如下:

struct 位域结构名{

位域列表 };

位域列表格式为:类型说明符 位域名:位域长度如:

struct k{

unsigned int a:1

unsigned int :2

unsigned int b:3

unsigned int :0     //空域

}k1;

说明:

1)各位依次从低位到高位排列,排满一个存储单元,按地址接着排下一单元;

2)位域可以无域名,但不能被引用,如第二域,这时其只用来填充或调整位置;

3)第四行称空域,目的是将目前存储单元的剩余部分分为一个域,且填充0。

位域的引用很简单,如:

k1.a=1; //置k1的b0位为1

k1.b=7; //将k1的b3-5位置111

通过位域定义位变量,是实现单个位位操作的重要途径和方法,采用位域定义位变量,产生的代码紧凑、高效。定义的方法如下:

通过位域定义位,再通过宏进行定义,可以方便地将Keil C51等程序移植到其他C编译器,从而不再为没有位操作而苦恼。

对一个单片机的所有I/O口,通过将位域结构指定到I/O端口地址,I/O口便都可以采用位域进行宏定义,这样,操作I/O口就可以像Keil C51编程一样方便。

3 基于位域实现位操作应用举例

很多单片机没有硬件的SPI,而很多板级外围器件为SPI接口,而且某些外围器件不是标准的SPI,即通信的总二进制位数不是8的整数倍,这里编制一个例程,为同时收和发0-16位,全双工方式,具体使用见例程注解。注意:很多单片机使用前要对使用的I/O口进行初始化,clk和din为输出口,dout为输入口,同时这里使用了前面通过读-修改-写宏定义的一个函数GET_BIT(x,y)。

该SPI模块已经成功应用到单片机与MAX7219和CH451等SPI通信上。

对于没有扩展位变量的C语言环境,在汇编下没有对单个位进行位操作执行的MCU,通过位域的方法操作I/O口是最佳的方法,汇编下有单个位的位操作指令MCU。可以嵌入汇编,但是程序的可移植性等性能会下降,建议使用位域的方法。

 
本文摘自《单片机与嵌入式系统应用》

欢迎进入老古论坛进行讨论
[单片机] 相关文章:
两种“软件陷阱技术”的比较
简介:
引 言 单片机应用系统的抗干扰具体可分为软件和硬件两方面,其中,软件抗干扰以其设计灵活、节省硬件资源、降低成本等优势越来越得到广泛采用。软件抗干扰技术主要有“指令冗余技术”、“软件陷阱技术”、“软件看门狗技术”、“数字滤波技术”等。本文就软件陷阱技术对单片机应用系统抗干扰的原理与具体实现方法进行探讨和研究,给出实现软件陷阱技术的两种形式,并将该技术成功地使用在多个实际的单片机应用系统中,保证系统的可靠运行。 1 程序跑飞和软件陷阱技术概述......

A51 4.1.2 普通段(Generic Segment)
用4BIT OTP单片机实现USB/PS2 MOUSE的设计
基于GSM的GPS车辆定位监控系统
振荡器和专用寄存器功能
 
下一个:[新闻热点]肖特兴建三个新的熔炉,以继续扩大背光源产品产量
简介:
德国肖特集团(SCHOTT AG)日前开始在其捷克共和国的Valašské Mezirící生产基地兴建三个新的熔炉,以加快步伐提高用于显示器背光源的玻管产品产量。背光源产品广泛应用于笔记本电脑、台式电脑显示器和纯平电视机等的TFT LCD。 “我们预计能够实现两位数的稳定年增长。”肖特集团董事会主席伍德•翁格豪尔博士(Dr. Udo Ungeheuer)说道。他同时补充道,“扩大这项前景广阔的业务会帮助Valašské Mezirící生产基地新增100......

上一个:[单片机]调液晶模块T6963驱动范例

老古开发网版权所有 2006年9月 asp.Net V2.0 设计:老古
页面缓存:30分钟 执行时间:47毫秒