/*初始化*/
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
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)