飞思卡尔单片机 拨码开关控制LED灯 主程序

飞思卡尔单片机 拨码开关控制LED灯 主程序,第1张

飞思卡尔单片机的普通输入输出的某一个端口同一时刻只能做输入或者输出。且需事先初始化端口寄存器。'0'为输入,‘1’为输出。同时要清空数据寄存器内容。 比方说使用PORTA_PA0口控制单个外部共阳指示灯的显示,显然为输出控制。可以这样写

/*初始化*/

DDRA=0X01;//定义方向寄存器输出,也可以写成0Xff 只是其他的7个口不用

PORTA_PA0=1;//共阳 初始化指示灯不亮

/*主函数*/

PORTA_PA0=0;//PA0端口输出0 低电平 指示灯亮

比方说使用PORTA_PA3口读取外部电平信号,显然为输入控制。可以这样写

/*初始化*/

DDRA=0X00;//定义方向寄存器输入,8个端口全为输入

/*主函数*/

unsigned char LED;

LED=PORTA_PA3;//读入端口数据

你上面的程序 我的理解是这样的,程序事先有宏定义LED_DD、 led :

LED_DD = 0x0F //方向寄存器 高四位输入(拨码开关) 低四位输出

led = 0xFF //给定初始值

for()

{

Num = led //读拨码开关

led = Num>>4//送显示

delay(10)

}

单片机微控制器的工作原理是靠内部时钟晶振来执行程序的,每一个时钟周期执行一步程序。其实for循环前面的程序仅仅是完成单片机端口初始化、系统参数初始化。程序一直在for循环和中断服务程序里执行,也就是遵循扫描的原理。 没了for循环 你的程序就只能读取端口的状态一次执行到main()函数最后一条指令就停止工作了。

// 16位累加器测速程序(PACB累加器),PT0口输入脉冲

//每次记录脉冲时间可修改宏:TIME_INTER

//

///////////////////////////////////////////////////////////////////

#include <hidef.h> /* common defines and macros */

#include <mc9s12dg128.h>/* derivative information */

#pragma LINK_INFO DERIVATIVE "mc9s12dg128b"

#define TIME_INTER 1000 //1000个ms=1s

unsigned int Get_pulse

void Start_PLL(void) //busCLK=32M

{

REFDV=0x01 // PLLCLK =2*OSCCLK*(SYNR + 1)/(REFDV + 1)

SYNR=0x03 //=2*16M*3/2=64M

asm{

BRCLR CRGFLG,#$08,*

BSET CLKSEL,#$80

}

}

void PACBInit()

{

TCTL4 = 0X02 //下降沿捕捉脉冲

PBCTL = 0x40 //级联两个8位累加器(PAC0和PAC1)

ICPAR = 0X03 //使能累加器

PACN10 = 0X0000

}

void MDCInit(void)

{

MCCTL = MCCTL&0Xfb//模数计数器禁止运行

MCCTL = 0Xe3 //允许中断,模数计数方式

//返回时重新加载所用的常数,分频常数为16

MCCTL = MCCTL|0X04//模数计数器使能

MCCNT = 2000 //(1/32M)*16*2000= 1ms

MCCTL = MCCTL|0X08 //把模数常数寄存器的值加载到模数计数器FLMC

}

void main(void)

{

DisableInterrupts

Start_PLL()

PACBInit()

MDCInit()

EnableInterrupts

for()

{

}

}

#pragma CODE_SEG __NEAR_SEG NON_BANKED

void interrupt 26 MDC_ISR(void)

{

static unsigned int number_count

MCFLG = 0x80

number_count ++

if( number_count==TIME_INTER)//1秒取一次

{

number_count=0

Get_pulse = PACN10

PACN10 = 0X0000

}

}

LDX 70H,X H:X=(0F00H),(0070H)=(0FH)

说明:LDX 70H,X 指令将将内存地址为 70H 和 71H 的两个字节中的值作为 X 寄存器的初始值,因此,X=0F00H,(0070H)=0FH。

PSHX H:X=(0F00H), SP=(00FDH), (SP)=00H

说明:PSHX 指令将 X 寄存器的值压入堆栈中,同时 SP 寄存器减 2,因此,SP=00FDH,(SP)=0FH。

STA 70H (0070H)=0FFH, A=0FFH

说明:STA 70H 指令将 A 寄存器中的值 0FFH 存储到内存地址 70H 中,因此,(0070H)=0FFH,A=0FFH。

PULA A=0FH, SP=00FFH

说明:PULA 指令将堆栈中的值d出到 A 寄存器中,同时 SP 寄存器加 2,因此,A=0FH,SP=00FFH。在执行 PULA 指令后,堆栈中原来的值已经被d出,堆栈中不再有值。

以下是更详细的步骤说明:

初始状态:

SP = 00FFH 栈顶指针初始化为 00FFH

A = 0FFH 寄存器 A 初始化为 0FFH

H:X = 0000H 寄存器 H:X 初始化为 0000H

(0070H) = 0FH 内存地址 0070H 中的值为 0FH

执行指令 "LDX 70H,X":

LDX 70H,X 将内存地址 70H 和 71H 中的值 0FH 和 00H 组成的字作为 X 寄存器的初始值

因此 X = 0F00H,(0070H) = 0FH

执行指令 "PSHX":

PSHX 将 X 寄存器的值 0F00H 压入堆栈中

SP = 00FDH,(00FDH) = 00H,(00FEH) = 0FH

执行指令 "STA 70H":

STA 70H 将 A 寄存器的值 0FFH 存储到内存地址 70H 中

(0070H) = 0FFH,A = 0FFH

执行指令 "PULA":

PULA 将堆栈中的值d出到 A 寄存器中

SP = 00FFH,A = 0FH

最终状态:

SP = 00FFH      堆栈指针指向空闲位置

A = 0FH         寄存器 A 中的值为 0FH

H:X = 0F00H     寄存器 H:X 中的值为 0F00H

(0070H) = 0FFH  内存地址 0070H 中的值为 0FFH


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11505018.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-16
下一篇 2023-05-16

发表评论

登录后才能评论

评论列表(0条)

保存