jtd.asm

来自「用dsp编写的四个程序,关于数组,还有语音,录音功能的实现」· 汇编 代码 · 共 90 行

ASM
90
字号


		.title "jtd"
		.global _c_int00   ;将变量_c_int00说明为外部符号,程序入口地址1000。
		.mmregs            ;将TMS320各寄存器名定义为全局符号,这样就可以直接引用寄存器(符号)。

LED_ADDR	.set	1001h  ;交通灯的I/O地址

STATUS0      .set  60h ;0AA00H全部红灯: 05500H全部绿灯:0FF00H全部黄灯     
STATUS1      .set  61h ;南北红灯、东西绿灯
STATUS2      .set  62h ;南北红灯、东西黄灯
STATUS3      .set  63h ;南北绿灯、东西红灯
STATUS4      .set  64h ;南北黄灯、东西红灯
STA2_PRE_0   .set  65h ;块重复放入状态0
STA2_PRE_1   .set  66h ;块重复放入状态1
STA4_PRE_0   .set  67h ;块重复放入状态0
STA4_PRE_1   .set  68h ;块重复放入状态1

DELAY	.macro sec_tenth    ;延时 sec_tenth/10 秒
		STM sec_tenth-1,AR5
loop1?	STM #09h,AR6
loop0?	STM #19999,AR7
		BANZ $,*AR7-
		BANZ loop0?,*AR6-
		BANZ loop1?,*AR5-
		.endm            ;Endm 宏指令结束。
				.sect ".vectors"
reset:	B _c_int00		
		NOP
		NOP
		.space 4*127  ; 在目前段中,保留4*127个单元

		.text    ;text 段是源程序正文。经汇编后,紧跟.text 后的是可执行程序代码。
_c_int00

		LD #0h,DP    ;LD装入指令。设置数据页指针,DP=0H,则数据存储器地址为0000H~007FH。
		STM #3000h,SP;STM存储指令。SP设置堆栈指针,把累加器的低端存放到存储器映射寄存器中。
		SSBX INTM    ;指令SSBX INTM(置1)。禁止可屏蔽中段。
		SSBX SXM     ;指令SSBX SXM(置1)。SXM是状态寄存器ST1中第8位,当SXM=0,不扩展符号;当SXM=1,扩展符号。
		STM #07FFFh,SWWSR		;IO总线外部等待时间7个周期

		STM #0h,CLKMD    ; can see CLKMD, work, 0058H 
tst:		BITF CLKMD,#1h   ;BITF测试指令,测试立即数最后位。
		BC tst,TC        ;BC条件转移指令, TC是ST0中的测试/控制标志位。测试位等于1,TC=1
		STM #1007h,CLKMD ;CLKMD时钟模式寄存器。采用1倍频方式,20MHz工作
		;RPT #0FFh
		;NOP
		STM #0FFFFh,IFR     ;IFR中断标志寄存器。把IFR每位写1的用途,就是清除所有被挂起的中断。
		;LDM IFR, A   ; the above code doesn't work, Can't change IFR
		ORM #000h,IMR      ;IMR中断屏蔽寄存器。把IMR每位置0屏蔽该中断,置1表示允许中断。
    	ST  #0AA00H,STATUS0        ;1010 1010 0000 0000b.有1的位(高电平)显示红色。

LOOPB	PORTW STATUS0,LED_ADDR		;全部红灯
		DELAY #100					;延时1秒

circle	ST #6600H,STATUS1           ;0110 0110 0000 0000b。
	PORTW STATUS1,LED_ADDR		;南北红灯、东西绿灯
	    DELAY #200			;延时?秒
		STM #2h,BRC                 ;BRC块循环计数器赋值2H。
        RPTB flash1                 ;RPTE块重复。将重复操作的范围扩大到任意长度的循环回路。
        ST #2200H,STA2_PRE_1        ;0010 0010 0000 0000b。
        PORTW STA2_PRE_1,LED_ADDR   ;南北红灯、东西灯灭
        DELAY #30 
        ST  #6600H, STA2_PRE_0      ;0110 0110 0000 0000b。
        PORTW STA2_PRE_0,LED_ADDR   ;南北红灯、东西绿灯
        DELAY #30
flash1	NOP	;flash1块作用:;南北红灯、东西绿灯亮灭3次。
  
		ST #0EE00H, STATUS2         ;1110 1110 0000 0000b。
		PORTW STATUS2,LED_ADDR		;南北红灯、东西黄灯
		DELAY #30					;延时3秒
        ST  #9900H,STATUS3          ;1001 1001 0000 0000b。
		PORTW STATUS3,LED_ADDR		;南北绿灯、东西红灯
		DELAY #200					;延时20秒
		STM #4h,BRC                 ;BRC块循环计数器。
		RPTB flash2                 ;RPTE块重复。
		ST #08800H,STA4_PRE_1       ;1000 1000 0000 0000b。
		PORTW STA4_PRE_1,LED_ADDR   ;南北灯全灭、东西红灯
		DELAY #30				
		ST  #09900H, STA4_PRE_0     ;1001 1001 0000 0000b。
		PORTW STA4_PRE_0,LED_ADDR   ;南北绿灯、东西红灯
		DELAY #30
flash2	NOP  ;flash1块作用:;东西红灯、南北绿灯亮灭5次

		ST #0BB00H,STATUS4          ;1011 1011 0000 0000b。
		PORTW STATUS4,LED_ADDR		;南北黄灯、东西红灯
		DELAY #30					;延时3秒
        B circle                    ; B 无条件跳转指令。
        .end

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?