第三讲 AVR位操作

合集下载

AVR的两种位操作的比较

AVR的两种位操作的比较

AVR的两种位操作的比较(位域方式和移位宏方式)AVR的两种位操作的比较(位域方式和移位宏方式)测试环境如下:硬件:AT90S2313软件: WinAVR gcc3.3 -Os级优化(最小size)。

说明:由于AVR不支持位操作,所以必须通过软件来实现。

下面对我所知道的两种方法进行一个简单的比较。

1.位域方式。

(1)先定义一个位域,typedef struct _bit_struct{unsigned char bit0 : 1 ;unsigned char bit1 : 1 ;unsigned char bit2 : 1 ;unsigned char bit3 : 1 ;unsigned char bit4 : 1 ;unsigned char bit5 : 1 ;unsigned char bit7 : 1 ;unsigned char bit6 : 1 ;}bit_field;(2)再用一个宏 ,来指向要操作的位。

#define LED GET_BITFIELD(PORTB).bit0#define BUTTON GET_BITFIELD(PINB).bit7(3)使用时只需要直接赋值即可。

如LED = 0 ,LED = 1, 或者直接判断 LED==0这种方法类似C51中的位操作,方便直接。

2.位移宏方式。

主要有三个.●#define Set_Bit(val, bitn) (val |=(1<<(bitn)))●#define Clr_Bit(val, bitn) (val&=~(1<<(bitn)))●#define Get_Bit(val, bitn) (val &(1<<(bitn)) )三个分别用来设置某一位,清除某一位,取某一位的值。

使用方法为.Set_Bit(PORTA,3); Clr_Bit(PORTB,2); Get_Bit(val,5);3.测试程序.说明,假设PORTB.7接按键,PORTB.0 接LED测试程序完成如下操作。

AVR指令集

AVR指令集

间接转移(Z)
LD Rd, Z
Z 间接取数
SET
置位 T
RCALL k 相对调用
LD Rd, Z+ Z 间接取数后
CLT
清零 T
ICALL
间接调用(Z)
LD Rd,–Z
Z 间接取数先
SEH
置位 H
RET
子程序返回
LDD Rd, Z+q Z 间接取数 q
CLH
清零 H
RETI
中断返回
LDS Rd,K
从 SRAM 装入 NOP
AVR 单片机指令系统
3
AVR 单片机指令系统简介
4.4 算术和逻辑指令
4.4.1 加法指令 1 ADD 不带进位加法 说明 两个寄存器不带进位 C 标志加 结果送目的寄存器 Rd 操作 ADD Rd,Rr RdßRd+ Rr O d 31 0 r 31 2 ADC 带进位加法 说明 两个寄存器和 C 标志的内容相加 结果送目的寄存器 Rd 操作 ADC Rd,Rr Rd Rd Rr C 0 d 31 0 r 31 3 ADIW 立即数据加法 字 说明 寄存器对于立即数值 0 63 相加 结果放到寄存器对 操作 ADIW Rdl K Rdh:RdlßRdh:Rdl+K d { 24 26 28 30 } UJ 4 INC 加 1 指令 说明 寄存器 Rd 的内容加 1 结果送目的寄存器 Rd 中 操作 INC Rd RdßRd 1 0 d 31 4.4.2 减法指令 1 SUB 不带进位减法 说明 两个寄存器相减 结果送目的寄存器 Rd 中 操作 SUB Rd,Rr RdßRd Rr 0 d 31 0 r 31 2 SUBI 立即数减法 字节 说明 一个寄存器和常数相减 结果送目的寄存器 Rd 操作 SUBI Rd,K RdßRd—K 16 d 31 0 k 255 3 SBC 带进位减法 说明 两个寄存器随着 C 标志相减 结果放到目的寄存器 Rd 中 4 SBCI 带进位立即数减 说明 寄存器和立即数随着 C 标志相减 结果放到目的寄存器 Rd 中 操作 SBCI Rd K RdßRd K C 16 d 31 0 K 255

AVR 指令说明

AVR 指令说明


