5.3.7. 串行实时时钟芯片的接口
HT1380串行实时时钟芯片具有接口简单、功耗低、工作电压范围宽、计时精确、功能全(可对分、秒、时、日、日期、月及带闰年补偿的年进行计数)、成本低等优点,因此在实际应用中被广泛采用,下面先简单介绍一下该芯片的情况,然后实际工作中采用的子程序供读者参考。
HT1380是一种串行实行时时钟芯片,它提供秒、分、时、日、日期、月和年的信息。对于小于31天的月的月末日期能自动进行调整,还包括闰年校正功能。低功耗设计且时钟的运行可以采用24小时格式或带AM/PM指示的12小时的格式。HT1380含有若干寄存器用以存储相应信息。采用外部32.768KHZ晶振以提供正确定时。最少引脚数的串行I/0通信方式。与微处理器通信仅需三根线:1.YRST(复位)2.YSCLK(串行时钟)3.YIO(数据线).数据传送采用两种模式,即单字节模式和多字节模式(至多为8个字节,每一数据传送由命令字节初始化,命令字节如下所示,最高位MSB(位7)必须置1;最低位LSB(位0)置1/0,表示为写/读周期;位3--1指定所需访问的寄存器。
1.引脚排列

2.引脚说明
X1,X2: 32.768KHZ晶体振荡器引脚
VSS: 地
YRST: 串行通信复位引脚
YIO: 串行通信数据输入/输出引脚
YSCLK: 串行通信的串行时钟脉冲引脚
VDD: 电源
3.命令字节
每一数据传送由命令字节初始化。命令字节如下所示,最高位MSB(位7)必须置1;最低位LSB(位0)置I/O,表示为写/读周期;位3~1指定所需访问的寄存器。
下表显示寄存器地址和它的数据格式:
|
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: 时钟暂停标志 *寄存器2的位7: 12/24模式标志
CH=0 允许振荡器工作 位7=1: 12小时模式
CH=1时钟振荡器停止 位7=1:24小时模式
*WP: 写保护位 *寄存器2的位5: AM/PM模式设置
WP=0 允许写人数据 AP=1 PM模式
WP=1 禁止写人数据 AP=0 AM模式
4. 图5.11为单字节及多字节模式传送时隙
![]() |
|
|
|
图5.11 单字节及多字节模式传送时隙 |
4. 应用框图

6.实际例程清单:
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
5.3.8. HD7279串行接口8位LED数码管及64键键盘智能控制芯片

HD7279内部含有译码器,可直接接受16进制码,HD7279A还同时具有2种译码方式,HD7279(A)还具有多种控制指令,如消隐、闪烁、左移、右移、段寻址等。
特点:
·串行接口
·各位独立控制译码/不译码及消隐和闪烁属性
·(循环)左移/(循环)右移指令
·具有段寻址指令,方便控制独立LED
·64键键盘控制器,内含去抖动电路
控制指令
HD7279的控制指令分为二大类——纯指令和带有数据的指令。
·纯指令
1、复位(清除)指令
|
D7 |
D6 |
D5 |
D4 |
D3 |
D2 |
D1 |
D0 |
|
1 |
0 |
1 |
0 |
0 |
1 |
0 |
0 |
当HD7279收到该指令后,将所有的显示清除,所有设置的字符消隐、闪烁等属性也被一起清除。执行该指令后,芯片所处的状态与系统上电后所处的状态一样。
2、测试指令
|
D7 |
D6 |
D5 |
D4 |
D3 |
D2 |
D1 |
D0 |
|
1 |
0 |
1 |
1 |
1 |
1 |
1 |
1 |
该指令使所有的LED全部点亮,并处于闪烁状态,主要用于测试。
3、左移指令
|
D7 |
D6 |
D5 |
D4 |
D3 |
D2 |
D1 |
D0 |
|
1 |
0 |
1 |
0 |
0 |
0 |
0 |
1 |
使所有的显示自右向左(从第1位向第8位)移动一位(包括处于消隐状态的显示位),但对各位所设置的消隐及闪烁属性不变。移动后,最右边一位为空(无显示)。例如,原显示为
|
4 |
2 |
5 |
2 |
L |
P |
3 |
9 |
其中第2位‘3’和第4位‘L’为闪烁显示,执行了左移指令后,显示变为
|
2 |
5 |
2 |
L |
P |
3 |
9 |
|
第二位‘9’和第四位‘P’为闪烁显示。
4、右移指令
|
D7 |
D6 |
D5 |
D4 |
D3 |
D2 |
D1 |
D0 |
|
1 |
0 |
1 |
0 |
0 |
0 |
0 |
0 |
与左移指令类似,但所做移动为自左向右(从第8位向第1位)移动,移动后,最左边一位为空。
5、循环左移指令
|
D7 |
D6 |
D5 |
D4 |
D3 |
D2 |
D1 |
D0 |
|
1 |
0 |
1 |
0 |
0 |
0 |
1 |
1 |
与左移指令类似,不同之处在于移动后原最左边一位(第8位)的内容显示于最右位(第1位)。在上例中,执行完循环左移指令后的显示为
|
2 |
5 |
2 |
L |
P |
3 |
9 |
4 |
第二位‘9’和第四位‘P’为闪烁显示。
6、循环右移指令
|
D7 |
D6 |
D5 |
D4 |
D3 |
D2 |
D1 |
D0 |
|
1 |
0 |
1 |
0 |
0 |
0 |
1 |
0 |
与循环左移指令类似,但移动方向相反。
·带有数据的指令
1、下载数据且按方式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=无影响
命令由二个字节组成,前半部分为指令,其中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为数据,收到此指令时,HD7279(A)按以下规则(译码方式0)进行译码,如下表:
|
十六进制 |
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 |
空(无显示) |
小数点的显示由DP位控制,DP=1时,小数点显示,DP=0时,小数点不显示。
2、下载数据且按方式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才具有此指令。该指令的译码按下表进行:
|
十六进制 |
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、下载数据但不译码
|
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为位地址(参见‘下载数据且译码’指令),A-G和DP为显示数据,分别对应7段LED数码管的各段。
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 |
此命令控制各个数码管的闪烁属性。d1- d8分别对应数码管1-8,0=闪烁,1=不闪烁。开机后,缺省的状态为各位均不闪烁。
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 |
此命令控制各个数码管的消隐属性。d1- d8分别对应数码管1-8,1=显示,0=消隐。当某一位被赋予了消隐属性后,HD7279在扫描时将跳过该位,因此在这种情况下无论对该位写入何值,均不会被显示,但写入的值将被保留,在将该位重新设为显示状态后,最后一次写入的数据将被显示出来。当无需用到全部8个数码管显示的时候,将不用的位设为消隐属性,可以提高显示的亮度。
注意:至少应有一位保持显示状态,如果消隐控制指令中d1- d8全部为0,该指令将不被接受,HD7279保持原来的消隐状态不变。
6、段点亮指令
|
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 |
此为段寻址指令,作用为点亮数码管中某一指定的段,或LED矩阵中某一指定的LED。
指令中,X=无影响;d0- d5为段地址,范围从00H—3FH,具体分配为:
第1个数码管的G段地址为00H,F段为01H,……A段为06H,小数点DP为07H,第2个数码管的G段为08H,F段为09H,……,依此类推直至第8个数码管的小数点DP地址为3FH。
7、段关闭指令
|
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 |
段寻址命令,作用为关闭(熄灭)数码管中的某一段,指令结构与‘段点亮指令’相同,请参阅上文。
8、读键盘数据指令
|
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读出当前的按键代码。与其它指令不同,此命令的前一个字节00010101B为微控制器传送到HD7279的指令,而后一个字节d0- d7则为HD7279返回的按键代码,其范围是0-3FH(无键按下时为0xFF),各键键盘代码的定义,请参阅图2。
此指令的前半段,HD7279的DATA引脚处于高阻输入状态,以接受来自微处理器的指令;在指令的后半段,DATA引脚从输入状态转为输出状态,输出键盘代码的值。故微处理器连接到DATA引脚的I/O口应有一从输出态到输入态的转换过程,详情请参阅本文‘串行接口’一节的内容。
当HD7279检测到有效的按键时,KEY引脚从高电平变为低电平,并一直保持到按键结束。在此期间,如果HD7279接收到‘读键盘数据指令’,则输出当前按键的键盘代码;如果在收到‘读键盘指令’时没有有效按键,HD7279将输出FFH (11111111B)。
串行接口
HD7279采用串行方式与微处理器通讯, 串行数据从DATA引脚送入芯片,并由CLK端同步。当片选信号变为低电平后,DATA引脚上的数据在CLK引脚的上升沿被写入HD7279的缓冲寄存器。
HD7279的指令结构有三种类型:1、不带数据的纯指令,指令的宽度为8个BIT,即微处理器需发送8个CLK脉冲。2、带有数据的指令,宽度为16个BIT,即微处理器需发送16个CLK脉冲。3、读取键盘数据指令,宽度为16个BIT,前8个为微处理器发送到HD7279的指令,后8个BIT为HD7279返回的键盘代码。执行此指令时,HD7279的DATA端在第9个CLK脉冲的上升沿变为输出状态,并与第16个脉冲的下降沿恢复为输入状态,等待接收下一个指令。
串行接口的时序如下图:
1、纯指令

2、带数据指令


8位指令(高位在前) 8位数据(高位在前)
3、读键盘指令

读键盘指令(8位,高位在前) HD7279输出的键盘代码(8位,高位在前)
2、EM78P156 接口程序
硬件连接如图,EM78P156所用时钟频率4MHz, 选4个时钟周期为一个指令周期,
;转移指令用2个指令周期。程序使用ASM456编译程序编译通过。程序中延时时间
;以HD7279A外接R=1.5K, C=15pF为准,如使用不同的CPU时钟频率或R/C参数,
;请注意调整延时时间。
图 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 ;设定延时时间为约50uS
MOV TIMER,A
DELAY_LOOP: DJZ TIMER
JMP DELAY_LOOP
RET
SHORT_DELAY: MOV A,@3 ;设定延时时间为约9uS
MOV TIMER,A
SHORT_LP: DJZ TIMER
JMP SHORT_LP
RET
;*******************************************
; 发送1个字节到HD7279,高位在前
;*******************************************
SEND: MOV DATA_OUT,A ;待发送数据存入DATA_OUT
MOV A,@8
MOV BIT_COUNT,A ;设定位记数器=8
BC P5,CS ;设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 ;设CLK为高电平
CALL SHORT_DELAY ;短延时
BC P5,CLK ;设CLK为低电平
CALL SHORT_DELAY
DJZ BIT_COUNT ;检查是否8位均发送完毕
JMP SEND_LOOP ;未发送完,发送下一位
BC P5,DAT
RET ;发送完毕,返回
;*******************************************
; 从HD7279接收一个字节,高位在前
;*******************************************
RECEIVE: MOV A,@8
MOV BIT_COUNT,A ;设定位记数器=8
MOV A,@0B11111100 ;设P5.2(DATA)口为输入状态
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 ;读取一位数据
BC P5,CLK ;置CLK为低电平
CALL SHORT_DELAY
DJZ BIT_COUNT ;是否已接收8位数据
JMP RECEIVE_LOOP
MOV A,@0B11111000 ;重新设P52(DATA)口为输出态
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 ;发复位(清除)指令
CALL SEND
BS P5,CS ;恢复CS为高电平
;*******************************************
; 主程序
;*******************************************
MAIN: JBC P5,KEY ;检测是否有键按下
JMP MAIN
MOV A,@0B00010101 ;有键按下,发送读键盘指令
CALL SEND ;发送读键盘指令
CALL RECEIVE ;从HD7279A读键盘代码
BS P5,CS ;设CS为高电平
;*******************************************
; 16进制——BCD码转换
;*******************************************
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
;*******************************************
;发送按键的BCD码到HD7279A
;*******************************************
;发2次左移指令,使当前显示内容左移,留出空
;位供显示新数据
OVER MOV A,@0B10100001 ;左移指令
CALL SEND ;发送指令到HD7279A
MOV A,@0B10100001 ;左移指令
CALL SEND ;发送指令到HD7279A
MOV A,@0B10000001 ;下载数据且译码指令(第2位)
CALL SEND ;发送指令到HD7279A
MOV A,TEN
CALL SEND ;发送十位数字到HD7279A
MOV A,@0B10000000 ;下载数据且译码指令(第1位)
CALL SEND ;发送指令到HD7279A
MOV A,DATA_IN
CALL SEND ;发送个位数字到HD7279A
BS P5,CS
WAIT JBS P5,KEY ;等待按键放开
JMP WAIT
JMP MAIN
;EOP
5.4. 算术例程
5.4.1. 无符号的BCD加法
二进制做BCD加法,一定要注意每一位相加结果的调整,以转换成BCD的数位,本程序使用二个步骤来完成结果调整,(产生DC标志)
1.如果和的最低有效位是大于9的数,或DC=1时,将和加6
2.经过步骤1后,如果最高有效位大于9,或相加后C=1,则将和加上60H(即加6到MSD)
扩展程序到2位数以上时,所有位相都必须带C标志(或DC)一起相加,而且上面的原则沿深到每一位数的处理,即从原数相加,步骤1、步骤2的加法所产生的进位都必须进位到下一位。
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放加数,0X21放被加数
Result=0X20; 运行后和放在0X21,进位
Num-2=0X21; 放到0X20中
0-Flow=0X21;
;加法子程序
BCDADD MOV A,Num-1
ADD Num-2, A; 作二进制加法
CLR Num-1
RLC Num-1; 保存进位
JBC STATUS, DC; DC=0?
JMP Adjust; 不是,调整,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恢复原数据
JMP over1
Adjust MOV A, @6H jLSD加6调整;
ADD Num-2, A
Over1 mov A, @60H ;MSD加6调整,
ADD Num2, A
JBC STATUS,C ;MSD<9
JMP over3
JBC Num-1, 0
SUB Num-2 ;
RET
Over3 MOV A,@01H ;保存和的进位
MOV Num-1,A
RET
5.4.2. 无符号的BCD减法
使用二进制数做2位数BCD减法(即做二个数补码的加法),但须注意调整其相减结果成为正确的BCD数。
1.如果差的低4位(LSD)>9,则 从LSD减去6(产生的DC被加到下一位数)
2.步骤1它成后,如果差的高4位(MSD)>9,则从MSD减去6。
一般扩展到二位数以上时,每个BCD位都使用以上的原则,标志的测试(步骤2)是在二补码的加法完成后进行,当0X20=9,结果是VE,取十补码以取得它的值。

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;做二进制减法
SUb Num-2, A
CLR Num-1;
RLC Num-1; 保存进位
JBS STATUS, DC; DC=1?
JMP Adjust; 不是,LSD调整
JBS Num-2, 3
JMP Over-1
JBC Num-2,2
JMP adjust1;LSD结果调整
JBS Num-2,1
JMP Over-1
Adjst1 mov A ,@6 ;不是,转到MSD进行处理
JMP over1 ;LSD调整(减6)
Sub Num-2,A
Over-1 JBS Num-1,0 ;C=0?
JMP adjst2 ;是,进行MSD调整
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调整
Sub Num-2 , A
CLR Num-1 ,
JBS STATS,C
MOV A , 1
MOV Num-1,A
Over RET
5.4.3. BCD TO BIN 转换
这个程序是将5位BCD数转换成一个16位二进制数,5位BCD数依次存放于R0、R1、R2、MSD在R0的最右端,将16进制数转出示存器H-byte和L-byte

一般转换方法是:转入换数X=abcde(5位BCD数)
X= abcde=10[10[10[10a+b]+c]+d]+e
采用此方式,以高次向低位依次进行二进制的处理调整。
定义 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 ; 结果=10a+b
swapaA R1
call Mpy10b ;结果=10[10a+b]
mov A, R1
call Mpy10b;结果=10[10[10a+b]+c]
swapA R2
call Mpy10b ;结果=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转换结束 Mpy10b and A,@OXOFH
add L-byte,A
JBC STATUS,C
JZ H-byte
Mpy10a BC STATUS,C;单元及进行除2处理
RLCA L-byte
MOV L-TEMP,A
RLCA H-byte ;最低位调整,
MOV H-temp,A ;
BC STATUS,C 逐步进行除2处理
RLC L-byte
RLC H-byte
BC STATDS,C 进行第三位二进制处理
RLC L-byte
RLC H-byte
BC STATUS,C ;进行第四位三进制处理
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
