实验5汇编语言程序结构.docx
《实验5汇编语言程序结构.docx》由会员分享,可在线阅读,更多相关《实验5汇编语言程序结构.docx(12页珍藏版)》请在冰豆网上搜索。
实验5汇编语言程序结构
实验5汇编语言程序结构
一、实验目的
1.掌握编写和调试汇编语言程序的方法;
2.掌握模块化汇编语言程序设计方法
3.了解简单电路的控制方法
二、实验任务
1.简单电子表的设计
1)硬件连接
2)延时子程
delay:
PUSHR14
PUSHR15
MOV#4h,R15
ww2:
MOV#0x0FFF,R14;外层循环
ww1:
DECR14;内层循环
JNZww1
DECR15
JNZww2
POPR15
POPR14
RET
3)完整程序
程序框图如下:
程序代码如下:
#include"msp430.h";#definecontrolledincludefile
NAMEmain;modulename
PUBLICmain;makethemainlabelvissible
;outsidethismodule
ORG0FFFEh
DC16init;setresetvectorto'init'label
RSEGCSTACK;pre-declarationofsegment
RSEGCODE;placeprogramin'CODE'segment
init:
MOV#SFE(CSTACK),SP;setupstack
main:
NOP;mainprogram
MOV.W#WDTPW+WDTHOLD,&WDTCTL;Stopwatchdogtimer
MOV.B#0,&P2SEL
MOV.B#0FFH,&P2DIR;P2置为基本/输出端口(控制秒值)
BIC.B#BIT1,&P4SEL
BIS.B#BIT1,&P4DIR;P4置为基本/输出端口(控制蜂鸣器)
BIC.B#BIT0+BIT1,&P5SEL
BIS.B#BIT0+BIT1,&P5DIR;P5置为基本/输出端口(控制分钟值)
again:
BIS.B#BIT1,&P4OUT
MOV.B#0FFH,&P2OUT
BIS.B#BIT0+BIT1,&P5OUT;p2p4p5输出端口初始化
w0:
MOV.B#0FFH,R6
MOV#4,R7;初始化控制分钟输出的R6以及为其计数的R7
w1:
MOV#60,R4
MOV.B#0FFH,R5;初始化控制秒输出的R5以及为其计数的R4
w2:
MOV.BR5,&P2OUT
CALL#delay
DECR5
DECR4
JNZw2;秒循环
DECR6
MOV.BR6,&P5OUT
DECR7
JNZw1;分钟循环
MOV.B#0FFH,&P2OUT
BIC.B#BIT1,P4OUT;满4分钟,蜂鸣器响
CALL#delay
BIS.B#BIT1,P4OUT
JMPagain;重复上述过程
delay:
PUSHR14;延时子程
PUSHR15
MOV#4h,R15
ww2:
MOV#0x0FFF,R14
ww1:
DECR14
JNZww1
DECR15
JNZww2
POPR15
POPR14
RET
END
4)选做:
增加按键控制功能
程序框图如下:
程序代码如下:
#include"msp430.h";#definecontrolledincludefile
NAMEmain;modulename
PUBLICmain;makethemainlabelvissible
;outsidethismodule
ORG0FFFEh
DC16init;setresetvectorto'init'label
RSEGCSTACK;pre-declarationofsegment
RSEGCODE;placeprogramin'CODE'segment
init:
MOV#SFE(CSTACK),SP;setupstack
main:
NOP;mainprogram
MOV.W#WDTPW+WDTHOLD,&WDTCTL;Stopwatchdogtimer
MOV.B#0,&P2SEL
MOV.B#0FFH,&P2DIR;P2置为基本/输出端口(控制秒值)
BIC.B#BIT1,&P4SEL
BIS.B#BIT1,&P4DIR;P4置为基本/输出端口(控制蜂鸣器)
BIC.B#BIT0+BIT1+BIT2,&P1SEL
BIC.B#BIT0+BIT1+BIT2,&P1DIR;P1的三个引脚置为基本/输入端口(控制按键)
BIC.B#BIT0+BIT1,&P5SEL
BIS.B#BIT0+BIT1,&P5DIR;P5置为基本/输出端口(控制分钟值)
again:
BIS.B#BIT1,&P4OUT
MOV.B#0FFH,&P2OUT
BIS.B#BIT0+BIT1,&P5OUT;p2p4p5输出端口初始化
w0:
MOV.B#0FFH,R6
MOV#4,R7;初始化控制分钟输出的R6以及为其计数的R7
w1:
MOV#60,R4
MOV.B#0FFH,R5;初始化控制秒输出的R5以及为其计数的R4
w2:
MOV.BR5,&P2OUT
CALL#delay
DECR5
CALL#test;调用检测按键子程,检测按键是否按下
DECR4
JNZw2;秒循环
DECR6
MOV.BR6,&P5OUT
DECR7
JNZw1;分钟循环
MOV.B#0FFH,&P2OUT
BIC.B#BIT1,P4OUT;满4分钟,蜂鸣器响
CALL#delay
BIS.B#BIT1,P4OUT
JMPagain;重复上述过程
delay:
PUSHR14;延时子程
PUSHR15
MOV#4h,R15
ww2:
MOV#0x0FFF,R14
ww1:
DECR14
JNZww1
DECR15
JNZww2
POPR15
POPR14
RET
test:
PUSHSR;检测按键子程
k2:
BIT.B#BIT0,&P1IN;检测K2(清零)是否按下
JNZk4;否,跳转检测K4(暂停)是否按下
MOV.B#0FFH,&P2OUT;是,秒清零
BIS.B#BIT0+BIT1,&P5OUT;分钟清零
MOV.B#0FFH,R6
MOV#4,R7
MOV#60,R4
MOV.B#0FFH,R5;;重置R6R7R4R5
JMPk3;跳转去检测K3(开始)是否按下
k3:
BIT.B#BIT1,&P1IN;开始是否按下?
JNZk3;否,继续检测
kk3:
BIT.B#BIT0,&P1IN;检测K2(清零)是否按下
JZk2;是,去K2执行清零操作
BIT.B#BIT1,&P1IN;否,检测K3(继续)是否按下
JNZkk3;否,继续检测是否清零
k4:
BIT.B#BIT2,&P1IN;检测K4(暂停)是否按下
JZkk3;是,检测K3(继续)是否按下
POPSR;否,结束检测
RET
END
2.数码管的显示控制
1)数码管按顺序显示0~9和A、b、C、d、E、F
程序框图如下:
程序代码如下:
#include"msp430.h";#definecontrolledincludefile
NAMEmain;modulename
PUBLICmain;makethemainlabelvissible
;outsidethismodule
ORG0FFFEh
DC16init;setresetvectorto'init'label
RSEGDATA16_C
LEDdata:
DB0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07
DB0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71
RSEGCSTACK;pre-declarationofsegment
RSEGCODE;placeprogramin'CODE'segment
init:
MOV#SFE(CSTACK),SP;setupstack
main:
NOP;mainprogram
MOV.W#WDTPW+WDTHOLD,&WDTCTL;Stopwatchdogtimer
MOV.B#0,&P6SEL
MOV.B#0FFH,&P6DIR
MOV.B#0H,&P6OUT;设置P6端口为基本/输出端口并初始化
MOV#LEDdata,R7;R7记录常量数据段首地址
BIS.B#BIT1,&P6OUT;P6.1输出端口置为1
back:
MOV.B#16,R6;计数变量,为数据段数据总个数
again:
MOV.B0(R7),R4;取出R7指向的数据给R4
MOV.B#8,R5;记录一个数据的总位数
w0:
RLA.BR4;将R4中数据最高位左移到进位C
JNCw1;若最高位为0(没有进位),转到w1
BIS.B#BIT4,&P6OUT;若最高位为1,置P6.4OUT为1
JMPw2;转到w2P6.2OUT输出脉冲
w1:
BIC.B#BIT4,&P6OUT;最高位为0,置P6.4OUT为0
w2:
BIS.B#BIT2,&P6OUT
BIC.B#BIT2,&P6OUT;P6.2OUT输出一个脉冲
DECR5
JNZw0;重复输出,直到8位数全部输出完毕
BIS.B#BIT3,&P6OUT
BIC.B#BIT3,&P6OUT;P6.3输出脉冲,数码管去显示
CALL#delay
INCR7
DECR6
JNZagain;重复以上过程
MOV#LEDdata,R7;初始化R7
JMPback;重复整个过程
delay:
PUSHR14;延时子程
PUSHR15
MOV#4h,R15
ww2:
MOV#0xFFFF,R14
ww1:
DECR14
JNZww1
DECR15
JNZww2
POPR15
POPR14
RET
END
2)(选做)编程实现按下KEY8~KEY1键时,数码管显示8~1的数字。
程序框图如下:
(其中显示部分与1)相同)
程序代码如下:
#include"msp430.h";#definecontrolledincludefile
NAMEmain;modulename
PUBLICmain;makethemainlabelvissible
;outsidethismodule
ORG0FFFEh
DC16init;setresetvectorto'init'label
RSEGDATA16_C
LEDdata:
DB0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F
RSEGCSTACK;pre-declarationofsegment
RSEGCODE;placeprogramin'CODE'segment
init:
MOV#SFE(CSTACK),SP;setupstack
main:
NOP;mainprogram
MOV.W#WDTPW+WDTHOLD,&WDTCTL;Stopwatchdogtimer
MOV.B#0,P6SEL
MOV.B#0FFH,&P6DIR
MOV.B#0H,&P6OUT
MOV#LEDdata,R7
BIS.B#BIT1,&P6OUT
MOV.B#0,&P1SEL
MOV.B#0,&P1DIR
k1:
BIT.B#BIT0,&P1IN;是否按下K1
JNZk2;否,去检测K2
MOV#LEDdata+0,R7;是,去相应数据给R7
JMPdisplay;去显示R7内容
k2:
BIT.B#BIT1,&P1IN
JNZk3
MOV#LEDdata+1,R7
JMPdisplay
k3:
BIT.B#BIT2,&P1IN
JNZk4
MOV#LEDdata+2,R7
JMPdisplay
k4:
BIT.B#BIT3,&P1IN
JNZk5
MOV#LEDdata+3,R7
JMPdisplay
k5:
BIT.B#BIT4,&P1IN
JNZk6
MOV#LEDdata+4,R7
JMPdisplay
k6:
BIT.B#BIT5,&P1IN
JNZk7
MOV#LEDdata+5,R7
JMPdisplay
k7:
BIT.B#BIT6,&P1IN
JNZk8
MOV#LEDdata+6,R7
JMPdisplay
k8:
BIT.B#BIT7,&P1IN
JNZk1
MOV#LEDdata+7,R7
JMPdisplay
display:
;显示子程,内容与上一程序雷同,不在赘述
MOV.B0(R7),R4
MOV.B#8,R5
w0:
RLA.BR4
JNCw1
BIS.B#BIT4,&P6OUT
JMPw2
w1:
BIC.B#BIT4,&P6OUT
w2:
BIS.B#BIT2,&P6OUT
BIC.B#BIT2,&P6OUT
DECR5
JNZw0
BIS.B#BIT3,&P6OUT
BIC.B#BIT3,&P6OUT
JMPk1
END