I/O寄存器的C语言源程序及剖析
在ICCAVR中访问0x00~0x3f的寄存器空间,可以使用内汇编和预处理宏。一个数据内存地址可以通过加指针类型符号直接访问。
例如,SREG寄存器的地址是0x5f,对它的访问操作:
unsigned char c;
c=*(volatile unsigned char *)0x5f;//读取SREG寄存器
*(volatile unsigned char *)0x5f|=0x80;//打开全局中断允许位
提示:数据内存地址0x00~0x31指向CPU通用寄存器R0~R31,不能随意修改它们的地址(或者输入错误的地址),否则可能会造成致命的错误。
ICCAVR C在io*v.h文件中用define伪指令给大部分的寄存器定义了指针形式符号,如定义SREG:#define SREG *(volatile unsigned char *)0x5f
上面对SREG的操作也可以改为:
unsigned char c;
c=SREG;//读取SREG寄存器
SREG|=0X80;//打开全局中断允许位
说明:
1.在ICCAVR中对I/O寄存器进行操作,编译器自动生成用于访问I/O寄存器的专用指令,如IN、OUT、BSET、BCLR等,而且已将地址0X5F变换为0x3f。
2.#define语句也可以定义绝对内存空间,用以指向一个固定地址的字节,如:#define LED_OUT *(volatile unsigned char *)0x80aa
关键字:AVR单片机 寄存器 C语言
引用地址:
AVR单片机I/O寄存器的C语言源程序及剖析详解
推荐阅读最新更新时间:2024-03-16 14:23
C语言常见命名规范
1 常见命名规则 比较著名的命名规则首推匈牙利命名法, 这种命名方法是由Microsoft程序员查尔斯·西蒙尼(Charles Simonyi) 提出的。 其主要思想是“在变量和函数名中加入前缀以增进人们对程序的理解”。 匈牙利命名法关键是:标识符的名字以一个或者多个小写字母开头作为前缀; 前缀之后的是首字母大写的一个单词或多个单词组合,该单词要指明变量的用途。 例如:lpszStr, 表示指向一个以'\0'结尾的字符串(sz)的长指针(lp)变量。 骆驼(Camel)命名法近年来越来越流行, 在许多新的函数库和Java这样的平台下使用得当相多。 骆驼命名法,正如它的名称所表示的
[单片机]
51单片机C语言学习 5
上一节我们学习了KEIL C51编译器所支持的数据类型。而这些数据类型又是怎么用在常量和变量的定义中的呢?又有什么要注意的吗?下面就来看看吧。晕!你还区分不清楚什么是常量,什么是变量。常量是在程序运行过程中不能改变值的量,而变量是可以在程序运行过程中不断变化的量。变量的定义可以使用所有C51编译器支持的数据类型,而常量的数据类型只有整型、浮点型、字符型、字符串型和位标量。这一节我们学习常量定义和用法,而下一节则学习变量。 常量的数据类型说明是这样的 1.整型常量可以表示为十进制如123,0,-89等。十六进制则以0x开头如0x34,-0x3B等。长整型就在数字后面加字母L,如104L,034L,0xF34
[单片机]
avr单片机带小数点数码管的程式
//------------2_8数码管键调时带小数点功能 #include iom128v.h #define uchar unsigned char #define uint unsigned int #define P0_1 PORTA |= (1 0) #define P0_0 PORTA &=~ (1 0) #define P1_1 PORTA |= (1 1) #define P1_0 PORTA &=~ (1 1) #define P2_1 PORTA |= (1 2) #define P2_0 PORTA &=~ (1 2) #define P3_1 PORTA |= (1 3) #define P3_0 PO
[单片机]
中断系统的控制寄存器及中断程序举例
中断 系统有两个控制寄存器IE和IP,它们分别用来设定各个 中断 源的打开/关闭和中断优先级。此外,在TCON中另有4位用于选择引起外部中断的条件并作为标志位。 1.中断允许寄存器--IE IE在特殊功能寄存器中,字节地址为A8H,位地址(由低位到高位)分别是A8H-AFH。 IE用来打开或关断各中断源的中断请求,基本格式如下图二所示: 图片1 EA:全局中断允许位。EA=0,关闭全部中断;EA=1,打开全局中断控制,在此条件下,由各个中断控制位确定相应中断的打开或关闭。 ×:无效位。 ES:串行I/O中断允许位。ES=1,打开串行I/O中断;ES=0,关闭串行I/O中断。 ETl;定时器/计数器1中断允许位。ETl=
[单片机]
使用AVR单片机驱动舵机
1.舵机驱动的基本原理 (可以参考http://blog.sina.com.cn/s/blog_8240cbef01018hu1.html) 控制信号由接收机的通道进入信号调制芯片,获得直流偏置电压。它内部有一个基准电路,产生周期为20ms,宽度为1.5ms的基准信号,将获得的直流偏置电压与电位器的电压比较,获得电压差输出。最后,电压差的正负输出到电机驱动芯片决定电机的正反转。当电机转速一定时,通过级联减速齿轮带动电位器旋转,使得电压差为0,电机停止转动。 简单的来讲,就是输出一个周期为20Ms,不同的占空比对应舵机转过不同的角度。 难点主要在于 舵机控制信号需要保持,这样就比用脉冲控制步进电机要复杂一些。 你需要
[单片机]
avr单片机 Mega16定时器实验报告
1、实验目的 通过实验,掌握定时器的使用方法。着重掌握定时中断的使用! 2、实验内容 1 使用Mega16单片机的timer0产生1ms间隔的定时中断(建议采用application builder,既可以用Normal工作模式也可以使用CTC模式),(1)在定时中断中实现4位数码管的动态刷新。(2)在1ms的定时中断中设计100mS的时间标志位,在主程序中查询时间标志位,实现LED闪烁。 2 重新配置TImer0工作在PWM模式,用按键改变PWM的占空比,调节电机转速; 3、实验预习要求 仔细阅读教材中定时中断的范例; 4、实验步骤 1 启动ICCAVR,创建一个工程文件,配置timer0,实现10ms
[单片机]
S3C2440的中断的那些事儿(二) C语言部分讲解
1 void init_irq( ) 2 { 3 // S2,S3对应的2根引脚设为中断引脚 EINT0,ENT2 4 GPFCON &= ~(GPF0_msk | GPF2_msk); 5 GPFCON |= GPF0_eint | GPF2_eint; 6 7 // S4对应的引脚设为中断引脚EINT11 8 GPGCON &= ~GPG3_msk; 9 GPGCON |= GPG3_eint; 10 11 // 对于EINT11,需要在EINTMASK寄存器中使能它 12 EINTMASK &= ~(1 11); 13 14 /* 15 * 设定优先级:
[单片机]
51单片机控制SL811HS的USB主机底层驱动
引言 基于USB接口的设备使用方便,性价比高,因此在人们的工作和生活中得到了广泛的应用,如U盘,移动硬盘,光驱,USB摄像头,USB鼠标键盘等,同时,51系列单片机以其成熟的技术和高性价比吸引了大量国内用户,被广泛应用于测控和自动化领域,因此,如果在51单片机系统中增加USB主机接口,实现对USB从机设备的控制,则该单片机系统可以充分利用现有的各种USB从机设备,大大扩展单片机系统功能。 本设计实现了在51单片机系统中增加USB主机功能,采用普通51单片机外接专用USB接口芯片的方案,这种方案虽然会使系统传输速度受到限制,而且在稳定性有所欠缺,但此方案设计灵活性高,且易于移植,为低成本产品的开发提供了广阔前景,设计中采用51单
[单片机]