影響旗標 Z,C,N,V,H Z,C,N,V,H Z,C,N,V,S Z,C,N,V,H Z,C,N,V,H Z,C,N,V,S Z,C,N,V,H Z,C,N,V,H Z,N,V Z,N,V Z,N,V Z,N,V Z,N,V Z,C,N,V Z,C,N,V,H Z,N,V Z,N,V Z,N,V Z,N,V Z,N,V Z,N,V None None None None None None I None Z,C,N,V,H Z,C,N,V,H Z,C,N,V,H None None None None None None None None None None None None None None None None None None None None None None None None None None None
X暫存器內容當地址,取該地址內的資料放入Rd暫存器後X加1。 X暫存器內容先減1當地址,取該地址內的資料放入Rd暫存器。 將Y暫存器內容當地址,取該地址內的資料放入Rd暫存器。 Y暫存器內容當地址,取該地址內的資料放入Rd暫存器後Y加1。 Y暫存器內容先減1當地址,取該地址內的資料放入Rd暫存器。 將Y暫存器內容加 q當地址,取該地址內的資料放入Rd暫存器。 將Z暫存器內容當地址,取該地址內的資料放入Rd暫存器。 Z暫存器內容當地址,取該地址內的資料放入Rd暫存器後Z加1。 Z暫存器內容先減1當地址,取該地址內的資料放入Rd暫存器。 將Z暫存器內容加 q當地址,取該地址內的資料放入Rd暫存器。 直接讀進地址為K的SRAM內容,放入Rd暫存器。 儲存Rr暫存器內容到X所指的RAM地址內。 儲存Rr暫存器內容到X所指的RAM地址內,後X加1。。 X先減1後,儲存Rr暫存器內容到X所指的RAM地址。。 儲存Rr暫存器內容到Y所指的RAM地址內。 儲存Rr暫存器內容到Y所指的RAM地址內,後Y加1。。 Y先減1後,儲存Rr暫存器內容到Y所指的RAM地址。。 儲存Rr暫存器內容到Y+q所指的RAM地址內。 儲存Rr暫存器內容到Z所指的RAM地址內。 儲存Rr暫存器內容到Z所指的RAM地址內,後Z加1。。 Z先減1後,儲存Rr暫存器內容到Z所指的RAM地址。。 儲存Rr暫存器內容到Z+q所指的RAM地址內。 將Rr內容存入地址為K的SRAM內。 由程式記憶體載入資料到R0,地址在Z暫存器內。 由I/O記憶體地址P載入資料到Rd暫存器。 將Rd暫存器內容送出到I/O記憶體地址P上。 將Rr暫存器內容壓到堆疊內,堆疊地址在SPL暫存器。 由堆疊中取出資料到Rr暫存器內,堆疊地址在SPL暫存器。 位 元 及 位 元 測 試 指 令 將I/O記憶體地址中的b位元設定1。 將I/O記憶體地址中的b位元清除。 將Rd暫存器內容左移一位元,並在右端輸入補 0。 將Rd暫存器內容右移一位元,並在左端輸入補 0。 將Rd暫存器內容與C旗標一起左旋一位元,C旗標由右端送入。 將Rd暫存器內容與C旗標一起右旋一位元,C旗標由左端送入。 將Rd暫存器內容作算術右移,MSB不動,其餘右移一位並補0。 將Rd暫存器內容之高4位元(4~7)與低4位元(0~3)互換。 將SREG暫存器內第s位元設定(1)。 將SREG暫存器內器第s位元清除。 將Rr暫存器內第b個位元存入SREG暫存器內之T位元內。 將SREG暫存器內之T位元放入Rr暫存器內第b個位元內。 設定進位位元C。 清除進位位元C。 設定負值位元N。 清除負值位元N。 設定零旗標Z。 清除零旗標Z。 設定總中斷旗標I。 清除總中斷旗標I。 設定正負值旗標S。 清除正負值旗標S。 設定溢位旗標V。 清除溢位旗標V。 設定SREG暫存器內之T位元。 清除SREG暫存器內之T位元。 設定半進位旗標H。 清除半進位旗標H。 無動作指令。 睡覺指令 重設看門狗指令。

