|
字電壓表》-《電子制作》2006年第7期.files/m2006072721245765.jpg)
字電壓表》-《電子制作》2006年第7期.files/2006072721251415.jpg)
字電壓表》-《電子制作》2006年第7期.files/2006072721253138.jpg)
;******************************************************************************** ;* 描述: * ;* ADC0832數(shù)字電壓表數(shù)碼管顯示 * ;* * ;* 調(diào)節(jié)ADC0832旁邊的電位器,數(shù)碼管顯示 ADC0832 轉(zhuǎn)換值的大小 * ;* * ;* * ;******************************************************************************** ;* 【版權(quán)】 Copyright(C)偉納電子 www.willar.com All Rights Reserved * ;* 【聲明】 此程序僅用于學(xué)習(xí)與參考,引用請注明版權(quán)和作者信息! * ;********************************************************************************
AD_CLK EQU P1.0 AD_DAT EQU P1.1 AD_CS EQU P3.4 DISSTART EQU 30H ;顯示單元首地址 LED_DATA EQU P0 ;數(shù)碼管數(shù)據(jù)定義 ORG 0000H JMP START
;-------------------------------------------------------- START: MOV SP,#60H MOV A,#00H MOV 20H,A MOV P0,#0FFH MOV P2,#0FFH
START1: CALL AD_CONV CALL AD_CHULI CALL QUSHU CALL ADPLAY JMP START1 ;--------------------------------------------------------- AD_CONV: ;ADC0832初始化 SETB AD_CS ;一個轉(zhuǎn)換周期開始 CLR AD_CLK CLR AD_CS ;CS置0,片選有效 SETB AD_DAT ;DI置1,起始位 SETB AD_CLK ;第一個脈沖 CLR AD_DAT ;在負(fù)跳變之前加一個DI反轉(zhuǎn)操作 CLR AD_CLK SETB AD_DAT ;DI置1,設(shè)為單通道 SETB AD_CLK ;第二個脈沖 CLR AD_DAT ;*** CLR AD_CLK ; CLR AD_DAT ;DI置0,選擇通道0 SETB AD_CLK ;第三個脈沖 SETB AD_DAT ;*** CLR AD_CLK NOP SETB AD_CLK ; 第四個脈沖 MOV R1,#08H ;計數(shù)器初值,讀取8位數(shù)據(jù), AD_READ: CLR AD_CLK ;下降沿 MOV C,AD_DAT ;讀取DO端數(shù)據(jù) RLC A ;C移入A,高位在前 SETB AD_CLK ;下一個脈沖 DJNZ R1,AD_READ ;沒讀完繼續(xù) SETB AD_CS MOV 20H,A ;轉(zhuǎn)換結(jié)果發(fā)給20H RET ;------------------------------------------------------ AD_CHULI: CLR C MOV R5,#00H ;十進(jìn)制轉(zhuǎn)換的低位寄存器 MOV R4,#00H ;十進(jìn)制轉(zhuǎn)換的高位寄存器 MOV R3,#08H ;十進(jìn)制調(diào)整的次數(shù) MOV A,20H AD_CHULI1: RLC A MOV R2,A MOV A,R5 ADDC A,R5 DA A MOV R5,A MOV A,R4 ADDC A,R4 MOV R4,A MOV A,R2 DJNZ R3,AD_CHULI1 MOV A,R5 ADD A,R5 DA A MOV R5,A MOV A,R4 ADDC A,R4 DA A MOV R4,A RET ;------------------------------------------------- QUSHU: MOV A,R5 ANL A,#0FH MOV DISSTART,A MOV A,R5 ANL A,#0F0H SWAP A MOV DISSTART+1,A MOV A,R4 ANL A,#0FH MOV DISSTART+2,A MOV A,R4 ANL A,#0F0H MOV DISSTART+3,A RET ;--------------------------------------------------- ADPLAY: PUSH PSW CLR PSW.3 SETB PSW.4
MOV R0,#DISSTART ;開始填充顯示單元 MOV R2,#03H ;共計填充 3 位 DISP1: MOV A,@R0 ;獲得當(dāng)前位地址 MOV DPTR,#TAB_NU ;獲得表頭 MOVC A,@A+DPTR ;獲得編碼數(shù)據(jù) MOV @R0,A ;保存編碼數(shù)據(jù) INC R0 ;指向下一個帶轉(zhuǎn)換數(shù)據(jù) DJNZ R2,DISP1 ;繼續(xù)轉(zhuǎn)換,直到完成
MOV R0,#DISSTART ;獲得顯示單元首地址 MOV R1,#07FH ;從第一個數(shù)碼管開始 MOV R2,#03H ;共顯示3位數(shù)碼管 DISP2: MOV LED_DATA,@R0 ;讀取顯示單元數(shù)據(jù) MOV P2,R1 ;開始顯示當(dāng)前位 MOV A,R1 ;準(zhǔn)備顯示下一位 RR A ; MOV R1,A ;下一位 INC R0 ;取下一個單元地址 JNB ACC.5,DISP3 ;第三位數(shù)碼管加小數(shù)點(diǎn) JMP DISP4 DISP3: MOV A,@R0 ANL A,#7FH MOV @R0,A DISP4: LCALL DELAY5MS ;延時 2 MS DJNZ R2,DISP2 ;重復(fù)顯示下一個 POP PSW RET ;顯示完成,返回 ;--------------------------------------------------- DELAY5MS: MOV R6,#10 DEL1: MOV R7,#100 DJNZ R7,$ DJNZ R6,DEL1 RET ;------------------------------------------------- TAB_NU: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H DB 80H,90H,88H,83H,0C6H,0A1H,86H,8EH
|