嵌入式mcu-m16c应用举例.ppt
文本预览下载声明
嵌入式MCU应用举例 一.预备知识: 预处理命令#pragma 介绍一些常用的#pragma命令的扩展功能。 1.用于SB相对地址预处理命令: #pragma SBDATA 变量名 对变量进行声明,访问该变量时NC30会生成AS30伪指令“.SBSYM”,并使用SB相对寻址模式。这样可以生成高效的ROM代码,下图是“#pragma SBDATA”命令的图形说明。 2.生成位操作指令 NC30允许用户以位为单位处理数据。设置一个位段来实现位操作,位段利用结构体定义符号,其格式如下: stuct tag{ 类型说明符号 位符号:比特数 }; 引用一个位符号时,用点“.”分割开: 变量名.位符号 指定该位的方法和对结构体的处理相同。位段在存储器中的位置的分配与编译器有关。NC30对位段分配存储区时有两条规则: 从LSB开始顺次分配 另一种类型的数据放到下一个地址 下图是如何对位段分配存储区的例子: 设定位段后,虽然已可以在程序中处理位符号,但生成的是一条运算、逻辑指令,并不是位指令,若使用扩展功能 “# pragma BIT”对位段进行声明,则可以生成代码效率更高的“直接位操作指令” 下图示出了一个例子,说明了如何写这条预处理命令及其展开情况的。 除了用“#pragma BIT”声明的数据外,对下面的变量NC30编译器也可以生成直接位操作指令: 用“pragma SBDATA”声明的变量 用“pragma ADDRESS”声明的变量,且其地址位于绝对地址00000到01FFF内 用‘-fbit’指定的近程变量。 3.I/O接口的控制 在控制内置I/O接口时,需指定变量的绝对地址。在NC30中可以使用扩展功能 “#pragma ADDRESS”来指定变量的绝对地址,其格式如下: #pragma ADDRESS 变量名 绝对地址 注意只对函数外定义的变量和在函数内定义的静态变量有效。扩展功能 “#pragma ADDRESS”也可以用来设置SFR区。使用这种方法设置SFR时,一般准备一个独立的文件,并将其包含在源程序中。 下图是一个SFR区定义文件的例子 二.I/O口控制 1.LED特性 LED是发光二极管的简称,它通过一定的电流发光,LED有极性 2.LED的电路连接 在M16C/62C学习板上,将电阻和LED分别接在M30620FCAFP的p7口上,如下图所示: 3.LED亮灯程序(2) 编写使LED1和LED2交错亮的程序 编写顺序如下: 1.源文件的准备 启动程序和向量文件按照原来的使用,仅做成控制I/O的主程序。 (1).在硬盘里做新的文件夹,文件夹名采用集成开发环境TM的项目名,此处用”sampleA” (2).对于sampleA.c”,采用编译程序用合乎规则的内容编写。 2.编译 用集成开发环境TM做成项目,并进行编译,做成在调试器(kd30)上的可运行的文件(sampleA.x30)以及用闪存写入器写入闪存的文件(sampleA.mot) 3.调试 用调试程序确认其操作。 4.将程序固化到ROM 控制程序清单如下: #pragma ADDRESS P7 3edh /*定义P7口的地址*/ #pragma ADDRESS PD7 3efh void _main(void) unsigned char P7,PD7; /*在p7方向寄存器和数据器里装入值作为变量*/ /*宏定义*/ #define LED_off /*LED1,2灯灭*/ #define LED1_on /*LED1灯亮,LED2灯灭*/ #define LED2_on /*LED1灯灭,LED2灯亮*/ main( ) { unsigned long i; P7=LED_off; /*p7口输出H,灯灭*/ PD7=0Xff; /*p7口方向输出*/ for(; ;) { P7=LED1_on; /*LED1灯亮*/ for(i=0x8ffff; ;) /*等待(软等待)*/ { i--; if(i==0) break; } P7=LED2_on; /*LED2灯亮*/ for(i=0x8ffff; ; ) /*软等待
显示全部