AVR的两种位操作

AVR的两种位操作
再用一个宏 ,来指向要操作的位。
#define LED GET_BITFIELD(PORTB).bit0
#define BUTTON GET_BITFIELD(PINB).bit7
58: e8 2f mov r30, r24
5a: ff 27 eor r31, r31
5c: 80 81 ld r24, Z
{
unsigned char bit0 : 1 ;
unsigned char bit1 : 1 ;
unsigned char bit2 : 1 ;
5e: 86 fd sbrc r24, 6
60: 07 c0 rjmp .+14 ; 0x70
62: 88 b3 in r24, 0x18 ; 24
76: 80 81 ld r24, Z
78: 8e 7f andi r24, 0xFE ; 254
7a: 80 83 st Z, r24
使用方法为.Set_Bit(PORTA,3); Clr_Bit(PORTB,2); Get_Bit(val,5);
3、测试程序.
说明,假设PORTB.7接按纽,PORTB.0 接LED
测试程序完成如下操作。
64: e8 2f mov r30, r24
66: ff 27 eor r31, r31
68: 80 81 ld r24, Z
unsigned char bit5 : 1 ;
unsigned char bit7 : 1 ;
unsigned char bit6 : 1 ;
}bit_field;
说明:
由于AVR不支持位操作,所以必须通过软件来实现。下面对我所知道的两种方法进行一个简单的比较。

AVR单片机熔丝位设置方法和设置步骤大全

AVR单片机熔丝位设置方法和设置步骤大全

AVR单片机熔丝位设置方法和设置步骤大全AVR单片机是一种常用的嵌入式系统开发平台之一、在单片机的开发中,熔丝位(Fuse)是决定单片机工作模式的重要设置之一、设置正确的熔丝位可以保证单片机的正常运行。

本文将介绍AVR单片机熔丝位的设置方法和设置步骤。

一、什么是熔丝位?熔丝位是用来定义单片机的一些基本特性的设置值,每个熔丝位可以设置为“0”或“1”,对应不同的功能。

通过设置熔丝位,可以选择以下几个方面的属性:1.时钟源(Clock Source):选择单片机的系统时钟源。

2.启动时间延迟(Start-up Time Delay):为了让单片机的晶振系统正常工作,需要在上电复位后等待一段时间。

3.JTAG接口:选择是否启用JTAG接口。

4.保护:保护单片机的外部程序和数据,防止非授权访问。

二、如何设置熔丝位?1.选择适当的单片机型号:在烧写工具的软件中,选择正确的单片机型号。

2.熔丝位设置:在烧写工具的软件中找到“Fuses”或“熔丝位”选项。

3.设置单片机的时钟源:根据实际需要,选择合适的时钟源。

常见的时钟源有外部晶振、外部时钟信号、内部RC振荡器等。

4.设置启动时间延迟:选择合适的启动时间延迟。

启动时间延迟是为了让外部晶振系统正常工作所需的等待时间。

5.选择是否启用JTAG接口:如果需要使用JTAG接口进行调试或编程,选择启用;否则选择禁用。

6.设置保护位:根据实际需求,选择是否启用保护位。

启用保护位可以防止未授权的访问。

7.写入熔丝位:在设置完所有的熔丝位后,点击“写入”或“烧写”按钮,将设置写入单片机的熔丝位中。

三、常见的一些熔丝位设置示例:1.外部晶振作为时钟源:熔丝位:CLKSEL[3:0]=1111说明:将单片机的时钟源设置为外部晶振,晶振频率可以根据实际需求选择。

2.外部时钟信号作为时钟源:熔丝位:CLKSEL[3:0]=0111说明:将单片机的时钟源设置为外部时钟信号,外部时钟信号的频率必须在单片机规格书中规定的范围内。

AVR单片机位操作的C语言编程实现

