Board logo

标题: Freescale单片机能否象下面程序那样进行位定义 [打印本页]

作者: strongchen    时间: 2007-1-31 09:20

在CodeWarrior中用户可以进行位定义,而且所有寄存器的位定义在头文件中已经定义号了。用户可以参考头文件中的格式定义自己的变量或寄存器位。
作者: strongchen    时间: 2007-1-31 11:37

可以用宏定义,非常方便。
作者: maikeo    时间: 2007-1-31 12:42

请问那里有Freescale单片机宏定义资料,谢谢!
作者: seuafu2005    时间: 2007-1-31 14:19

你是说汇编宏定义?

一般在Codewarrior中可以这样定义
比如关继电器

Close_Delay: MACRO
clr 1,PTB
ENDM

在CW help里面搜索宏可以得到相关帮助
作者: maikeo    时间: 2007-1-31 14:45

唉!折腾了半天还是要 CLR 1,PTB
看来都没有仔细看我说的,也没明白我的意思.
本来是想看看Freescale单片机能否象其他单片机那样定义,见最上面例子;目的是为了让程序一目了然和方便编程不用老记着是PA口还是PB口或PC口,以后久了再拿程序出来更改也方便,就算硬件更改也只要改变定义就可以了;若还是误解我的意思的话只能说明我中文没学好.
作者: maikeo    时间: 2007-1-31 14:48

也许是我没说清楚,我的意思是:
   CLR   JDQ_OUT1      ;关继电器(有位定义功能一目了然不用管他是哪个I/O口,

                        ;程序修改也方便,硬件改动只要把前面位定义改掉即可不用

                         ;管后面程序)
-----------------------------------------------------------
而非如下那样(这种定义意义不大)
   JDQ_OUT1   EQU   0      B.0
      .
      .
      .
   BCLR    JDQ_OUT1,PTB    ;还得写"PTB",编程时还得去留意是PTA还是PTB口,改硬件
                           ;时都得找到相应的程序把"PTB"改为"PTA"(假设改为PA口)
                           ;所以说这种定义意义不大.



[此贴子已经被作者于2007-1-31 14:48:37编辑过]


作者: maikeo    时间: 2007-1-31 14:49     标题: Freescale单片机能否象下面程序那样进行位定义

Freescale单片机能否象下面程序那样进行位定义

;**************************************************************************
; 控制寄存器定义
;**************************************************************************
JDQ_OUT1   EQU   PA.5     ;继电器 (硬件改动只要把位定义改掉即可不用管后面程序)
D164_SDA   EQU   PA.6
D164_CLK   EQU   PA.7



;
code .section at 0 'code'
   ORG   00H
   JMP   RESET
   ORG   04H
   JMP   INTEXT
   ORG   08H
   JMP   INTTMR
   ORG   0CH
   JMP   INTAD
;**************************************************************************
; 主 程 序(复位地址)
;**************************************************************************
; ORG   00H
RESET:  CLR   INTC   ;禁止所有中断
        CLR   ADCR
           。
           。
           。
        CLR   JDQ_OUT1   ;关继电器(有位定义功能一目了然不用管他是哪个I/O口,

                         ;程序修改也方便,硬件改动只要把前面位定义改掉即可不用

                         ;管后面程序)

[此贴子已经被作者于2007-1-30 21:41:08编辑过]

[此贴子已经被作者于2007-1-31 14:49:32编辑过]


作者: seuafu2005    时间: 2007-1-31 15:11

我明白你的意思,只是我引的例子给你了错觉
在CW中,没有和你最上面一模一样的方式,但是可以通过宏定义等方式来做相同的功能
比如你对PTA口的5,6,7bit做了这个定义,希望用CLR JDQ_OUT1 这个语句来进行一个关的操作
JDQ_OUT1 EQU PA.5
D164_SDA EQU PA.6
D164_CLK EQU PA.7

在CW中可以通过如下方式来做
JDQ_OUT1 EQU PTAD_PTAD5
D164_SDA EQU PTAD_PTAD6
D164_CLK EQU PTAD_PTAD7
然后定义宏
CLR_BIT: MACRO
bclr \1,PTAD
ENDM

在程序中可以如下操作
CLR_BIT JDQ_OUT1

这完全可以等同于你原先的例子
作者: maikeo    时间: 2007-2-4 10:05

好麻烦哦!感觉好象是可以,但我看不太懂,DATASHEET中没有介绍这种用法,CLR_BIT: MACRO中的“MACRO”是何东东,“bclr \1,PTAD”是清PTA中的某位吗?那么置位是否改为“BSET \1,PTAD”就可以了,这些东东那里有资料哇。

[此贴子已经被作者于2007-2-4 10:05:24编辑过]


作者: seuafu2005    时间: 2007-2-5 09:43

macro就是表示定义一个宏,在codewarrior中写入的话自动会显示蓝色,表示宏定义。
\1,就表示宏中的一个参数,置位的方式就是你写的那种。
这个在CodeWarrior中是支持的,可以查看codewarrior相关的使用帮助。




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0