微机实验:第9章——8253练习

8253练习

在这里插入图片描述
补充接口程序实现以下要求:
8个LED灯自上而下依次点亮,每个LED灯亮1秒。此题中CLK0=1000HZ。

OUT373 EQU   0FF80H
IN245  EQU   0FF90H
TCON0  EQU   0FFA0H
TCONTR EQU   0FFA6H
 
CODE SEGMENT  
    ASSUME CS:CODE
START:	
    MOV BL, 01H
    
  	CALL INIT
CYCLE:
	MOV DX, IN245
	IN  AL, DX
	TEST AL, 00001000B
	JZ  NEXT
	ROL BL, 1
	CALL INIT

NEXT:
	MOV AL, BL
	MOV DX, OUT373
	OUT DX, AL
	JMP CYCLE
	
INIT PROC
    MOV AL, 30H ;0011 0000B
    MOV DX, TCONTR
    OUT DX, AL
    
    MOV DX, TCON0
    MOV AX, 1000
    OUT DX, AL
    MOV AL, AH
    OUT DX, AL   
    RET
INIT ENDP
	
CODE ENDS
END	START
好的,以下是用汇编语言实现的代码: ```assembly ORG 0000H ; 程序从地址 0000H 开始 MOV P1, #0FFH ; P1 设置为输出模式 MOV TMOD, #01H ; 设置计时器 0 为模式 1 MOV TH0, #0F9H ; 设置计时器 0 的初始值 MOV TL0, #0H ; 设置计时器 0 的初始值 SETB TR0 ; 启动计时器 0 MOV DPTR, #LED_TABLE ; 将 LED_TABLE 的地址存入 DPTR MOV R2, #08H ; 设置循环次数为 8 LOOP: MOVX A, @DPTR ; 将 DPTR 指向的内存读入累加器 A MOV P1, A ; 将累加器 A 的值输出到 P1 ACALL DELAY ; 调用 DELAY 子程序 INC DPTR ; DPTR 指针自增,指向下一个 LED DJNZ R2, LOOP ; 如果循环次数不为 0,继续循环 SJMP $ ; 程序结束,进入死循环 DELAY: MOV R1, #250 ; 设置循环次数为 250 DELAY_LOOP: DJNZ R1, DELAY_LOOP ; 循环 250 次 RET ; 返回主程序 LED_TABLE: ; LED_TABLE 表示 LED 的状态,0 表示1 表示灭 DB 00000001B ; 第一个 LED ,其他灭 DB 00000010B ; 第二个 LED ,其他灭 DB 00000100B ; 第三个 LED ,其他灭 DB 00001000B ; 第四个 LED ,其他灭 DB 00010000B ; 第五个 LED ,其他灭 DB 00100000B ; 第六个 LED ,其他灭 DB 01000000B ; 第七个 LED ,其他灭 DB 10000000B ; 第八个 LED ,其他灭 END ; 程序结束 ``` 这个程序使用了计时器 0 来产生延时,每个 LED 点亮时都会调用 DELAY 子程序来延时 1 。程序中使用了一个 LED_TABLE 数组来表示每个 LED 的状态,初始值为第一个 LED ,其他灭。在主程序中,我们使用一个循环来遍历 LED_TABLE 数组,每次循环都会点亮一个 LED,并调用 DELAY 子程序来延时。在循环结束后,程序会进入死循环,等待下一次运行。 需要注意的是,这个程序的延时是通过循环来实现的,因此需要根据 CLK0 的频率来设置循环次数。在这个程序中,我们设置 CLK0 为 1000HZ,每个循环大约需要 4ms 的时间,因此延时 1 需要循环 250 次。如果 CLK0 的频率不同,需要根据实际情况调整循环次数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值