// testled.c 测试AVR的位操作.
// 这是gcc;如是其它编译器,请修改。
#i nclude
// 定义一个寄存器(Register)或端口(Port)的八个位
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 bit6 : 1 ;
unsigned char bit7 : 1 ;
}bit_field;
//定义一个宏,用来得到每一位的值
#define GET_BITFIELD(addr) (*((volatile bit_field *) (addr)))
//定义每一个位
#define LED GET_BITFIELD(PORTB).bit0
#define BUTTON GET_BITFIELD(PINB).bit7
#define Set_Bit(val, bitn) (val |=(1<<(bitn)))
#define Clr_Bit(val, bitn) (val&=~(1<<(bitn)))
#define Get_Bit(val, bitn) (val &(1<<(bitn)) )
int main( void )
{
DDRB = 0x41; //配置PB0为输出,PB7为输入
if ( BUTTON==0 ) LED = 1; else LED = 0;
if(!Get_Bit(PINB,7) ) Set_Bit(PORTB,0); else Clr_Bit(PORTB,0);
while(1);
}
-----
反汇编
int main( void )
{
ca: 81 e4 ldi r24, 0x41 ; 65
cc: 87 bb out 0x17, r24 ; 23
DDRB = 0x41; //配置PB0为输出,PB7为输入
if ( BUTTON==0 ) LED = 1; else LED = 0;
ce: e6 b3 in r30, 0x16 ; 22
d0: ff 27 eor r31, r31
d2: 80 81 ld r24, Z
d4: 87 fd sbrc r24, 7
d6: 05 c0 rjmp .+10 ; 0xe2
d8: e8 b3 in r30, 0x18 ; 24
da: ff 27 eor r31, r31
dc: 80 81 ld r24, Z
de: 81 60 ori r24, 0x01 ; 1
e0: 04 c0 rjmp .+8 ; 0xea
e2: e8 b3 in r30, 0x18 ; 24
e4: ff 27 eor r31, r31
e6: 80 81 ld r24, Z
e8: 8e 7f andi r24, 0xFE ; 254
ea: 80 83 st Z, r24
if(!Get_Bit(PINB,7) ) Set_Bit(PORTB,0); else Clr_Bit(PORTB,0);
ec: b7 99 sbic 0x16, 7 ; 22
ee: 02 c0 rjmp .+4 ; 0xf4
f0: c0 9a sbi 0x18, 0 ; 24
f2: 01 c0 rjmp .+2 ; 0xf6
f4: c0 98 cbi 0x18, 0 ; 24
f6: ff cf rjmp .-2 ; 0xf6
000000f8 <_exit>:
f8: ff cf rjmp .-2 ; 0xf8 <_exit>
--用位段方式操作时完成位操作需要代码 0xea-0xce +2 = 30Bytes
--用移位方式操作需要代码 0xf4-0xec +2 = 10Bytes
可见位段方式虽然更加直观,但更浪费资源。
关键字:avr单片机 位操作
引用地址:
关于avr单片机位操作的一些看法
推荐阅读最新更新时间:2024-03-16 15:16
avr单片机的机器周期与时钟周期
机器周期:从内存中读取一个指令字的时间。简单地说也就是执行一条单周期指令所用的时间。AVR单片机采用哈佛结构(数据和程序分开存储)和精简指令集,一个机器周期等于一个时钟周期。也就是执行一条单周期指令只需要一个时钟脉冲。 时钟周期:数字电路的运行都离不开CLK,也就是时钟脉冲。时钟脉冲的周期就叫时钟周期。由于各器件或功能模块工作的速度要求不一样,像你所说的,又分为CPU时钟周期,ADC时钟周期等。通常我们所说的时钟周期就是CPU时钟周期,单片机通常用外部晶振产生时钟源,所以有了时钟周期等于晶振周期的说法。 CPU时钟周期:提供给CPU的时钟脉冲的周期。由于通常情况下CPU速度最快,所以时钟源直接给CPU提供时钟脉冲,在一个系统里CP
[单片机]
AVR单片机——中断系统
中断的优点 中断函数只在中断触发源触发的时候才会执行,其他时间不执行. 如果不使用中断而且如果要根据某个端口的变化而作相应的函数操作,就必须不断地查询端口的信号,而中断不用,只要端口一有变化,就会系统就会自动进入中断函数, 我觉得这就是中断的目的,也是优点. 中断优先级 1) AVR单片机在同一个优先级中,中断向量入口地址越低,其优先级越高。AVR单片机在响应中断以后,会禁止系统响应其余中断。如果程序需要在某个中断服务程序中响应其它中断事件,可以在该中断服务程序中用重新使能全局中断即可。否则,AVR单片机只有在退出中断进程时,才重新使能全局中断。 2) AVR(至少是ATmega16)单片机采用固定的硬件优先
[单片机]
avr单片机模拟比较器初始化配置及说明
avr模拟比较器对正极 AIN0 的值与负极 AIN1 的值进行比较。当 AIN0 上的电压比负极 AIN1 上的电压要高时,模拟比较器的输出 ACO 即置位。比较器的输出可用来触发定时器 / 计 数器 1 的输入捕捉功能。此外,比较器还可触发自己专有的、独立的中断。用户可以选择 比较器是以上升沿、下降沿还是交替变化的边沿来触发中断。 /* 特殊功能 IO 寄存器- SFIOR 7 6 5 4 3 2 1 0 ADTS2 ADTS1 ADTS0 ACME PUD PSR2 PSR10 Bit 3 ACME: 模拟比较器多路复用器使能
[单片机]
缺少仿真器时avr单片机的开发方法
对FLASH存贮器单片机,不要仿真机也能方便快速地开发程序。具体可以从以下几方面入手: 一、尽量使用高级语言开发系统程序 您有没有在写汇编程序时,标错一个标号而浪费您大把时间找错或跳转偏移量过大而不得不改动程序结构的经历。其实您如果使用高级语言开发程序,就不会有这样的痛苦。 在开发程序时,除了建立一个良好的开发文档外,使用语言的选择也很重要。有许多人认为使用汇编写程序比较精简,而用高级语言开发会浪费很多程序空间,其实这是一种误解。对一个有经验的,而且非常熟悉某种单片机的汇编高手而言,他是能写出比高级语言更精简的代码。而对汇编不是很熟的开发者、或突然更换了一种新的单片机,您能保证一定可以写出比高级语言更简练的代码吗? 高级语言的优越
[单片机]
简述AVR单片机定时器
AVR定时器的要点介绍 M16的T1 16位定时器一共有15种工作模式,其他2个8位定时器(T0/T2)相对简单,除了T2有异步工作模式用于RTC应用外 (可以利用溢出中断和比较匹配中断作定时功能) 分5种工作类型 1 普通模式 WGM1=0 跟51的普通模式差不多,有TOV1溢出中断,发生于TOP时 1 采用内部计数时钟 用于 ICP捕捉输入场合---测量脉宽/红外解码 (捕捉输入功能可以工作在多种模式下,而不单单只是普通模式) 2 采用外部计数脉冲输入 用于 计数,测频 其他的应用,采用其他模式更为方便,不需要像51般费神 2 CTC模式 WGM1=4,12 跟51的自动重载模式差
[单片机]
avr单片机看门狗初始化配置及说明
MCU 控制和状态寄存器-MCUCSR MCU 控制和状态寄存器提供了有关引起 MCU 复位的复位源的信息。 Bit 7 6 5 4 3 2 1 0 JTD ISC2 JTRF WDRF BORF EXTRF PORF MCUCSR 读 / 写 R/W R/W R R/W R/W R/W R/W R/W 初始值 0 0 0 参见各个位的说明 * Bit 4 J
[单片机]
轻触式开关电路在AVR单片机中的应用
引 言: 单键开关电路已经广泛应用于PDA、手机和电子词典等数码产品中,其实现方式多种多样。一般可采用RS触发器、计数器以及采用555集成电路等等。在单片机的一些实际应用中,以上的实现方式会增加整个电路的复杂度,不能达到简洁、实用的效果。本文将介绍一种可以在单片机应用中实现的,简易、稳定的轻触式单键开关电路。 1 电路原理 如图1所示,DC-DC为一个带有关断控制端的直流稳压电源芯片,MCU是一个单片机。当按下S1时,Q1和D1导通,稳压芯片工作,为单片机供电。单片机马上将相应的I/O引脚置为输出高,这时Q1和Q2导通,整个电路进入工作状态。而后单片机再将这个I/O引脚设置为输入,由于上拉电阻R4的存在,Q1和Q2一直导通。
[单片机]
STM32F103系列头文件(支持位带操作)
【1】头文件介绍 和51的头文件类似,采用特殊方法封装,只要在工程中加入该头文件即可直接操控寄存器,支持位带操作。 【2】使用说明 详见头文件 【3】地址链接 点个关注吧,我会持续推出好东西的! 链接:https://pan.baidu.com/s/16WdrCZgjvgrPLzejeMFBkg 提取码:v35g 【4】注意 除了头文件还给出了自己的应用实例,推荐使用混合模板。即寄存器和标准库结合的编程方式。
[单片机]