AVR单片机位操作的C语言编程实现
第2页 共4页
} BYTE_BIT; //B 口宏定义,此值参见相应头文件。 #define_PINB ox23 #define_DDRB ox24 #define PORTB ox25 //定义 B 端口每个位,进行地址绑定。 #define PINB_BITO (*(volatileBYTE_BIT*)(_PINB)).BTTO PINB_BITl BITl…… #dcfinc PORTB_BIT0(*(volatilcBYTE_BIT*)(_PORTB))BIT0 PORTB_BIT1 BIT1…… #define DDRB BITO (*(volatilcBYTE_BIT*)(_DDRB)BITO DDRB_B1T1 Bitl…… 对各端口依同一规律均进行各位的定义即可。 结合头文件的相关定义,重新对其特定地址进行另外的绑定,结合位域的概念,进而一步步 将各寄存器由一个字节分成了可操控的 8 个位。在上述文件中,笔者仅表述了 B 端口。另外, Atmega48 的端口不完全,只有 B、C、D 口,没有 A 口,且 D 口为 8 位,C 口为 6 位,B 口为 7 位,若外接晶体,则 PB6 和 PB7 不能另作端口运用。所以,端口很不完整,但为了保持位域完 整性和一致性,便于理解,将 B、C、D 三口均作 8bit 对待。实际操作时,千万注意不要去操作 那些实际不存在的位。当然,若感兴趣,大家可改动头文件相关定义,来完善它。 为验证这个头文件,笔者很快编写了一个测试程序 Beep.c,具体如下: Beep.c 程序代码 #include<iom48r.h> #include"avr_bith”//包含自定义头文件 #define time 40000 Void beepcunsigned int); Void portint(); Void main(); { while(1) { portint(); beep(time); } } Void beep cunsigned intr)//蜂鸣器发声函数 { unsignedinti; PORTB_BIT0=0;//PB0 输出低电平 for{i=r,i>o,i..) PORTB_BIT0=1;//PB0 输出高电平 for(i=r;i>0;i..) } void portint()端口初始化函数

AVR单片机指令入门

AVR单片机指令入门

AVR指令中使用的符号1、状态寄存器与标志位SREG: 8位状态寄存器,其中每一位的定义为:C:进位标志位Z:结果为零标志位N:结果为负数标志位V: 2的补码溢出标志位S: N⊕V,用于符号测试的标志位H:操作中产生半进位的标志位T:用于和BLD、BST指令进行位数据交换的位I:全局中断触发/禁止标志位2、寄存器和操作码Rd:目的(或源)寄存器,取值为R0~R31或R16~R31(取决于指令)。

Rr:源寄存器,取值为R0~R31。

A:I/O寄存器,取值为0~63或0~31(取决于指令)。

b: I/O寄存器中的指定位,常数(0~7)。

s:状态寄存器SREG中的指定位,常数(0~7)。

K:立即数,常数(0~255)。

k:地址常数,取值范围取决于指令。

q:地址偏移量常数(0~63)。

X、Y、Z:地址指针寄存器(X=R27:R26;Y=R29:R28;Z=R31:R30)。

3、堆栈STACK:作为返回地址和压栈寄存器的堆栈SP:堆栈STACK的指针AVR指令的寻址方式和寻址空间1、单寄存器直接寻址由指令指定一个寄存器的内容作为操作数,在指令中给出寄存器的直接地址,这种寻址方式称为单寄存器直接寻址。

单寄存器寻址的地址范围限制为通用工作寄存器组中的32个寄存器R0~R31,或后16个寄存器R16~R31。

例:INC Rd;操作:Rd←Rd+1。

INC R5;将寄存器R5内容加1回放。

2、双寄存器直接寻址双寄存器直接寻址方式与单寄存器直接寻址方式相似,它是将指令指出的两个寄存器Rd和Rr的内容作为操作数,而结果存放在Rd寄存器中。

指令中同时给出两个寄存器的直接地址,这种寻址方式称为双寄存器直接寻址。

双寄存器寻址的地址范围限制为通用工作寄存器组中的32个寄存器R0~R31,或后16个寄存器R16~R31,或后8个寄存器R16~R23(取决于不同指令)。

例:ADD Rd,Rr;操作:Rd←Rd+Rr。

ADD R0,R1;将R0和R1寄存器内容相加,结果回放R0。

AVR单片机C语言程序设计中的位操作

AVR单片机C语言程序设计中的位操作

对于位运算的操作是基本不涉及的,但是在但是在单片机单片机系 它实际上控制着它实际上控制着PB 口的8个端口PB0-PB7的方向,也就是说它的每一位都控制一个端口的方向,如果我们要把端口PB0-PB3设置为输出口,而把PB4-PB7 这就牵出了这就牵出了这就牵出了单片机单片机C 我们来看这个语句:我们来看这个语句:我们来看这个语句:DDRE |= (1 << PE5);个地址,这个我们暂且不去深究。

我们还是回过头来看DDRE= DDRE | (1 << PE5);这句话实现的功能,这句话实际上是将寄存器DDRE 中的内容(数据)跟二进制数0b00100000进行或操作,我们知道两个数的或操作的结果是:只要有一个是1,结果就是1.1.那么假如那么假如DDRE 中本来的值是0b10001010(0x8a),0b10001010(0x8a),它和它和0b00100000进行“或”操作以后的结果变成了0b101010100b10101010((0xaa 0xaa)。

我们可以看出,)。

我们可以看出,相或以后DDRE 中的第5位以外的各位的值都没有改变,而第5位变成了1,我们的目的就是要将第5位设为输出口(即将第5位设置为1)。

)。

现在我们来看一下从语言中有几种位运算符:现在我们来看一下从语言中有几种位运算符:移位运算符:左移移位运算符:左移<<<<<<,右移,右移,右移>> >>与运算符:与运算符:& &或运算符:或运算符:| |取反运算符:取反运算符:~ ~异或运算符:异或运算符:^ ^就这些了,总共只有就这些了,总共只有6中位运算符。

现在我们来看一下这些运算符都起什么作用;么作用;左移运算符:表达形式为x<<n,x<<n,意思是将数据意思是将数据x 向左移动n 位,在这里x 和n 都必须是无符号整形数据(所有的位运算符的操作对象都是无符号整形); 例如,例如,例如,x x 是一个unsigned char 类型的数据(即x 是一个单字节数据,共有8位),设x 的初值为0x000000010x00000001,执行,执行x<<n 的操作:的操作:n=0时,时,x<<n x<<n 表示x 左移0位,实际就是不移动,位,实际就是不移动,x x 的值不改变的值不改变n=1时,时,x<<n x<<n 表示x 左移1位,运算结果为0b00000010n=2时,时,x<<n x<<n 表示x 左移2位,运算结果为0b00000100...n=7时,时,x<<n x<<n 表示x 左移7位,运算结果为0b10000000n=8时,时,x<<n x<<n 表示x 左移8位,运算结果为0b00000000从结果来看,从结果来看,当n 在1-7之间取值时,运算的结果总是1依次向左移动一位,但是当n>=8以后,以后,x x 的值就一直是0了,这是因为x 是一个只有8位的整形变量,形变量,它的最大二进制长度是它的最大二进制长度是8位,位,当当n 超过8以后,以后,移位操作的结果已经超移位操作的结果已经超出8位的范围了,产生了溢出现象。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

以我们的MEGA8为例子,PC端口有6个,从PC0到 PC5,我们直接赋值过去,PORTC=0XF0;则实际上是 设置了1111 0000,PC0~PC3为低电平,PC4~PC5为 高电平,而PC6和PC7引脚在MEGA8中不存在。
2、位逻辑运算符
符号 & | ^ ~ 成负号。 描述 位逻辑与 位逻辑或 位逻辑异或 取补(取反),该符号是波浪号,不要写
4、按位进行操作
举例八:将第三位置1,除了用BIT(3),还有其 它的表达方法吗? DDRB|=BIT(3); DDRB|=1<<3; DDRB|=0x08; DDRB|=0b00001000;
一些特殊用法
PIND & (1 << PD5) 这条语句其实是告诉编译器,在处理的时候把 这个处理成位操作指令。 PD5就是头文件里面定义的,实际数值是数字 5; 把5代替PD5,其实就是1 << 5,用二进制来看 的话:0000 0001 被左移了5位,结果就是 0010 0000。 PIND & 0010 0000的结果其实就是取PIND.5 这一位。
二、AVR端口的控制
1、AVR端口介绍 2、AVR端口状态的定义 3、端口操作 4、按位进行操作
1、AVR端口介绍
AVR单片机拥有多个I/O口(input/output),其作用是读取数据,或者输出 数据。不同型号的单片机的I/O口数量是不一样。如下图所示,MEGA8 和MEGA128的引脚图。
第三讲 AVR单片机位操作
黄文恺
一、 位操作基础知识
1、位的概念 2、位逻辑运算符 3、位移运算符
1、位的概念
我们知道,在单片机或计算机系统中, 我们知道,在单片机或计算机系统中,一 字节占8位 这样表示的数的范围为0-255,也 字节占 位,这样表示的数的范围为 , 即00000000-11111111。位就是里面的 和1。 。位就是里面的0和 。 char c=100; 实际上c应该是 应该是01100100,正好是 实际上 应该是 ,正好是64H。其 。 中高位在前,低位在后。 中高位在前,低位在后。 | | 第7位 第0位 位 位
4、按位进行操作
举例七: DDRB=BIT(0)|BIT(1) 与DDRB|=BIT(0)|BIT(1) 的区别 假定在执行上面两句指令前,DDRB 的状态为: 1000 0000 如果执行 DDRB=BIT(0)|BIT(1) ,DDRB的状态变为: 0000 0011 如果执行 DDRD|=BIT(0)|BIT(1),,DDRB的状态变为: 1000 0011 前一句会先清空以前的所有状态,后一句保留前面的 状态。在实际应用中,后一句更常用。
ATMega128
ATMega8
2、AVR端口状态的定义
I/O作为输入(读取)还是输出,都必须事先定 义。 以MEGA128为例,定义其PD端口(从 PD0~PD7)为读取,则: DDRD=0x00;
若换成PC端口,则将D改为C,PB,PA口依此类推
此时定义为读取状态。可以读取按键信号,或 者脉冲信号,或者用于计数器数脉冲等用途。 如果是A/D功能引脚,还可以把模拟信号读取 成数字信号(后续章节再提及模数转换)
上一节课,我们学习的按钮读取的程序中出现 if ((PINA & (1 << PA0)) == 0) { PORTD = ~(1 << PD0); } 其中if 语句里的逻辑值, PINA & (1 << PA0)等效于 1<<0,把1左移0位,那么就是0000 0001, 然后PINA&0000 00001,最终的结果就是判断第0位 PA0。 回忆求与运算的规则,假设PA口接了很多按钮,读回 来的状态是11110010,此时,由于&00000001之后, 实际将高位屏蔽了,剩下就是最末尾,0和1求运算。
|
位逻辑或
| 运算的规则是当两个位都为0时,结果为0, 否则为1; (小提示,你可以理解为加号,只有假的加假 的等于假,即0加0等于0,其余情况,只要有1 个是真的,结果都为真) 在单片机中,常用于某一位的置位。 例:我们将PB3和PB0口置为高电平。 00001001 0X09
PB3 PB0 PORTB |=0X09 (等价于PORB=PORTB|0X09)
读取PC2口的数据
假设 PC口接了若干设备,当前状态是 11110010,而我们现在要读取第3位即PC2, 则 1111 0110 PA2口的当前值 0000 0 100
求与后,最终变成 0000 0000
通过(1<<PA2)得出的值 那么if ((PINC&(1<<PC2))==0) 实际上就读出了 PC2的值
^
位逻辑异或
^ 运算的规则是当两个位相同时,结果为0,否 则为1; 此逻辑符常用的规则是当为1时结果为0,当为0时, 结果为1。 例如,将PA口全部取反。则 PA PA^=PA;
3、位移运算符
符号 << >> 描述 左移 右移 位移运算符作用于其左侧的变量,其右侧的表达式的值就是移动的位数,运算 结果就是移动后的变量结果。 b=a<<2; 就是a的值左移两位并赋值为b。a本身的值并没有改变。 向左移位就是在低位上补0,向右移位就是在高位上补0。右移时可以保持结果 的符号位,也就是右移时。如果最高位为1,是符号位,则补1而不是补0。 例如: 当a=01110010时 若b=a<<2; 结果为 b=11001000 若b=a>>2; 结果为 b=00011100 当a=11110010时 若b=a<<2; 结果为 b=11001011 若b=a>>2; 结果为 b=11011100 程序员常常对右移运算符来实现整数除法运算,对左移运算符来实现整数乘法运 算。其中用来实现乘法和除法的因子必须是2的幂次。
& 位逻辑与运算
& 运算的规则是当两个位都为1时,结果为1, 否则为0;(小提示:你可以在心中默念乘法来 代替它,真与真,就是1乘以1,真与假,就是1 乘以0,假与假,就是0乘以0) 在单片机中,常用于某一位清0,其他位不变 例:将PC4口清零,我们写出二进制数 11101111 0XEF
PC4
PORTC &=0xEF (等价于PORTC=PORTC&0xEF) 或PORTC&=0b11101111
4、按位进行操作
举例五:将PB2、PB3定义为输入,不带上拉 电阻 DDRB&=~(BIT(2)|BIT(3)); //定义 PB2、PB3 为输入 PORTB&=~(BIT(2)|BIT(3)); // 将 PORT 置0, 没有上拉电阻
4、按位进行操作
举例六:将PB2、PB3定义为输入,带上拉电阻。即 没有引用这些引脚时,缺省值为高电平 SFIOR&=~BIT(PUD); // SFIOR寄存器的上拉电阻控 制位PUD置0,在整个代码中,这句话可以不出现,或 仅出现一次即可。因为它是一个控制全部上拉电阻的 控制位。 DDRB&=~(BIT(2)|BIT(3)); //定义 PB2、PB3为输入 PORTB|=BIT(2)|BIT(3); // 将 PORT 置1,满足上拉电 阻的另一个条件
3、端口操作
当我们需要对PORTC端口进行输出(例如控 制LED灯),分别是PC0~PC3低电平, PC4~PC7高电平,则: PORTC=0XF0; (等效于11110000)
3、端口操作
使用逻辑符号对端口进行操作 PORTC &=0XF0; (等价于PORTC=PROTC&0XF0) PORTD |=0XF0; (等价于PORTC=PROTC|0XF0)
4、按位进行操作
举例三:将PB0数据寄存器的数值翻转,即如 果是1时变成0,如果是0时变成1 PORTB^=BIT(0); // PB0 输出高电平
4、按位进行操作
举例四:将PB0、PB1数据寄存器的数值翻转, 即如果是1时变成0,如果是0时变成1 PORTB^=BIT(0)|BIT(1); // PB0 输出高电平
三、实验
结合上节课的循环语句。用MEGA168单片机, 接4个LED灯(共阴极)和2个按钮.按钮一则4 个灯从上到下闪一遍,按按钮2则从下到上闪 一遍。 做完的同学请修改为把LED改为共阳极。按键 1为从上到下,闪烁次数为三遍。按键2为,每 按一次,所有灯取反(原来亮的灭,灭的变亮)。
若定义为输出,以MEGA128为例,定义其PC 端口(从PC0~PC7)为输出,则: DDRC=0XFF; 作为输出的时候,能够控制如LED,继电器的 开启,电机的启动,或者输出方波等各种信号。
3、端口操作
当定义好I/O口的工作模式后,我们就可以控制端 口了。 例如:我们要读取PA的所有引脚的数据,则 unsigned char a; //定义一个无符号的字符变量 a=PINA; //将PA口的值赋值给变量a; 假如此时,PA的状态是01001000,则a获得该值。
4、按位进行操作
举例一:将PB0定义为输出,且输出为高电平 DDRB=BIT(0); //定义 PB0为输出 PORTB|=BIT(0); // PB0 输出高电平
4、按位进行操作
举例二:将PB0、PB1定义为输出,且PB0输 出低电平,PB1均为高电平 DDRB|=BIT(0)|BIT(1); //定义 PB0、PB1为输 出 PORTB|=BIT(0)|BIT(1);// PB0、PB1 输出高电 平
相关文档
最新文档