LJMP MAIN
ORG 0100H主程序地址
MAIN: JNB P1.0,P10 哪个键按下,显示哪个波形
JNB P1.1,P11
JNB P1.2,P12
JNB P1.3,P13
LJMP MAIN 没有键按下返回主程序循环
P10: MOV R7,#00H 方波波形,R7为特征码,放00,表示方波
LCALL SQU 调用方波波形函数
LJMP MAIN 调用完返回主程序循环
P11: MOV R7,#01H 01表示SAW波
LCALL SAW
LJMP MAIN
P12: MOV R7,#02H
LCALL TRI
LJMP MAIN
P13: MOV R7,#03H
LCALL SIN
LJMP MAIN
SQU: JNB P1.1,N1 方波函数,如果有其他键按下
JNB P1.2,N2 退出程序
JNB P1.3,N3
LJMP SSQU 没有键按下,到SSQU函数产生方波
N1: MOV R7,#01H 哪个键按下就在R7中记下特征做桥码
LJMP TC0
N2: MOV R7,#02H
LJMP TC0
N3: MOV R7,#03H
LJMP TC0
SSQU: CJNE R7,#00H,TC0R7不为0退出
MOV R0,#00H R0中放00
MOV DPTR,#7FFFH 这个应该是DAC0832的地址
K00: MOV A,#0FFH A中放FF,高缺灶电平
MOVX @DPTR,A A到0832转换
MOV P0,#0FFH 这一句不怎么懂,感觉可以去掉
MOV P2,#0FFH 值P2输入方纯扮猛式,P2是通过拨码按钮改
MOV A,P2 变数值,P2越大,波形周期越小
CPL A
MOV R3,A
L00: DEC R3
CJNE R3,#255,L00 这个循环改变周期
INC R0
INC R0
CJNE R0,#254,K00高电平波循环127次
MOV R0,#00H
K01: MOV A,#00H低电平,跟高电平差不多
MOVX @DPTR,A
MOV P0,#00H
MOV P2,#0FFH
MOV A,P2
CPL A
MOV R3,A
L01: DEC R3
CJNE R3,#255,L01
INC R0
INC R0
CJNE R0,#254,K01
LJMP SQU 显示完一个波形,回到方波函数开始,判断有无其他按键
TC0: RET返回主函数
SAW: JNB P1.0,N4 判断有无其他按键,同方波
JNB P1.2,N5
JNB P1.3,N6
LJMP SSAW
N4: MOV R7,#00H
LJMP TC1
N5: MOV R7,#02H
LJMP TC1
N6: MOV R7,#03H
LJMP TC1
SSAW: CJNE R7,#01H,TC1 特征码不是01 退出
MOV R0,#0FFH RO中放即将输出的值
MOV DPTR,#7FFFH
K10: MOV A,R0 锯齿波的每个值
MOVX @DPTR,A 输出
MOV P0,R0
MOV P2,#0FFH 通过P2改变周期
MOV A,P2
CPL A
MOV R3,A
L10: DEC R3
CJNE R3,#255,L10
INC R0 通过R0加1 来显示锯齿波的斜坡
CJNE R0,#255,K10 RO不等于255,循环锯齿波的每个值
LJMP SAW 等于255,完成一个锯齿波周期,回锯齿波开始
TC1: RET 退出
TRI: JNB P1.0,N7 三角波,类似于两个相反的锯齿波
JNB P1.1,N8
JNB P1.3,N9
LJMP TTRI
N7: MOV R7,#00H
LJMP TC2
N8: MOV R7,#01H
LJMP TC2
N9: MOV R7,#03H
LJMP TC2
TTRI: CJNE R7,#02H,TC2
MOV R0,#00H
MOV DPTR,#7FFFH
K20: MOV A,R0
MOVX @DPTR,A
MOV P0,R0
MOV P2,#0FFH
MOV A,P2
CPL A
MOV R3,A
L20: DEC R3
CJNE R3,#255,L20
INC R0
INC R0
CJNE R0,#254,K20
K21: MOV A,R0
MOVX @DPTR,A
MOV P0,R0
MOV P2,#0FFH
MOV A,P2
CPL A
MOV R3,A
L21: DEC R3
CJNE R3,#255,L21
DEC R0
DEC R0
CJNE R0,#0,K21
LJMP TRI
TC2: RET
SIN: JNB P1.0,N10正弦波,是通过存储在代码区的一个数
JNB P1.1,N11组来显示值的
JNB P1.2,N12
LJMP SSIN
N10: MOV R7,#00H
LJMP TC3
N11: MOV R7,#01H
LJMP TC3
N12: MOV R7,#02H
LJMP TC3
SSIN: CJNE R7,#03H,TC3
MOV R0,#00H
MOV DPTR,#7FFFH
K30: MOV A,R0
MOV DPTR,#TAB 数组的地址
MOVC A,@A+DPTR 把第R0个数放到A中
MOV DPTR,#7FFFH
MOVX @DPTR,A输出A
MOV P0,A
INC R0 RO加1
MOV P2,#0FFH 周期
MOV A,P2
CPL A
MOV R3,A
L30: DEC R3
CJNE R3,#255,L30
CJNE R0,#255,K30不等于255表示一个周期内,跳到K30
LJMP SIN 等于表示显示完一个周期,到SIN开始
TC3: RET 退出
TAB: DB定义正弦函数的各个值
看了你的图和你的程序,感觉你的图画得简单了一点,特别是0832地址,控制信号都没接,看起来还在调试,建议P2口做地址总线,这样,编程比较方便,你可以把P3口做周期.或者把P1口的其他口做控制总线,这样要对0832时序比较熟悉才行.
我平时是用C开发的,很少用汇编,如果有什么错误,可以共同探讨.
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)