📄 ad.asm
字号:
;**************************************************
; 平凡单片机工作室
; http://www.mcustudio.com
; Copyright 2003 pingfan's McuStudio
; All rights Reserved
;作者:周坚
;文件名:ad.asm
;DSB?1A型实验板与TLC1543的接口
;功能简介:每隔1s轮流将一个通道的值显示在数码管后4位,首位显示通道号
;**************************************************
gCoun DATA 22H ;通道计数器
;以下定义各引脚
ADCLK EQU P1.1 ;时钟
ADaddr EQU P1.2 ;地址引脚
ADDout EQU P1.3 ;数据端
ADCS EQU P1.4 ;片选端
Hidden DATA 10H ;消隐码
Counter DATA 57H ;显示程序用计数器
DISPBUF DATA 58H ;显示缓冲区首地址
ORG 0000H
JMP START
ORG 000BH ;定时中断使用T0
JMP DISP ;定时中断程序
ORG 30H
START:
MOV SP,#5FH ;初始化
MOV P1,#0FFH
MOV P0,#0FFH
MOV P2,#0FFH ;关所有LED及数码管
MOV TMOD,#00000001B
MOV TH0,#HIGH(65536-3000)
MOV TL0,#LOW(65536-3000)
SETB TR0
SETB EA
SETB ET0
MOV Counter,#0 ;计数器清零
MOV DISPBUF+1,#Hidden ;第2位显示器消隐
MOV gCoun,#0 ;通道计数器清零,指向通道0
LOOP:
CALL Delay ;延时1s
MOV R2,gCoun ;送通道号
CALL ADConver
MOV A,R0
MOV R6,A
MOV A,R1
MOV R7,A
CALL HB2
;调用二-十进制转换程序
;入口:待转换的双字节十六进制数在R6和R7中
;出口:转换结束的结果在R3、R4和R5中,压缩BCD码方式存储
MOV A,R4
ANL A,#0F0H
SWAP A ;高低4位互换
MOV DispBuf+2,A ;最高位
MOV A,R4
ANL A,#0FH
MOV DispBuf+3,A
MOV A,R5
ANL A,#0F0H
SWAP A
MOV DispBuf+4,A
MOV A,R5
ANL A,#0FH
MOV DispBuf+5,A
;以上程序段将压缩BCD码转换成非压缩BCD码并送显示缓冲区
MOV DispBuf,gCoun ;将通道号送第1个显示器的显示缓冲区
INC gCoun ;通道号加1
MOV A,gCoun
CJNE A,#11,LOOP ;判断是否到11了
MOV gCoun,#0 ;到则回零
JMP LOOP
;命令:ADConver
;参数:r2 通道号,转换前存入 转换结后数据在r0r1中,高位在前
;资源占用:r0,r1,r7,A
ADConver:
CLR ADClk
CLR ADCS
MOV A,R2
RLC A
;送出地址信号
MOV R7,#4
C_L1:
RLC A
MOV ADAddr,C
SETB ADClk
NOP
NOP
NOP
NOP
CLR ADClk
DJNZ R7,C_L1
;补6个脉冲
MOV R7,#6
C_L2:
SETB ADClk
NOP
NOP
NOP
NOP
CLR ADClk
DJNZ R7,C_L2
;等待转换结束
SETB ADCS
NOP
NOP
NOP
NOP
CLR ADCS
;取高2位
NOP
NOP
NOP
NOP
SETB ADDout
SETB ADClk
MOV C,ADDout
MOV ACC.1,C
CLR ADClk
NOP
NOP
NOP
NOP
SETB ADDout
SETB ADClk
MOV C,ADDout
MOV ACC.0,C
CLR ADClk
ANL A,#00000011B ;清A的高6位
MOV R0,A ;保存数据
MOV R7,#8
C_L3:
NOP
NOP
NOP
NOP
SETB ADDout
SETB ADClk
MOV C,ADDout
MOV ACC.0,C
RLC A
CLR ADClk
DJNZ R7,C_L3
SETB ADCS
MOV R1,A
RET
;**********************************************************
;以下是显示程序,使用定时器T1作定时中断
;**********************************************************
DISP: ;定时器T0的中断响应程序
PUSH ACC ;ACC入栈
PUSH PSW ;PSW入栈
MOV TH0,#HIGH(65536-3000);定时时间为3000个周期
MOV TL0,#LOW(65536-3000)
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 ;取计数器的值
MOV R0,A
MOV DPTR,#BitTab
MOVC A,@A+DPTR ;取位
ORL P2,#11111100B
ANL P2,A
INC Counter ;计数器加1
MOV A,Counter
CJNE A,#6,DISPEXIT
MOV Counter,#0 ;如果计数器计到6,则让它回0
DISPEXIT:
POP PSW
POP ACC
RETI
BitTab: DB 7Fh,0BFH,0DFH,0EFH,0F7H,0FBH
DISPTAB:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,88H,83H,0C6H,0A1H,86H,8EH,0FFH
HB2: CLR A
MOV R3,A
MOV R4,A
MOV R5,A
MOV R2,#10H
HB3: MOV A,R7
RLC A
MOV R7,A
MOV A,R6
RLC A
MOV R6,A
MOV A,R5
ADDC A,R5
DA A
MOV R5,A
MOV A,R4
ADDC A,R4
DA A
MOV R4,A
MOV A,R3
ADDC A,R3
MOV R3,A
DJNZ R2,HB3
RET
Delay:
MOV R7,#10
D1: MOV R6,#250
D2: MOV R5,#200
DJNZ R5,$
DJNZ R6,D2
DJNZ R7,D1
RET
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -