HT1380串行實(shí)時(shí)時(shí)鐘芯片具有接口簡(jiǎn)單、功耗低、工作電壓范圍寬、計(jì)時(shí)精確、功能全(可對(duì)分、秒、時(shí)、日、日期、月及帶閏年補(bǔ)償?shù)哪赀M(jìn)行計(jì)數(shù))、成本低等優(yōu)點(diǎn),因此在實(shí)際應(yīng)用中被廣泛采用,下面先簡(jiǎn)單介紹一下該芯片的情況,然后實(shí)際工作中采用的子程序供讀者參考。
HT1380是一種串行實(shí)行時(shí)時(shí)鐘芯片,它提供秒、分、時(shí)、日、日期、月和年的信息。對(duì)于小于31天的月的月末日期能自動(dòng)進(jìn)行調(diào)整,還包括閏年校正功能。低功耗設(shè)計(jì)且時(shí)鐘的運(yùn)行可以采用24小時(shí)格式或帶AM/PM指示的12小時(shí)的格式。HT1380含有若干寄存器用以存儲(chǔ)相應(yīng)信息。采用外部32.768KHZ晶振以提供正確定時(shí)。最少引腳數(shù)的串行I/0通信方式。與微處理器通信僅需三根線:1.YRST(復(fù)位)2.YSCLK(串行時(shí)鐘)3.YIO(數(shù)據(jù)線).數(shù)據(jù)傳送采用兩種模式,即單字節(jié)模式和多字節(jié)模式(至多為8個(gè)字節(jié),每一數(shù)據(jù)傳送由命令字節(jié)初始化,命令字節(jié)如下所示,最高位MSB(位7)必須置1;最低位LSB(位0)置1/0,表示為寫(xiě)/讀周期;位3--1指定所需訪問(wèn)的寄存器。
每一數(shù)據(jù)傳送由命令字節(jié)初始化。命令字節(jié)如下所示,最高位MSB(位7)必須置1;最低位LSB(位0)置I/O,表示為寫(xiě)/讀周期;位3~1指定所需訪問(wèn)的寄存器。
4. 圖5.11為單字節(jié)及多字節(jié)模式傳送時(shí)隙

HD7279(A)是一片具有串行接口的,可同時(shí)驅(qū)動(dòng)8位共陰式數(shù)碼管(或64只獨(dú)立LED)的智能顯示驅(qū)動(dòng)芯片,該芯片同時(shí)還可連接多達(dá)64鍵的鍵盤(pán)矩陣。
HD7279內(nèi)部含有譯碼器,可直接接受16進(jìn)制碼,HD7279A還同時(shí)具有2種譯碼方式,HD7279(A)還具有多種控制指令,如消隱、閃爍、左移、右移、段尋址等。
特點(diǎn):
·串行接口
·各位獨(dú)立控制譯碼/不譯碼及消隱和閃爍屬性
·(循環(huán))左移/(循環(huán))右移指令
·具有段尋址指令,方便控制獨(dú)立LED
·64鍵鍵盤(pán)控制器,內(nèi)含去抖動(dòng)電路
控制指令
HD7279的控制指令分為二大類(lèi)——純指令和帶有數(shù)據(jù)的指令。
·純指令
1、復(fù)位(清除)指令
當(dāng)HD7279收到該指令后,將所有的顯示清除,所有設(shè)置的字符消隱、閃爍等屬性也被一起清除。執(zhí)行該指令后,芯片所處的狀態(tài)與系統(tǒng)上電后所處的狀態(tài)一樣。
2、測(cè)試指令
該指令使所有的LED全部點(diǎn)亮,并處于閃爍狀態(tài),主要用于測(cè)試。
3、左移指令
使所有的顯示自右向左(從第1位向第8位)移動(dòng)一位(包括處于消隱狀態(tài)的顯示位),但對(duì)各位所設(shè)置的消隱及閃爍屬性不變。移動(dòng)后,最右邊一位為空(無(wú)顯示)。例如,原顯示為
其中第2位‘3’和第4位‘L’為閃爍顯示,執(zhí)行了左移指令后,顯示變?yōu)?/DIV>
第二位‘9’和第四位‘P’為閃爍顯示。
4、右移指令
與左移指令類(lèi)似,但所做移動(dòng)為自左向右(從第8位向第1位)移動(dòng),移動(dòng)后,最左邊一位為空。
5、循環(huán)左移指令
與左移指令類(lèi)似,不同之處在于移動(dòng)后原最左邊一位(第8位)的內(nèi)容顯示于最右位(第1位)。在上例中,執(zhí)行完循環(huán)左移指令后的顯示為
第二位‘9’和第四位‘P’為閃爍顯示。
6、循環(huán)右移指令
與循環(huán)左移指令類(lèi)似,但移動(dòng)方向相反。
·帶有數(shù)據(jù)的指令
1、下載數(shù)據(jù)且按方式0譯碼
D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 | | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
1 | 0 | 0 | 0 | 0 | a2 | a1 | a0 | | DP | X | X | X | d3 | d2 | d1 | d0 |
X=無(wú)影響
命令由二個(gè)字節(jié)組成,前半部分為指令,其中a2 ,a1,a0為位地址,具體分配如下:
a2 | a1 | a0 | 顯示位 |
0 | 0 | 0 | 1 |
0 | 0 | 1 | 2 |
0 | 1 | 0 | 3 |
0 | 1 | 1 | 4 |
1 | 0 | 0 | 5 |
1 | 0 | 1 | 6 |
1 | 1 | 0 | 7 |
1 | 1 | 1 | 8 |
d0—d3為數(shù)據(jù),收到此指令時(shí),HD7279(A)按以下規(guī)則(譯碼方式0)進(jìn)行譯碼,如下表:
十六進(jìn)制 | d3 | d2 | d1 | d0 | 7段顯示 |
00H | 0 | 0 | 0 | 0 | 0 |
01H | 0 | 0 | 0 | 1 | 1 |
02H | 0 | 0 | 1 | 0 | 2 |
03H | 0 | 0 | 1 | 1 | 3 |
04H | 0 | 1 | 0 | 0 | 4 |
05H | 0 | 1 | 0 | 1 | 5 |
06H | 0 | 1 | 1 | 0 | 6 |
07H | 0 | 1 | 1 | 1 | 7 |
08H | 1 | 0 | 0 | 0 | 8 |
09H | 1 | 0 | 0 | 1 | 9 |
0AH | 1 | 0 | 1 | 0 | - |
0BH | 1 | 0 | 1 | 1 | E |
0CH | 1 | 1 | 0 | 0 | H |
0DH | 1 | 1 | 0 | 1 | L |
0EH | 1 | 1 | 1 | 0 | P |
0FH | 1 | 1 | 1 | 1 | 空(無(wú)顯示) |
小數(shù)點(diǎn)的顯示由DP位控制,DP=1時(shí),小數(shù)點(diǎn)顯示,DP=0時(shí),小數(shù)點(diǎn)不顯示。
2、下載數(shù)據(jù)且按方式1譯碼(僅對(duì)HD7279A有效)
D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 | | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
1 | 1 | 0 | 0 | 1 | a2 | a1 | a0 | | DP | X | X | X | d3 | d2 | d1 | d0 |
X=無(wú)影響
此指令與上一條指令基本相同,所不同的是譯碼方式,且只有HD7279A才具有此指令。該指令的譯碼按下表進(jìn)行:
十六進(jìn)制 | d3 | d2 | d1 | d0 | 7段顯示 |
00H | 0 | 0 | 0 | 0 | 0 |
01H | 0 | 0 | 0 | 1 | 1 |
02H | 0 | 0 | 1 | 0 | 2 |
03H | , 0 | 0 | 1 | 1 | 3 |
04H | 0 | 1 | 0 | 0 | 4 |
05H | 0 | 1 | 0 | 1 | 5 |
06H | 0 | 1 | 1 | 0 | 6 |
07H | 0 | 1 | 1 | 1 | 7 |
08H | 1 | 0 | 0 | 0 | 8 |
09H | 1 | 0 | 0 | 1 | 9 |
0AH | 1 | 0 | 1 | 0 | A |
0BH | 1 | 0 | 1 | 1 | b |
0CH | 1 | 1 | 0 | 0 | C |
0DH | 1 | 1 | 0 | 1 | d |
0EH | 1 | 1 | 1 | 0 | E |
0FH | 1 | 1 | 1 | 1 | F |
3、下載數(shù)據(jù)但不譯碼
D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 | | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
1 | 0 | 0 | 1 | 0 | a2 | a1 | a0 | | DP | A | B | C | D | E | F | G |
其中,a2 ,a1,a0為位地址(參見(jiàn)‘下載數(shù)據(jù)且譯碼’指令),A-G和DP為顯示數(shù)據(jù),分別對(duì)應(yīng)7段LED數(shù)碼管的各段。
4、閃爍控制
D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 | | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | | d8 | d7 | d6 | d5 | d4 | d3 | d2 | d1 |
此命令控制各個(gè)數(shù)碼管的閃爍屬性。d1- d8分別對(duì)應(yīng)數(shù)碼管1-8,0=閃爍,1=不閃爍。開(kāi)機(jī)后,缺省的狀態(tài)為各位均不閃爍。
5、消隱控制
D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 | | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
1 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | | d8 | d7 | d6 | d5 | d4 | d3 | d2 | d1 |
此命令控制各個(gè)數(shù)碼管的消隱屬性。d1- d8分別對(duì)應(yīng)數(shù)碼管1-8,1=顯示,0=消隱。當(dāng)某一位被賦予了消隱屬性后,HD7279在掃描時(shí)將跳過(guò)該位,因此在這種情況下無(wú)論對(duì)該位寫(xiě)入何值,均不會(huì)被顯示,但寫(xiě)入的值將被保留,在將該位重新設(shè)為顯示狀態(tài)后,最后一次寫(xiě)入的數(shù)據(jù)將被顯示出來(lái)。當(dāng)無(wú)需用到全部8個(gè)數(shù)碼管顯示的時(shí)候,將不用的位設(shè)為消隱屬性,可以提高顯示的亮度。
注意:至少應(yīng)有一位保持顯示狀態(tài),如果消隱控制指令中d1- d8全部為0,該指令將不被接受,HD7279保持原來(lái)的消隱狀態(tài)不變。
6、段點(diǎn)亮指令
D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 | | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | | X | X | d5 | d4 | d3 | d2 | d1 | d0 |
此為段尋址指令,作用為點(diǎn)亮數(shù)碼管中某一指定的段,或LED矩陣中某一指定的LED。
指令中,X=無(wú)影響;d0- d5為段地址,范圍從00H—3FH,具體分配為:
第1個(gè)數(shù)碼管的G段地址為00H,F(xiàn)段為01H,……A段為06H,小數(shù)點(diǎn)DP為07H,第2個(gè)數(shù)碼管的G段為08H,F(xiàn)段為09H,……,依此類(lèi)推直至第8個(gè)數(shù)碼管的小數(shù)點(diǎn)DP地址為3FH。
7、段關(guān)閉指令
D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 | | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | | X | X | d5 | d4 | d3 | d2 | d1 | d0 |
段尋址命令,作用為關(guān)閉(熄滅)數(shù)碼管中的某一段,指令結(jié)構(gòu)與‘段點(diǎn)亮指令’相同,請(qǐng)參閱上文。
8、讀鍵盤(pán)數(shù)據(jù)指令
D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 | | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
0 | 0 | 0 | 1 | 0 | 1 | 0 | 1 | | d7 | d6 | d5 | d4 | d3 | d2 | d1 | d0 |
該指令從HD7279讀出當(dāng)前的按鍵代碼。與其它指令不同,此命令的前一個(gè)字節(jié)00010101B為微控制器傳送到HD7279的指令,而后一個(gè)字節(jié)d0- d7則為HD7279返回的按鍵代碼,其范圍是0-3FH(無(wú)鍵按下時(shí)為0xFF),各鍵鍵盤(pán)代碼的定義,請(qǐng)參閱圖2。
此指令的前半段,HD7279的DATA引腳處于高阻輸入狀態(tài),以接受來(lái)自微處理器的指令;在指令的后半段,DATA引腳從輸入狀態(tài)轉(zhuǎn)為輸出狀態(tài),輸出鍵盤(pán)代碼的值。故微處理器連接到DATA引腳的I/O口應(yīng)有一從輸出態(tài)到輸入態(tài)的轉(zhuǎn)換過(guò)程,詳情請(qǐng)參閱本文‘串行接口’一節(jié)的內(nèi)容。
當(dāng)HD7279檢測(cè)到有效的按鍵時(shí),KEY引腳從高電平變?yōu)榈碗娖,并一直保持到按鍵結(jié)束。在此期間,如果HD7279接收到‘讀鍵盤(pán)數(shù)據(jù)指令’,則輸出當(dāng)前按鍵的鍵盤(pán)代碼;如果在收到‘讀鍵盤(pán)指令’時(shí)沒(méi)有有效按鍵,HD7279將輸出FFH (11111111B)。
串行接口
HD7279采用串行方式與微處理器通訊, 串行數(shù)據(jù)從DATA引腳送入芯片,并由CLK端同步。當(dāng)片選信號(hào)變?yōu)榈碗娖胶,DATA引腳上的數(shù)據(jù)在CLK引腳的上升沿被寫(xiě)入HD7279的緩沖寄存器。
HD7279的指令結(jié)構(gòu)有三種類(lèi)型:1、不帶數(shù)據(jù)的純指令,指令的寬度為8個(gè)BIT,即微處理器需發(fā)送8個(gè)CLK脈沖。2、帶有數(shù)據(jù)的指令,寬度為16個(gè)BIT,即微處理器需發(fā)送16個(gè)CLK脈沖。3、讀取鍵盤(pán)數(shù)據(jù)指令,寬度為16個(gè)BIT,前8個(gè)為微處理器發(fā)送到HD7279的指令,后8個(gè)BIT為HD7279返回的鍵盤(pán)代碼。執(zhí)行此指令時(shí),HD7279的DATA端在第9個(gè)CLK脈沖的上升沿變?yōu)檩敵鰻顟B(tài),并與第16個(gè)脈沖的下降沿恢復(fù)為輸入狀態(tài),等待接收下一個(gè)指令。
串行接口的時(shí)序如下圖:
1、純指令
2、帶數(shù)據(jù)指令

8位指令(高位在前) 8位數(shù)據(jù)(高位在前)
3、讀鍵盤(pán)指令
讀鍵盤(pán)指令(8位,高位在前) HD7279輸出的鍵盤(pán)代碼(8位,高位在前)
2、EM78P156 接口程序
硬件連接如圖,EM78P156所用時(shí)鐘頻率4MHz, 選4個(gè)時(shí)鐘周期為一個(gè)指令周期,
;轉(zhuǎn)移指令用2個(gè)指令周期。程序使用ASM456編譯程序編譯通過(guò)。程序中延時(shí)時(shí)間
;以HD7279A外接R=1.5K, C=15pF為準(zhǔn),如使用不同的CPU時(shí)鐘頻率或R/C參數(shù),
;請(qǐng)注意調(diào)整延時(shí)時(shí)間。
圖 5.14 EM78P156與HD7279A 的硬件連接
;**********************************
; 寄存器定義
;**********************************
STATUS == 0X03
P5 == 5
C == 0
BIT_COUNT == 0X10
DATA_OUT == 0X11
DATA_IN == 0X12
TEN == 0X13
TIMER == 0X14
TIMER1 == 0X15
;**********************************
; I/O口定義
;**********************************
CS == 0 ;CS連接于EM78P156的P50
CLK == 1 ;CLK連接于EM78P156的P51
DAT == 2 ;DAT連接于EM78P156的P52
KEY == 3 ;KEY連接于EM78P156的P53
ORG 0x00
JMP START
ORG 0X10
;*******************************************
; 延時(shí)子程序
;*******************************************
LONG_DELAY:
MOV A,@16 ;設(shè)定延時(shí)時(shí)間為約50uS
MOV TIMER,A
DELAY_LOOP: DJZ TIMER
JMP DELAY_LOOP
RET
SHORT_DELAY: MOV A,@3 ;設(shè)定延時(shí)時(shí)間為約9uS
MOV TIMER,A
SHORT_LP: DJZ TIMER
JMP SHORT_LP
RET
;*******************************************
; 發(fā)送1個(gè)字節(jié)到HD7279,高位在前
;*******************************************
SEND: MOV DATA_OUT,A ;待發(fā)送數(shù)據(jù)存入DATA_OUT
MOV A,@8
MOV BIT_COUNT,A ;設(shè)定位記數(shù)器=8
BC P5,CS ;設(shè)CS為低電平
CALL LONG_DELAY ;長(zhǎng)延時(shí)
SEND_LOOP: BC STATUS,C
RLC DATA_OUT ;輸出1位
BC P5,DAT
JBC STATUS,C
BS P5,DAT
BS P5,CLK ;設(shè)CLK為高電平
CALL SHORT_DELAY ;短延時(shí)
BC P5,CLK ;設(shè)CLK為低電平
CALL SHORT_DELAY
DJZ BIT_COUNT ;檢查是否8位均發(fā)送完畢
JMP SEND_LOOP ;未發(fā)送完,發(fā)送下一位
BC P5,DAT
RET ;發(fā)送完畢,返回
;*******************************************
; 從HD7279接收一個(gè)字節(jié),高位在前
;*******************************************
RECEIVE: MOV A,@8
MOV BIT_COUNT,A ;設(shè)定位記數(shù)器=8
MOV A,@0B11111100 ;設(shè)P5.2(DATA)口為輸入狀態(tài)
IOW P5
CALL LONG_DELAY ;長(zhǎng)延時(shí)
RECEIVE_LOOP: BS P5,CLK ;置CLK為高電平
CALL SHORT_DELAY ;短延時(shí)
BS STATUS,C
JBS P5,DAT
BC STATUS,C
RLC DATA_IN ;讀取一位數(shù)據(jù)
BC P5,CLK ;置CLK為低電平
CALL SHORT_DELAY
DJZ BIT_COUNT ;是否已接收8位數(shù)據(jù)
JMP RECEIVE_LOOP
MOV A,@0B11111000 ;重新設(shè)P52(DATA)口為輸出態(tài)
IOW P5
RET
;*******************************************
; 初始化
;*******************************************
START: MOV A,@0B11111000 ;I/O口初始化
IOW P5
MOV A,@0B11111001
MOV P5,A
MOV A,@0X19 ;延時(shí)約25MS
MOV TIMER,A
START_DELAY: MOV A,@0XFF
MOV TIMER1,A
START_DELAY1: DJZ TIMER1
JMP START_DELAY1
DJZ TIMER
JMP START_DELAY
MOV A,@0B10100100 ;發(fā)復(fù)位(清除)指令
CALL SEND
BS P5,CS ;恢復(fù)CS為高電平
;*******************************************
; 主程序
;*******************************************
MAIN: JBC P5,KEY ;檢測(cè)是否有鍵按下
JMP MAIN
MOV A,@0B00010101 ;有鍵按下,發(fā)送讀鍵盤(pán)指令
CALL SEND ;發(fā)送讀鍵盤(pán)指令
CALL RECEIVE ;從HD7279A讀鍵盤(pán)代碼
BS P5,CS ;設(shè)CS為高電平
;*******************************************
; 16進(jìn)制——BCD碼轉(zhuǎn)換
;*******************************************
CLR TEN
GET_DEC MOV A,@10
SUB A,DATA_IN
JBS STATUS,C
JMP OVER
MOV DATA_IN,A
INC TEN
JMP GET_DEC
;*******************************************
;發(fā)送按鍵的BCD碼到HD7279A
;*******************************************
;發(fā)2次左移指令,使當(dāng)前顯示內(nèi)容左移,留出空
;位供顯示新數(shù)據(jù)
OVER MOV A,@0B10100001 ;左移指令
CALL SEND ;發(fā)送指令到HD7279A
MOV A,@0B10100001 ;左移指令
CALL SEND ;發(fā)送指令到HD7279A
MOV A,@0B10000001 ;下載數(shù)據(jù)且譯碼指令(第2位)
CALL SEND ;發(fā)送指令到HD7279A
MOV A,TEN
CALL SEND ;發(fā)送十位數(shù)字到HD7279A
MOV A,@0B10000000 ;下載數(shù)據(jù)且譯碼指令(第1位)
CALL SEND ;發(fā)送指令到HD7279A
MOV A,DATA_IN
CALL SEND ;發(fā)送個(gè)位數(shù)字到HD7279A
BS P5,CS
WAIT JBS P5,KEY ;等待按鍵放開(kāi)
JMP WAIT
JMP MAIN
;EOP
二進(jìn)制做BCD加法,一定要注意每一位相加結(jié)果的調(diào)整,以轉(zhuǎn)換成BCD的數(shù)位,本程序使用二個(gè)步驟來(lái)完成結(jié)果調(diào)整,(產(chǎn)生DC標(biāo)志)
1.如果和的最低有效位是大于9的數(shù),或DC=1時(shí),將和加6
2.經(jīng)過(guò)步驟1后,如果最高有效位大于9,或相加后C=1,則將和加上60H(即加6到MSD)
擴(kuò)展程序到2位數(shù)以上時(shí),所有位相都必須帶C標(biāo)志(或DC)一起相加,而且上面的原則沿深到每一位數(shù)的處理,即從原數(shù)相加,步驟1、步驟2的加法所產(chǎn)生的進(jìn)位都必須進(jìn)位到下一位。
1. 流程圖
2. 程序:
主程序
MAIN MOV A ,@0X99 ;
MOV Num-1 ,A
MOV A ,@0X99
MOV Num-2 ,A
CALL BCDAD
SELF JMP SELF
END
Num-1=0X20; 0X20放加數(shù),0X21放被加數(shù)
Result=0X20; 運(yùn)行后和放在0X21,進(jìn)位
Num-2=0X21; 放到0X20中
0-Flow=0X21;
;加法子程序
BCDADD MOV A,Num-1
ADD Num-2, A; 作二進(jìn)制加法
CLR Num-1
RLC Num-1; 保存進(jìn)位
JBC STATUS, DC; DC=0?
JMP Adjust; 不是,調(diào)整,LSD
MOV A, 0X06;
ADD Num-2, A; 通過(guò)LSD加6,測(cè)試LSD>9否
JBC STATUS, ;判斷C=1?
INC Num-1
JBC STATUS , DC;DC=0?
SUB Num-2 ;LSD<9恢復(fù)原數(shù)據(jù)
JMP over1
Adjust MOV A, @6H jLSD加6調(diào)整;
ADD Num-2, A
Over1 mov A, @60H ;MSD加6調(diào)整,
ADD Num2, A
JBC STATUS,C ;MSD<9
JMP over3
JBC Num-1, 0
SUB Num-2 ;
RET
Over3 MOV A,@01H ;保存和的進(jìn)位
MOV Num-1,A
RET
使用二進(jìn)制數(shù)做2位數(shù)BCD減法(即做二個(gè)數(shù)補(bǔ)碼的加法),但須注意調(diào)整其相減結(jié)果成為正確的BCD數(shù)。
1.如果差的低4位(LSD)>9,則 從LSD減去6(產(chǎn)生的DC被加到下一位數(shù))
2.步驟1它成后,如果差的高4位(MSD)>9,則從MSD減去6。
一般擴(kuò)展到二位數(shù)以上時(shí),每個(gè)BCD位都使用以上的原則,標(biāo)志的測(cè)試(步驟2)是在二補(bǔ)碼的加法完成后進(jìn)行,當(dāng)0X20=9,結(jié)果是VE,取十補(bǔ)碼以取得它的值。
2. 程序:
main mov a , @0x23 ; 主程序
mov Num-1 , A
mov A ,@0x99
mov Num-2 , A
call BCDSUB
mov A , @0X99
mov Num-1, A
mov A , @0x00
mov A , Num-2
call BCDSUB
SELF goto SELF
end
Num-1=0X20
Result=0X20
Num-2=0X21
0-flow=0X21;
BCDADD mov A,Num-1;做二進(jìn)制減法
SUb Num-2, A
CLR Num-1;
RLC Num-1; 保存進(jìn)位
JBS STATUS, DC; DC=1?
JMP Adjust; 不是,LSD調(diào)整
JBS Num-2, 3
JMP Over-1
JBC Num-2,2
JMP adjust1;LSD結(jié)果調(diào)整
JBS Num-2,1
JMP Over-1
Adjst1 mov A ,@6 ;不是,轉(zhuǎn)到MSD進(jìn)行處理
JMP over1 ;LSD調(diào)整(減6)
Sub Num-2,A
Over-1 JBS Num-1,0 ;C=0?
JMP adjst2 ;是,進(jìn)行MSD調(diào)整
CLR Num-1
JBS Num-2,7 ;不是,MSD>9?
RET
JBC Num-2 ,6
JMP Adjst2
JBS Num-2 ,5
RET
adjst2 mov A , @0X60 ; MSD調(diào)整
Sub Num-2 , A
CLR Num-1 ,
JBS STATS,C
MOV A , 1
MOV Num-1,A
Over RET
這個(gè)程序是將5位BCD數(shù)轉(zhuǎn)換成一個(gè)16位二進(jìn)制數(shù),5位BCD數(shù)依次存放于R0、R1、R2、MSD在R0的最右端,將16進(jìn)制數(shù)轉(zhuǎn)出示存器H-byte和L-byte
一般轉(zhuǎn)換方法是:轉(zhuǎn)入換數(shù)X=abcde(5位BCD數(shù))
X= abcde=10[10[10[10a+b]+c]+d]+e
采用此方式,以高次向低位依次進(jìn)行二進(jìn)制的處理調(diào)整。
定義 H-byte=0X10
L-byte=0X11
R0 =0X12
R1 =0X13
R2 =0X14
H-temp=0x15
L-temp=0X16
BCDTOB CLR H-byte
mov A ,R0
and A ,@0X0FH
mov L-byte A
call Mpy10b ; 結(jié)果=10a+b
swapaA R1
call Mpy10b ;結(jié)果=10[10a+b]
mov A, R1
call Mpy10b;結(jié)果=10[10[10a+b]+c]
swapA R2
call Mpy10b ;結(jié)果=10[10[10[10a+b]+c]+d]
mov A, R2
and A,@0X0FH
add L-byte, A
JBC STATUS,C
JZ H-byte;果=10[10[10[10a+b]+C]+d+e
RET ;BCD 到BIN轉(zhuǎn)換結(jié)束 Mpy10b and A,@OXOFH
add L-byte,A
JBC STATUS,C
JZ H-byte
Mpy10a BC STATUS,C;單元及進(jìn)行除2處理
RLCA L-byte
MOV L-TEMP,A
RLCA H-byte ;最低位調(diào)整,
MOV H-temp,A ;
BC STATUS,C 逐步進(jìn)行除2處理
RLC L-byte
RLC H-byte
BC STATDS,C 進(jìn)行第三位二進(jìn)制處理
RLC L-byte
RLC H-byte
BC STATUS,C ;進(jìn)行第四位三進(jìn)制處理
RLC L-byte
RLC H-byte ;一直到第四位
MOV A,L-temp
ADD A,L-byte
JBC STATUS,C
INC H-byte
MOV A,H-temp
ADD H-byte,A
RET
主程序
main mov A, @0x60
mov R0, A
mov A, @0x55
mov R1, A
mov A, @0x35
mov R2, A
call BCDTOB
self goto self
end