LED1 EQU 30H ;初始化定义 LED2 EQU 31H LED3 EQU 32H ;存放三个数码管的段码 ADC EQU 35H ;存放转换后的数据 ST BIT P3.2 OE BIT P3.0 EOC BIT P3.1 ;定义ADC0809的功能控制引脚 ORG 0000H LJMP MAIN ;跳转到主程序执行 ORG 0030H MAIN: MOV LED1,#00H MOV LED2,#00H MOV LED3,#00H ;寄存器初始化 CLR P3.4 SETB P3.5 CLR P3.6 ;选择ADC0809的通道2 WAIT: CLR ST SETB ST CLR ST ;在脉冲下降沿启动转换 JNB EOC,$ ;等待转换结束 SETB OE ;允许输出信号 MOV ADC,P1 ;暂存A/D转换结果 CLR OE ;关闭输出 MOV A,ADC ;将转换结果放入A中,准备个位数据转换 MOV B,#50 ;变换个位调整值50送B DIV AB MOV LED1,A ;将变换后的个位值送显示缓冲区LED1 MOV A,B ;将变换结果的余数放入A中,准备十分位变换 MOV B,#5 ;变换十分位调整值5送B DIV AB MOV LED2,A ;将变换后的十分位值送LED2 MOV LED3,B ;最后的余数作百分位值送LED3 LCALL DISP ;调用显示程序 AJMP WAIT DISP:MOV R1,#LED1 ; 显示子程序 CJNE @R1,#5,GO ;@R1=5V?是往下执行,否,则到GO MOV LED2,#0H ;是5V,即最高值,将小数的十分位清零 MOV LED3,#0H ;将小数的百分位清零 GO:MOV R2,#3 ;显示位数赋初值,用到3位数码管 MOV R3,#0FDH ;扫描初值送R3 DISP1:MOV P2,#0FFH ;关闭显示,目的防止乱码 MOV A,@R1 ;显示值送A MOV DPTR,#TAB ;送表首地址给DPTR MOVC A,@A+DPTR ;查表取段码 CJNE R2,#3,GO1 ;判断是否个位数码管?否则跳到GO1 ORL A,#80H ;将整数的数码管显示小数点 GO1:MOV P0,A ;送段码给P0口 MOV A,R3 MOV P2,A ;送位码给P2口 LCALL DELAY ;调用延时 MOV R3,A RL A ;改变位码 MOV R3,A INC R1 ;改变段码 DJNZ R2,DISP1 ;三位是否显示完?否则调到DISP1 RET DELAY:MOV R6,#10 ;延时5S程序: D1:MOV R7,#250 DJNZ R7,$ DJNZ R6,D1 RET TAB: DB 3FH, 06H,5BH,4FH,66H;共阴极数码管显示0-4 ;显示数据表: DB 6DH,7DH,07H,7FH,6FH;显示5-9 END
|