这段代码来自这篇里用51单片机 汇编语言 做简单的电子琴 - 资料共享 (51hei.com)
SONG1:
MOV A, 30H;将偏移量传入A
MOV DPTR, #SONG;取得歌曲表的首地址
MOVC A, @A + DPTR;取得相应音符
JZ OVER;若8位全为0表示播放歌曲结束
MOV R2, A
ANL A, #0FH;从低4位取出节拍
MOV R5, A;存入R5,用于定时器的中断服务程序
MOV A, R2;再导入R2
SWAP A
ANL A, #0FH;取出频率向量
JNZ SING;若为0表示无声
CLR TR0 ;不记数
JMP D1
;取出频率(计数值)的程序段
SING:
DEC A;减1,因为要从0位置开始
RL A;在计数值表中以字存储,乘2才得到正确位置
MOV 22H, A;将位置暂存
MOV DPTR, #TAB1;计数值表
MOVC A, @A + DPTR
MOV TH0, A;取到的高位放入TH0
MOV 21H, A;暂存到21H,用于中断程序
MOV A, 22H
INC A;取低位地址
MOVC A, @A + DPTR
MOV TL0, A;放入TL0
MOV 20H, A;暂存到20H,用于中断程序
SETB TR0;计数器开始计数
D1:
ACALL DELAY
INC 30H;播放完一个音符后将偏移量加1
JMP SONG1
作者注释是用来播放歌曲的,但是为什么要取高四位,低四位?整段代码又是什么意思
|