ADC0809显示程序

主程序和中断程序入口 *
;* *
;*************************************
ORG 0000H
LJMP START
ORG 0003H
RETI
ORG 000BH
RETI
ORG 0013H
RETI
ORG 001BH
RETI
ORG 0023H
RETI
ORG 002BH
RETI
;
;*************************************
;* *
;* 初始化程序中的各变量 *
;* *
;*************************************
CLEARMEMIO: CLR A
MOV P2,A
MOV R0,#70H
MOV R2,#0DH
LOOPMEM: MOV @R0,A
INC R0
DJNZ R2,LOOPMEM
MOV 20H,#00H
MOV A,#0FFH
MOV P0,A
MOV P1,A
MOV P3,A
RET
;
;*************************************
;* *
;* 主 程 序 *
;* *
;*************************************
START: LCALL CLEARMEMIO ;初始化
MAIN: LCALL TEST ;测量一次
LCALL DISPLAY ;显示数据一次
AJMP MAIN
NOP ;PC值出错处理
NOP
NOP
LJMP START
;
;*************************************
;* 显 示 控 制 程 序 *
;*************************************
;
DISPLAY: JB 00H,DISP11 ;
MOV R3,#04H ;4路信号循环显示控制
MOV R0,#70H ;显示数据初址70H~73H
MOV 77H,#00H ;显示通道路数初值
DISLOOP1: LCALL TUNBCD ;显示数据转为三位BCD码存入76H、75H、74H(最大5.00v)
MOV R2,#0FFH ;每路显示时间控制 4MS*255
DISLOOP2: LCALL DISP ;调四位显示程序
LCALL KEYWORK1 ;
DJNZ R2,DISLOOP2 ;
INC R0 ;显示下一路
INC 77H ;通道显示数加一
DJNZ R3,DISLOOP1
RET
;
DISP11: MOV A,77H ;
SUBB A,#01H ;
MOV 77H,A ;
ADD A,#70H ;
MOV R0,A ;
DISLOOP11: LCALL TUNBCD ;显示数据转为三位BCD码存入7AH、79H、78H(最大5.00v)
MOV R2,#0FFH ;每路显示时间控制 4MS*25
DISLOOP22: LCALL DISP ;调四位显示程序
LCALL KEYWORK2 ;
DJNZ R2,DISLOOP22
INC 77H ;通道显示数加一
RET
;
;*************************************
;* 显示数据转为三位BCD码程

序 *
;*************************************
;显示数据转为三位BCD码存入76H、75H、74H(最大值5.00v)
;
TUNBCD: MOV A,@R0 ;255/51=5.00V运算
MOV B,#51 ;
DIV AB ;
MOV 76H,A ;个位数放入76H
MOV A,B ;余数大于19H,F0为1,乘法溢出,结果加5
CLR F0
SUBB A,#1AH
MOV F0,C
MOV A,#10 ;
MUL AB ;
MOV B,#51 ;
DIV AB
JB F0,LOOP2 ;
ADD A,#5
LOOP2: MOV 75H,A ;小数后第一位放入75H
MOV A,B
CLR F0
SUBB A,#1AH
MOV F0,C
MOV A,#10 ;
MUL AB ;
MOV B,#51 ;
DIV AB
JB F0,LOOP3 ;
ADD A,#5
LOOP3: MOV 74H,A ;小数后第二位放入74H
RET
;
;*************************************
;* ? 显?示 程 序 *
;*************************************
;共阳显示子程序,显示内容在74H—77H
;
DISP: MOV R1,#74H ;共阳显示子程序,显示内容在74H—77H
MOV R5,#0FEH ;数据在P1输出,列扫描在P3.0-P3.3
PLAY: MOV P1,#0FFH
MOV A,R5
ANL P3,A
MOV A,@R1
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV P1,A
JB P3.2,PLAY1 ;小数点处理
CLR P1.7 ;小数点显示(显示格式为XX.XX)
PLAY1: LCALL DL1MS
INC R1
MOV A,P3
JNB ACC.3,ENDOUT
RL A
MOV R5,A
MOV P3,#0FFH
AJMP PLAY
ENDOUT: MOV P3,#0FFH
MOV P1,#0FFH
RET
TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH
;
;*************************************
;* ? ? 延时程序 *
;*************************************
;
DL10MS: MOV R6,#0D0H ;10MS延时子程序
DL1: MOV R7,#19H
DL2: DJNZ R7,DL2
DJNZ R6,DL1
RET
;
DL1MS: MOV R4,#0FFH ;513+513=1MS
LOOP11: DJNZ R4,LOOP11
MOV R4,#0FFH
LOOP22: DJNZ R4,LOOP22
RET
;
;*************************************
;* ? 电压测量(A/D)子程序 *
;*************************************
; 一次测量数据4个,依次放入70

H-73H单元中
;
TEST: CLR A ;模数转换子程序
MOV P2,A
MOV R0,#70H ;转换值存放首址
MOV R7,#04H ;转换4次控制
LCALL TESTART ;启动测试
WAIT: JB P3.7,MOVD ;等A/D转换结束信号
AJMP WAIT
;
TESTART: SETB P2.3 ;测试启动
NOP
NOP
CLR P2.3
SETB P2.4
NOP
NOP
CLR P2.4
NOP
NOP
NOP
NOP
RET
;
MOVD: SETB P2.5 ;取A/D转换数据
MOV A,P0
MOV @R0,A
CLR P2.5
INC R0
MOV A,P2 ;通道地址加1
INC A
MOV P2,A
CJNE A,#04H,TESTEND ;等8路A/D转换结束
TESTEND: JC TESTCON
CLR A ;结束恢复端口
MOV P2,A
MOV A,#0FFH
MOV P0,A
MOV P1,A
MOV P3,A
RET
;
TESTCON: LCALL TESTART
LJMP WAIT
;
;*************************************
;* ? 按键检测子程序 *
;*************************************
;
KEYWORK1: JNB P3.5,KEY1
KEYOUT: RET
;
KEY1: LCALL DISP ;延时消抖
JB P3.5,KEYOUT
WAIT11: JNB P3.5,WAIT12
CPL 00H
MOV R2,#01H
MOV R3,#01H
RET
;
WAIT12: LCALL DISP ;键释放等待时显示用
AJMP WAIT11
;
KEYWORK2: JNB P3.5,KEY1
JNB P3.6,KEY2
RET
;
KEY2: LCALL DISP ;延时消抖用
JB P3.6,KEYOUT
WAIT22: JNB P3.6,WAIT21
INC 77H
MOV A,77H
CJNE A,#04H,KEYOUT11
KEYOUT11: JC KEYOUT1
MOV 77H,#00H
KEYOUT1: RET
;
WAIT21: LCALL DISP ;键释放等待时显示用
AJMP WAIT22
;
END

相关推荐
相关主题
热门推荐