HT1380串行實(shí)時時鐘芯片具有接口簡單、功耗低、工作電壓范圍寬、計時精確、功能全(可對分、秒、時、日、日期、月及帶閏年補(bǔ)償?shù)哪赀M(jìn)行計數(shù))、成本低等優(yōu)點(diǎn),因此在實(shí)際應(yīng)用中被廣泛采用,下面先簡單介紹一下該芯片的情況,然后實(shí)際工作中采用的子程序供讀者參考。 HT1380是一種串行實(shí)行時時鐘芯片,它提供秒、分、時、日、日期、月和年的信息。對于小于31天的月的月末日期能自動進(jìn)行調(diào)整,還包括閏年校正功能。低功耗設(shè)計且時鐘的運(yùn)行可以采用24小時格式或帶AM/PM指示的12小時的格式。HT1380含有若干寄存器用以存儲相應(yīng)信息。采用外部32.768KHZ晶振以提供正確定時。最少引腳數(shù)的串行I/0通信方式。與微處理器通信僅需三根線:1.YRST(復(fù)位)2.YSCLK(串行時鐘)3.YIO(數(shù)據(jù)線).數(shù)據(jù)傳送采用兩種模式,即單字節(jié)模式和多字節(jié)模式(至多為8個字節(jié),每一數(shù)據(jù)傳送由命令字節(jié)初始化,命令字節(jié)如下所示,最高位MSB(位7)必須置1;最低位LSB(位0)置1/0,表示為寫/讀周期;位3--1指定所需訪問的寄存器。 1.引腳排列
2.引腳說明 X1,X2: 32.768KHZ晶體振蕩器引腳 VSS: 地 YRST: 串行通信復(fù)位引腳 YIO: 串行通信數(shù)據(jù)輸入/輸出引腳 YSCLK: 串行通信的串行時鐘脈沖引腳 VDD: 電源 3.命令字節(jié) 每一數(shù)據(jù)傳送由命令字節(jié)初始化。命令字節(jié)如下所示,最高位MSB(位7)必須置1;最低位LSB(位0)置I/O,表示為寫/讀周期;位3~1指定所需訪問的寄存器。 下表顯示寄存器地址和它的數(shù)據(jù)格式: Pegister Address A2~A0 | Function | Command Address (HEX) | Write=w Read=R | Range Data (BCD) | Register Definition | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | 0 | Seconds | 80 81 | W R | 00~59 | CH | 10SEC | SEC | 1 | Minutes | 82 83 | W R | 00~59 | 0 | 10MIN | MIN | 2 | 12HRS 24HRS | 84 85 | W R | 01~12 00~23 | 12 24 | 0 0 | AP 10 | HR HR | HOUR | 3 | Date | 86 87 | W R | 01~31 | 0 | 0 | 10DATE | DATE | 4 | Month | 88 89 | W R | 01~12 | 0 | 0 | 0 | 10M | MONTH | 5 | Day | 8A 8B | W R | 01~07 | 0 | 0 | 0 | 0 | DAY | 6 | Year | 8C 8D | W R | 00~09 | 10YEAR | YEAR | 7 | Write Protect | 8E 8F | W R | 00~80 | WP | ALWAYS ZERO |
注:*CH: 時鐘暫停標(biāo)志 *寄存器2的位7: 12/24模式標(biāo)志 CH=0 允許振蕩器工作 位7=1: 12小時模式 CH=1時鐘振蕩器停止 位7=1:24小時模式 *WP: 寫保護(hù)位 *寄存器2的位5: AM/PM模式設(shè)置 WP=0 允許寫人數(shù)據(jù) AP=1 PM模式 WP=1 禁止寫人數(shù)據(jù) AP=0 AM模式 4. 圖5.11為單字節(jié)及多字節(jié)模式傳送時隙 圖5.11 單字節(jié)及多字節(jié)模式傳送時隙 |
4. 應(yīng)用框圖 6.實(shí)際例程清單:
HT1380 EQU 0X06 COUNT0 EQU 0X10 TXBUF EQU 0X11 RXBUF EQU 0X12 DATABUF EQU 0X13 ADDRPOINT EQU 0X14 HT_SDA_IN EQU 0B01001000 HD_SDA_OUT EQU 0B00001000 HT_SCL EQU 0 HT_RST EQU 1 Ht_SDA EQU 2 ; TX_1380: MOV A,@HT_SDA_OUT IOW HT1380 BC HT1380,HT_SCL MOV A,@8 MOV COUNT0,A TX_1380_LP: BC HT1380,HT_SDA JBC TXBUF,0 BS HT1380,HT_SDA BS HT1380,HT_SCL RRC TXBUF BC HT1380,HT_SCL DJZ COUNT0 JMP TX_1380_LP RET ;讀HT1380子程序 READ_HT: MOV TXBUF,A BC HT1380,HT_SCL BS HT1380,HT_RST MOV A,@HT_SDA_OUT IOW HT1380 MOV A,@8 MOV COUNT0,A TX_1_LP: BC HT1380,HT_SDA JBC TXBUF,0 BS HT1380,HT_SDA BS HT1380,HT_SCL RRC TXBUF BC HT1380,HT_SCL DJZ COUNT0 JMP TX_1_LP MOV A,@HT_SDA_IN IOW HT1380 MOV A,@8 MOV COUNT0,A RX_1380_LP: RRC RXBUF BC RXBUF,7 JBC HT1380,HT_SDA BS RXBUF,7 BS HT1380,HT_SCL BC HT1380,HT_SCL DJZ COUNT0 JMP RX_1380_LP BC HT1380,HT_RST RET ;寫HT1380子程序 WRITE_HT: MOV ADDRPOINT,A BC HT1380,HT_SCL BS HT1380,HT_RST MOV A,@0B1000110 MOV TXBUF,A CALL TX_1380 CLR TXBUF CALL TX_1380 BC HT1380,HT_RST NOP BS HT1380,HT_RST MOV A,ADDRPOINT MOV TXBUF,A CALL TX_1380 MOV A,DATABUF MOV TXBUF,A CALL TX_1380 BC HT1380,HT_RST NOP BS HT1380,HT_RST MOV A,@0B10001110 MOV TXBUF,A CALL TX_1380 MOV A,@0B10000000 MOV TXBUF,A CALL TX_1380 BC HT1380,HT_RST MOV A,HT_SDA_IN IOW HT1380 RET END
HD7279(A)是一片具有串行接口的,可同時驅(qū)動8位共陰式數(shù)碼管(或64只獨(dú)立LED)的智能顯示驅(qū)動芯片,該芯片同時還可連接多達(dá)64鍵的鍵盤矩陣。 HD7279內(nèi)部含有譯碼器,可直接接受16進(jìn)制碼,HD7279A還同時具有2種譯碼方式,HD7279(A)還具有多種控制指令,如消隱、閃爍、左移、右移、段尋址等。 特點(diǎn): ·串行接口 ·各位獨(dú)立控制譯碼/不譯碼及消隱和閃爍屬性 ·(循環(huán))左移/(循環(huán))右移指令 ·具有段尋址指令,方便控制獨(dú)立LED ·64鍵鍵盤控制器,內(nèi)含去抖動電路 控制指令 HD7279的控制指令分為二大類——純指令和帶有數(shù)據(jù)的指令。 ·純指令 1、復(fù)位(清除)指令 當(dāng)HD7279收到該指令后,將所有的顯示清除,所有設(shè)置的字符消隱、閃爍等屬性也被一起清除。執(zhí)行該指令后,芯片所處的狀態(tài)與系統(tǒng)上電后所處的狀態(tài)一樣。 2、測試指令 該指令使所有的LED全部點(diǎn)亮,并處于閃爍狀態(tài),主要用于測試。 3、左移指令 使所有的顯示自右向左(從第1位向第8位)移動一位(包括處于消隱狀態(tài)的顯示位),但對各位所設(shè)置的消隱及閃爍屬性不變。移動后,最右邊一位為空(無顯示)。例如,原顯示為 其中第2位‘3’和第4位‘L’為閃爍顯示,執(zhí)行了左移指令后,顯示變?yōu)?/DIV> 第二位‘9’和第四位‘P’為閃爍顯示。 4、右移指令 與左移指令類似,但所做移動為自左向右(從第8位向第1位)移動,移動后,最左邊一位為空。 5、循環(huán)左移指令 與左移指令類似,不同之處在于移動后原最左邊一位(第8位)的內(nèi)容顯示于最右位(第1位)。在上例中,執(zhí)行完循環(huán)左移指令后的顯示為 第二位‘9’和第四位‘P’為閃爍顯示。 6、循環(huán)右移指令 與循環(huán)左移指令類似,但移動方向相反。 ·帶有數(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=無影響 命令由二個字節(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ù),收到此指令時,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 | 空(無顯示) |
小數(shù)點(diǎn)的顯示由DP位控制,DP=1時,小數(shù)點(diǎn)顯示,DP=0時,小數(shù)點(diǎn)不顯示。 2、下載數(shù)據(jù)且按方式1譯碼(僅對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=無影響 此指令與上一條指令基本相同,所不同的是譯碼方式,且只有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為位地址(參見‘下載數(shù)據(jù)且譯碼’指令),A-G和DP為顯示數(shù)據(jù),分別對應(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 |
此命令控制各個數(shù)碼管的閃爍屬性。d1- d8分別對應(yīng)數(shù)碼管1-8,0=閃爍,1=不閃爍。開機(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 |
此命令控制各個數(shù)碼管的消隱屬性。d1- d8分別對應(yīng)數(shù)碼管1-8,1=顯示,0=消隱。當(dāng)某一位被賦予了消隱屬性后,HD7279在掃描時將跳過該位,因此在這種情況下無論對該位寫入何值,均不會被顯示,但寫入的值將被保留,在將該位重新設(shè)為顯示狀態(tài)后,最后一次寫入的數(shù)據(jù)將被顯示出來。當(dāng)無需用到全部8個數(shù)碼管顯示的時候,將不用的位設(shè)為消隱屬性,可以提高顯示的亮度。 注意:至少應(yīng)有一位保持顯示狀態(tài),如果消隱控制指令中d1- d8全部為0,該指令將不被接受,HD7279保持原來的消隱狀態(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=無影響;d0- d5為段地址,范圍從00H—3FH,具體分配為: 第1個數(shù)碼管的G段地址為00H,F(xiàn)段為01H,……A段為06H,小數(shù)點(diǎn)DP為07H,第2個數(shù)碼管的G段為08H,F(xiàn)段為09H,……,依此類推直至第8個數(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)亮指令’相同,請參閱上文。 8、讀鍵盤數(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)前的按鍵代碼。與其它指令不同,此命令的前一個字節(jié)00010101B為微控制器傳送到HD7279的指令,而后一個字節(jié)d0- d7則為HD7279返回的按鍵代碼,其范圍是0-3FH(無鍵按下時為0xFF),各鍵鍵盤代碼的定義,請參閱圖2。 此指令的前半段,HD7279的DATA引腳處于高阻輸入狀態(tài),以接受來自微處理器的指令;在指令的后半段,DATA引腳從輸入狀態(tài)轉(zhuǎn)為輸出狀態(tài),輸出鍵盤代碼的值。故微處理器連接到DATA引腳的I/O口應(yīng)有一從輸出態(tài)到輸入態(tài)的轉(zhuǎn)換過程,詳情請參閱本文‘串行接口’一節(jié)的內(nèi)容。 當(dāng)HD7279檢測到有效的按鍵時,KEY引腳從高電平變?yōu)榈碗娖�,并一直保持到按鍵結(jié)束。在此期間,如果HD7279接收到‘讀鍵盤數(shù)據(jù)指令’,則輸出當(dāng)前按鍵的鍵盤代碼;如果在收到‘讀鍵盤指令’時沒有有效按鍵,HD7279將輸出FFH (11111111B)。 串行接口 HD7279采用串行方式與微處理器通訊, 串行數(shù)據(jù)從DATA引腳送入芯片,并由CLK端同步。當(dāng)片選信號變?yōu)榈碗娖胶�,DATA引腳上的數(shù)據(jù)在CLK引腳的上升沿被寫入HD7279的緩沖寄存器。 HD7279的指令結(jié)構(gòu)有三種類型:1、不帶數(shù)據(jù)的純指令,指令的寬度為8個BIT,即微處理器需發(fā)送8個CLK脈沖。2、帶有數(shù)據(jù)的指令,寬度為16個BIT,即微處理器需發(fā)送16個CLK脈沖。3、讀取鍵盤數(shù)據(jù)指令,寬度為16個BIT,前8個為微處理器發(fā)送到HD7279的指令,后8個BIT為HD7279返回的鍵盤代碼。執(zhí)行此指令時,HD7279的DATA端在第9個CLK脈沖的上升沿變?yōu)檩敵鰻顟B(tài),并與第16個脈沖的下降沿恢復(fù)為輸入狀態(tài),等待接收下一個指令。 串行接口的時序如下圖: 1、純指令 2、帶數(shù)據(jù)指令
8位指令(高位在前) 8位數(shù)據(jù)(高位在前) 3、讀鍵盤指令 讀鍵盤指令(8位,高位在前) HD7279輸出的鍵盤代碼(8位,高位在前) 2、EM78P156 接口程序 硬件連接如圖,EM78P156所用時鐘頻率4MHz, 選4個時鐘周期為一個指令周期, ;轉(zhuǎn)移指令用2個指令周期。程序使用ASM456編譯程序編譯通過。程序中延時時間 ;以HD7279A外接R=1.5K, C=15pF為準(zhǔn),如使用不同的CPU時鐘頻率或R/C參數(shù), ;請注意調(diào)整延時時間。 圖 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 ;******************************************* ; 延時子程序 ;******************************************* LONG_DELAY: MOV A,@16 ;設(shè)定延時時間為約50uS MOV TIMER,A DELAY_LOOP: DJZ TIMER JMP DELAY_LOOP RET SHORT_DELAY: MOV A,@3 ;設(shè)定延時時間為約9uS MOV TIMER,A SHORT_LP: DJZ TIMER JMP SHORT_LP RET ;******************************************* ; 發(fā)送1個字節(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 ;長延時 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 ;短延時 BC P5,CLK ;設(shè)CLK為低電平 CALL SHORT_DELAY DJZ BIT_COUNT ;檢查是否8位均發(fā)送完畢 JMP SEND_LOOP ;未發(fā)送完,發(fā)送下一位 BC P5,DAT RET ;發(fā)送完畢,返回 ;******************************************* ; 從HD7279接收一個字節(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 ;長延時 RECEIVE_LOOP: BS P5,CLK ;置CLK為高電平 CALL SHORT_DELAY ;短延時 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 ;延時約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 ;檢測是否有鍵按下 JMP MAIN MOV A,@0B00010101 ;有鍵按下,發(fā)送讀鍵盤指令 CALL SEND ;發(fā)送讀鍵盤指令 CALL RECEIVE ;從HD7279A讀鍵盤代碼 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ā)送個位數(shù)字到HD7279A BS P5,CS WAIT JBS P5,KEY ;等待按鍵放開 JMP WAIT JMP MAIN ;EOP 二進(jìn)制做BCD加法,一定要注意每一位相加結(jié)果的調(diào)整,以轉(zhuǎn)換成BCD的數(shù)位,本程序使用二個步驟來完成結(jié)果調(diào)整,(產(chǎn)生DC標(biāo)志) 1.如果和的最低有效位是大于9的數(shù),或DC=1時,將和加6 2.經(jīng)過步驟1后,如果最高有效位大于9,或相加后C=1,則將和加上60H(即加6到MSD) 擴(kuò)展程序到2位數(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; 通過LSD加6,測試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減法(即做二個數(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ù)以上時,每個BCD位都使用以上的原則,標(biāo)志的測試(步驟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 這個程序是將5位BCD數(shù)轉(zhuǎn)換成一個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 |