1、实验5汇编语言程序结构实验5 汇编语言程序结构 一、 实验目的1. 掌握编写和调试汇编语言程序的方法;2. 掌握模块化汇编语言程序设计方法3. 了解简单电路的控制方法二、 实验任务1. 简单电子表的设计1) 硬件连接2) 延时子程delay: PUSH R14 PUSH R15MOV #4h, R15 ww2: MOV #0x0FFF, R14 ;外层循环ww1: DEC R14 ;内层循环JNZ ww1DEC R15JNZ ww2POP R15POP R14 RET3) 完整程序程序框图如下:程序代码如下:#include msp430.h ; #define controlled incl
2、ude file NAME main ; module name PUBLIC main ; make the main label vissible ; outside this module ORG 0FFFEh DC16 init ; set reset vector to init label RSEG CSTACK ; pre-declaration of segment RSEG CODE ; place program in CODE segmentinit: MOV #SFE(CSTACK), SP ; set up stackmain: NOP ; main program
3、MOV.W #WDTPW+WDTHOLD,&WDTCTL ; Stop watchdog timer 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
4、;p2 p4 p5输出端口初始化 w0: MOV.B #0FFH,R6 MOV #4,R7 ;初始化控制分钟输出的R6以及为其计数的R7w1: MOV #60,R4 MOV.B #0FFH,R5 ;初始化控制秒输出的R5以及为其计数的R4w2: MOV.B R5,&P2OUT CALL #delay DEC R5 DEC R4 JNZ w2 ;秒循环 DEC R6 MOV.B R6,&P5OUT DEC R7 JNZ w1 ;分钟循环 MOV.B #0FFH,&P2OUT BIC.B #BIT1,P4OUT ;满4分钟,蜂鸣器响 CALL #delay BIS.B #BIT1,P4OUT JM
5、P again ;重复上述过程 delay: PUSH R14 ;延时子程 PUSH R15 MOV #4h, R15 ww2: MOV #0x0FFF, R14ww1: DEC R14 JNZ ww1 DEC R15 JNZ ww2 POP R15 POP R14 RET END4) 选做:增加按键控制功能程序框图如下:程序代码如下:#include msp430.h ; #define controlled include file NAME main ; module name PUBLIC main ; make the main label vissible ; outside th
6、is module ORG 0FFFEh DC16 init ; set reset vector to init label RSEG CSTACK ; pre-declaration of segment RSEG CODE ; place program in CODE segmentinit: MOV #SFE(CSTACK), SP ; set up stackmain: NOP ; main program MOV.W #WDTPW+WDTHOLD,&WDTCTL ; Stop watchdog timer MOV.B #0,&P2SEL MOV.B #0FFH,&P2DIR ;P
7、2置为基本/输出端口(控制秒值) 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 ;p2 p4
8、 p5输出端口初始化 w0: MOV.B #0FFH,R6 MOV #4,R7 ;初始化控制分钟输出的R6以及为其计数的R7w1: MOV #60,R4 MOV.B #0FFH,R5 ;初始化控制秒输出的R5以及为其计数的R4w2: MOV.B R5,&P2OUT CALL #delay DEC R5 CALL #test ;调用检测按键子程,检测按键是否按下 DEC R4 JNZ w2 ;秒循环 DEC R6 MOV.B R6,&P5OUT DEC R7 JNZ w1 ;分钟循环 MOV.B #0FFH,&P2OUT BIC.B #BIT1,P4OUT ;满4分钟,蜂鸣器响 CALL #de
9、lay BIS.B #BIT1,P4OUT JMP again ;重复上述过程 delay: PUSH R14 ;延时子程 PUSH R15 MOV #4h, R15 ww2: MOV #0x0FFF, R14ww1: DEC R14 JNZ ww1 DEC R15 JNZ ww2 POP R15 POP R14 RET test: PUSH SR ;检测按键子程k2: BIT.B #BIT0,&P1IN ;检测K2(清零)是否按下 JNZ k4 ;否,跳转检测K4(暂停)是否按下 MOV.B #0FFH,&P2OUT ;是,秒清零 BIS.B #BIT0+BIT1,&P5OUT ;分钟清零
10、MOV.B #0FFH,R6 MOV #4,R7 MOV #60,R4 MOV.B #0FFH,R5 ;重置R6 R7 R4 R5 JMP k3 ;跳转去检测K3(开始)是否按下 k3: BIT.B #BIT1,&P1IN ;开始是否按下? JNZ k3 ;否,继续检测kk3: BIT.B #BIT0,&P1IN ;检测K2(清零)是否按下 JZ k2 ;是,去K2执行清零操作 BIT.B #BIT1,&P1IN ;否,检测K3(继续)是否按下 JNZ kk3 ;否,继续检测是否清零 k4: BIT.B #BIT2,&P1IN ;检测K4(暂停)是否按下 JZ kk3 ;是,检测K3(继续)是
11、否按下 POP SR ;否,结束检测 RET END 2. 数码管的显示控制1) 数码管按顺序显示09和A、b、C、d、E、F程序框图如下:程序代码如下:#include msp430.h ; #define controlled include file NAME main ; module name PUBLIC main ; make the main label vissible ; outside this module ORG 0FFFEh DC16 init ; set reset vector to init label RSEG DATA16_CLEDdata:DB 0x3F
12、,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07 DB 0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71 RSEG CSTACK ; pre-declaration of segment RSEG CODE ; place program in CODE segmentinit: MOV #SFE(CSTACK), SP ; set up stackmain: NOP ; main program MOV.W #WDTPW+WDTHOLD,&WDTCTL ; Stop watchdog timer MOV.B #0,&P6SEL MOV.B
13、#0FFH,&P6DIR MOV.B #0H,&P6OUT ;设置P6端口为基本/输出端口并初始化 MOV #LEDdata,R7 ;R7记录常量数据段首地址 BIS.B #BIT1,&P6OUT ;P6.1输出端口置为1back: MOV.B #16,R6 ;计数变量,为数据段数据总个数again: MOV.B 0(R7),R4 ;取出R7指向的数据给R4 MOV.B #8,R5 ;记录一个数据的总位数 w0: RLA.B R4 ;将R4中数据最高位左移到进位C JNC w1 ;若最高位为0(没有进位),转到w1 BIS.B #BIT4,&P6OUT ;若最高位为1,置P6.4OUT为1 J
14、MP w2 ;转到w2P6.2OUT输出脉冲 w1: BIC.B #BIT4,&P6OUT ;最高位为0,置P6.4OUT为0 w2: BIS.B #BIT2,&P6OUT BIC.B #BIT2,&P6OUT ;P6.2OUT输出一个脉冲 DEC R5 JNZ w0 ;重复输出,直到8位数全部输出完毕 BIS.B #BIT3,&P6OUT BIC.B #BIT3,&P6OUT ;P6.3输出脉冲,数码管去显示 CALL #delay INC R7 DEC R6 JNZ again ;重复以上过程 MOV #LEDdata,R7 ;初始化R7 JMP back ;重复整个过程 delay: P
15、USH R14 ;延时子程 PUSH R15 MOV #4h, R15 ww2: MOV #0xFFFF, R14ww1: DEC R14JNZ ww1 DEC R15 JNZ ww2 POP R15 POP R14 RET END2) (选做)编程实现按下KEY8KEY1键时,数码管显示81的数字。程序框图如下:(其中显示部分与1)相同)程序代码如下:#include msp430.h ; #define controlled include file NAME main ; module name PUBLIC main ; make the main label vissible ; o
16、utside this module ORG 0FFFEh DC16 init ; set reset vector to init label RSEG DATA16_CLEDdata:DB 0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F RSEG CSTACK ; pre-declaration of segment RSEG CODE ; place program in CODE segmentinit: MOV #SFE(CSTACK), SP ; set up stackmain: NOP ; main program MOV.W #WDTPW+WD
17、THOLD,&WDTCTL ; Stop watchdog timer 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 JNZ k2 ;否,去检测K2 MOV #LEDdata+0,R7 ;是,去相应数据给R7 JMP display ;去显示R7内容k2: BIT.B #BIT1,&P1IN JNZ k3 MOV #LEDdata+1,R7 JMP
18、 displayk3: BIT.B #BIT2,&P1IN JNZ k4 MOV #LEDdata+2,R7 JMP displayk4: BIT.B #BIT3,&P1IN JNZ k5 MOV #LEDdata+3,R7 JMP displayk5: BIT.B #BIT4,&P1IN JNZ k6 MOV #LEDdata+4,R7 JMP displayk6: BIT.B #BIT5,&P1IN JNZ k7 MOV #LEDdata+5,R7 JMP displayk7: BIT.B #BIT6,&P1IN JNZ k8 MOV #LEDdata+6,R7 JMP displayk8: BIT.B #BIT7,&P1IN JNZ k1 MOV #LEDdata+7,R7 JMP display display: ;显示子程,内容与上一程序雷同,不在赘述 MOV.B 0(R7),R4 MOV.B #8,R5 w0: RLA.B R4 JNC w1 BIS.B #BIT4,&P6OUT JMP w2 w1: BIC.B #BIT4,&P6OUT w2: BIS.B #BIT2,&P6OUT BIC.B #BIT2,&P6OUT DEC R5 JNZ w0 BIS.B #BIT3,&P6OUT BIC.B #BIT3,&P6OUTJMP k1 END
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1