📄 max038main.asm
字号:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;--------------------------------波形发生器主程序文件------------------------------------
;;主芯片MAX038
;;控制电路,DA芯片+89C51
;;显示:字符型液晶显示器
;;按键:直接端口按键,共5个
;;设计要求:能产生正弦波,三角波和方波,输出信号频率范围为10~1MHZ,输出信号在10HZ~1KHZ范围内
;;步进10HZ,在1KHZ~1MHZ范围内步进为1KHZ;;输出正弦波信号的电压峰值在0~5V可调,步进为0.1V;;
;;实时显示信号类型,幅度,频率和频率步进值.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ORG 0000H
AJMP START
ORG 0003H
RETI
ORG 0013H
RETI
ORG 000BH
RETI
ORG 001BH
RETI
ORG 0023H
RETI
;;;;;;;;;;;;外部端口定义;;;;;;;;;;;;
;----显示----
RS BIT P3.2 ;寄存器选择信号
;1-->数据寄存器
;0-->命令寄存器
RW BIT P3.1 ;读/写选择信号
;1-->读操作
;0-->写操作
E BIT P3.0 ;启动命令信号
;1-->0跳变执行命令
;----按键----
SETKEY BIT P2.0 ;模式设置键
DKEY1 BIT P2.1 ;多功能键1
DKEY2 BIT P2.2 ;多功能键2
DKEY3 BIT P2.3 ;多功能键3
DKEY4 BIT P2.4 ;多功能键4
;----DA接口----
;----波形选择----
AO BIT P3.0 ;波形模式选择A0
A1 BIT P3.1 ;波形模式选择A1
;*1-->正弦波
;00-->三角波
;10-->方波
;默认情况为正弦波
;----量程切换----
HI_LOW BIT P3.4
;1-->低频段(10HZ~1000HZ)
;0-->高频段(1KHZ~1000KHZ)
;----其他----
;;;;;;;;;;;;环境变量定义;;;;;;;;;;;;
;----显示变量----
;振幅************
AMPL_G DATA 30H ;振幅电压显示小数位
AMPL_S DATA 31H ;振幅电压显示整数位
;频率************
FREQ_G DATA 32H ;频率显示值个位
FREQ_S DATA 33H ;频率显示值十位
FREQ_B DATA 34H ;频率显示值百位
FREQ_Q DATA 35H ;频率显示值千位
;频率步进值******
SETP_L DATA 36H ;频率步进值显示低位
SETP_H DATA 37H ;频率步进值显示高位
;----系统变量----
;波形************
WAVE_TYPE DATA 38H ;波形类型
;1-->正弦波
;2-->三角波
;3-->方波
;默认情况为正弦波
;振幅************
AMPL DATA 39H ;振幅电压值(0~5V,*.*)
;频率************
FREQ_L DATA 3AH ;频率值低位(10HZ~1KHZ,1KHZ~1000KHZ)
FREQ_H DATA 3BH ;频率值高位
;频率步进值******
SETP DATA 3CH ;频率步进值(10HZ/1KHZ)
;系统工作模式****
SYSMODE DATA 3DH ;决定系统的工作模式
;1-->波形模式选择
;2-->频率调整模式
;3-->振幅调整模式
;按键码**********
KEYCODE DATA 3EH ;按键扫描码
;其他************
;;;;;;;;;;;;;;系统初始化;;;;;;;;;;;;;
START: MOV SP,#70H ;设置堆栈70H~80H共16个字节
MOV SYSMODE,#1 ;设置系统初始工作模式为波形选择模式
;--------设置波形--------
MOV WAVE_TYPE,#1;默认波形为正弦波
CLR A0
SETB A1 ;
;------------------------
MOV FREQ_H,#1FH ;初始频率值500HZ
MOV FREQ_L,#04H
MOV SETP,#10 ;初始频率步进值为10HZ
;;液晶屏幕初始化
LCALL YS; ;去掉这几行回出现多余的字符
LCALL TEST;
LCALL F_BUSY;
MOV P1,#00000001B
LCALL WCOMMAND ;清屏并置AC为0
MOV P1,#3CH ;功能设置,8位接口,2 行显示,5X7点阵
LCALL WCOMMAND ;等待直至LCM不忙
MOV P1,#0CH ;开显示及光标,不闪烁
LCALL WCOMMAND
MOV P1,#06H ;显示不移位,AC为增量方式
LCALL WCOMMAND
;MOV P1,#80H ;写入显示起始地址,第一行第一个位置
;LCALL WCOMMAND
MIAN: JB SETKEY,KEYS1
LCALL YS ;等待5MS
JB SETKEY,KEYS1 ;判断是否真的按下
MOV KEYCODE,#01H
SJMP KEYSEND
KEYS1: JB DKEY1,KEYS2
LCALL YS ;等待5MS
MOV KEYCODE,#02H ;判断是否真的按下
SJMP KEYSEND
KEYS2: JB DKEY2,KEYS3
LCALL YS ;等待5MS
MOV KEYCODE,#03H ;判断是否真的按下
SJMP KEYSEND
KEYS3: JB DKEY3,KEYS4
LCALL YS ;等待5MS
MOV KEYCODE,#04H ;判断是否真的按下
SJMP KEYSEND
KEYS4: JB DKEY4,MAIN
LCALL YS ;等待5MS
MOV KEYCODE,#05H ;判断是否真的按下
KEYSEND:MOV R0,#08FH ;(适应4M晶震,12M晶震情况下该值为FF)
DEALOP1:MOV A,P2 ;判断按键是否抬起
ANL A,#00111111B
CPL A
JNZ DEALOP2 ;按键没有抬起,等待抬起
SJMP KEYSGO ;如果抬起则接着走
DEALOP2:MOV R1,#0FFH
DJNZ R1,$
DJNZ R0,DEALOP1 ;如果在指定的时间内还没有抬起则执行该按键功能
KEYSGO: LCALL KEYDEAL
SJMP MAIN
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;按键处理程序
;;SYSMODE:系统工作模式
;;1-->波形模式选择
;;2-->频率调整模式
;;3-->振幅调整模式
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
KEYDEAL:MOV R0,SYSMODE ;判断系统工作模式
CJNE R0,#1,CMODE1 ;是否为波形选择模式
LCALL WAVEDEAL ;是波形选择,转到波形选择处理
SJMP KEYDRET
CMODE1: CJNE R0,#2,CMODE2 ;是否为频率调整模式
LCALL FREQDEAL ;是频率调整模式,转到频率调整处理
SJMP KEYDRET
CMODE2: CJNE R0,#3,KEYDRET ;是否为振幅调整模式
LCALL AMDEAL ;是调幅模式,转到调幅处理
KEYDRET:RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;波形选择处理程序
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
WAVEDEAL: MOV R0,KEYCODE ;判断按键码
CJNE R0,#02H,WAVEKEY1
;;
WAVEKEY1: CJNE R0,#03H,WAVEKEY2
;;
WAVEKEY2: CJNE R0,#04H,WAVEKEY3
;;
WAVEKEY3: CJNE R0,#05H,WAVEEND
;;
WAVEREFE: LCALL REDISWAVE ;刷新波形显示
WAVEEND: RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;频率调整处理程序
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
FREQDEAL: MOV R0,KEYCODE ;判断按键码
CJNE R0,#02H,FREQKEY1
;;
FREQKEY1: CJNE R0,#03H,FREQKEY2
;;
FREQKEY2: CJNE R0,#04H,FREQKEY3
;;
FREQKEY3: CJNE R0,#05H,FREQEND
;;
FREQREFE: LCALL REDISFREQ ;刷新频率显示
FREQEND: RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;振幅调整处理程序
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
AMDEAL: MOV R0,KEYCODE ;判断按键码
CJNE R0,#02H,AMKEY1
;;
AMKEY1: CJNE R0,#03H,AMKEY2
;;
AMKEY2: CJNE R0,#04H,AMKEY3
;;
AMKEY3: CJNE R0,#05H,AMEND
;;
AMREFE: LCALL REDISAM ;刷新振幅显示
AMEND: RET
;;------------------------------显示程序------------------------------
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;波形刷新显示程序
;;1-->正弦波
;;2-->三角波
;;3-->方波
;;默认情况为正弦波
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
REDISWAVE: MOV P1,#80H ;设置波形显示起始地址,第一行第一个位置
LCALL WCOMMAND
MOV P1,#01010111B ;'W'
LCALL WDATA ;显示第一位'W'
MOV P1,#00111010B ;':'
LCALL WDATA ;显示第二位':'
MOV R0,WAVE_TYPE
CJNE R0,#1,DISW1
MOV P1,#01110011B ;s'
LCALL WDATA ;显示第三位's'
MOV P1,#01101001B ;i'
LCALL WDATA ;显示第四位'i'
MOV P1,#01101110B ;n'
LCALL WDATA ;显示第五位'n'
;;
DISW1: CJNE R0,#2,DISW2
MOV P1,#01110011B ;s'
LCALL WDATA ;显示第三位's'
MOV P1,#01110001B ;q'
LCALL WDATA ;显示第四位'q'
MOV P1,#01110110B ;v'
LCALL WDATA ;显示第五位'v'
;;
DISW2: CJNE R0,#3,DISWEND
MOV P1,#01110100B ;'t'
LCALL WDATA ;显示第三位't'
MOV P1,#01110010B ;r'
LCALL WDATA ;显示第四位'r'
MOV P1,#01101001B ;i'
LCALL WDATA ;显示第无位'i'
;;
DISWEND: RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;频率值刷新显示程序
;;FREQ_G;频率显示值个位
;;FREQ_S;频率显示值十位
;;FREQ_B;频率显示值百位
;;FREQ_Q;频率显示值千位
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
REDISFREQ: MOV P1,#C0H ;设置波形显示起始地址,第二行第一个位置
LCALL WCOMMAND
MOV P1,#01000110B ;'F'
LCALL WDATA ;显示第一位'F'
MOV P1,#00111010B ;':'
LCALL WDATA ;显示第二位':'
;;-------------------------液晶屏幕驱动程序---------------------------
;***********写入控制命令字子程序**********************
WCOMMAND: CLR RS;
CLR RW;
CLR E;
CALL F_BUSY;
SETB E;
RET
;***********写入数据寄存器***************************
WDATA: SETB RS;
CLR RW;
CLR E;
CALL F_BUSY;
SETB E;
RET
;***********查"忙"标志子程序*************************
F_BUSY: PUSH PSW ;
PUSH ACC ;
PUSH 0B0H ;P3口进栈保护
PUSH 90H ;P1口进栈保护
LOOP: MOV P1,#0FFH ;判断液晶显示器是否忙的子程序
CLR RS
SETB RW
CLR E
NOP
SETB E
JB P1.7,LOOP ;如果P1.7为高电平表示忙就循环等待
POP 90H
POP 0B0H
POP ACC ;不忙,恢复现场返回
POP PSW;
RET
;****************延时子程序(5ms)*************************
YS: PUSH 01H;
PUSH 02H;
MOV R1,#25;
DL5_PA: MOV R2,#100;
DJNZ R2,$;
DJNZ R1,DL5_PA;
POP 02H;
POP 01H;
RET
;**********************测试子程序***************************
TEST: MOV P1,#38H;
CLR RS;
CLR RW;
CLR E;
NOP
SETB E;
RET
;;-------------------------运算子程序----------------------------------
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;标号:BCDH 功能:单字节BCD码整数转换成单字节十六进制整数
;入口条件:待转换的单字节BCD码整数在累加器A中。
;出口信息:转换后的单字节十六进制整数仍在累加器A中。
;影响资源:PSW、A、B、R4 堆栈需求: 2字节
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
BCDH: MOV B,#10H ;分离十位和个位
DIV AB
MOV R4,B ;暂存个位
MOV B,#10 ;将十位转换成十六进制
MUL AB
ADD A,R4 ;按十六进制加上个位
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;标号:BH2 功能:双字节BCD码整数转换成双字节十六进制整数
;入口条件:待转换的双字节BCD码整数在R2、R3中。
;出口信息:转换后的双字节十六进制整数仍在R2、R3中。
;影响资源:PSW、A、B、R2、R3、R4 堆栈需求: 4字节
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
BH2: MOV A,R3 ;将低字节转换成十六进制
LCALL BCDH
MOV R3,A
MOV A,R2 ;将高字节转换成十六进制
LCALL BCDH
MOV B,#100 ;扩大一百倍
MUL AB
ADD A,R3 ;和低字节按十六进制相加
MOV R3,A
CLR A
ADDC A,B
MOV R2,A
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;标号:INCUP
;;功能:二进制频率值加一
;;影响资源:PSW、A、 堆栈需求: 2字节
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
INCUP:
CLR C
MOV A,SECUPL
ADD A,#01H
MOV SECUPL,A
MOV A,SECUPH
ADDC A,#0H
MOV SECUPH,A
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;标号:DECUP
;;功能:二进制频率值减一
;;影响资源:PSW、A、堆栈需求: 2字节
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DECUP:
CLR C
MOV A,SECUPL
SUBB A,#01
MOV SECUPL,A
MOV A,SECUPH
SUBB A,#00H
MOV SECUPH,A
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -