org 0000h
ajmp main
ORG 000BH ;定时器T0的入口
AJMP DISP ;显示程序
org 0030h
main:
MOV SP,#5FH ;设置堆栈
MOV P1,#0FFH
MOV P0,#0FFH
MOV P2,#0FFH ;初始化,所显示器,LED灭
MOV TMOD,#00000001B ;定时器T0工作于模式1(16位定时/计数模式)
MOV TH0,#HIGH(65536-2000)
MOV TL0,#LOW(65536-2000)
SETB TR0 ;开定时器0
SETB EA ;开总中断
SETB ET0 ;开定时器0中断
MOV Counter,#0 ;计数器初始化
LOOP:
lcall adc_demo ;调用AD子程序
ajmp LOOP
;//==========================================
;// 启动AD转换
;//==========================================
Adc_Start:
clr ad_cs
nop
clr ad_wr
nop
setb ad_wr
nop
setb ad_cs
nop
ret
;//==========================================
;// 读AD转换
;//==========================================
Adc_Read:
mov ad_input_port,#0ffh
clr ad_cs
nop
clr ad_rd
nop
nop
mov a,AD_INPUT_PORT
nop
setb ad_rd
nop
setb ad_cs
ret
;//==========================================
;// AD转换读取延时程序,显示读到的数值
;//==========================================
Adc_Demo:
lcall Adc_Start
lcall delay1ms
lcall adc_read
MOV B,#100 ;AD转换出的值除100商为百位数
DIV AB ; 取百位数 余数在B寄存器
MOV DISPBUF,A ;把百位存入百位寄存器DISPBUF
MOV A,B ;余数再送A
MOV B,#10 ;余数除10商为十位数
DIV AB ; 除法,余数在寄存器B
MOV DISPBUF+1,A ;A是十位数存第二位显示寄存器
MOV DISPBUF+2,B ; B是个位数存第三位显示寄存器
RET
DISP: ;定时器T0的中断响应程序动态扫描
PUSH ACC ;ACC入栈
PUSH PSW ;PSW入栈
MOV TH0,#HIGH(65536-2000);定时时间为2000个周期,约2170微秒
MOV TL0,#LOW(65536-2000)
SETB FIRST
SETB SECOND ;关显示
SETB THEER
MOV A,#DISPBUF ;显示缓冲区首地址
ADD A,Counter
MOV R0,A
MOV A,@R0 ;根据计数器的值取相应的显示缓冲区的值
MOV DPTR,#DISPTAB ;字形表首地址
MOVC A,@A+DPTR ;取字形码
MOV P0,A ;将字形码送P0位(段口)
MOV A,Counter ;取计数器的值
JZ DISPFIRST ;如果是0则显示第一位
DEC A
JZ DISPSECOND ;如果是1显示第二位
CLR THEER ;否则显示第3位
AJMP DISPNEXT
DISPFIRST:
CLR FIRST ;显示第一位
AJMP DISPNEXT
DISPSECOND:
CLR SECOND
DISPNEXT:
INC Counter ;计数器加1
MOV A,Counter
DEC A ;如果计数器计到3,则让它回0
DEC A
DEC A
JZ RSTCOUNT
AJMP DISPEXIT
RSTCOUNT:
MOV Counter,#0 ;计数器的值回0
DISPEXIT:
POP PSW
POP ACC
RETI
DISPTAB:db 28h,7eh,0a2h,62h,74h,61h,21h,7ah,20h,60h ;字形代码表
;0 1 2 3 4 5 6 7 8 9
delay1ms: ;延时子程序
mov r7,#10
MM:mov r6,#50
djnz r6,$ ;2us
djnz r7,MM
ret
end