您的位置:首页单片机义隆单片机
内容搜索:
阅读内容
背景:#EDF0F5 #FAFBE6 #FFF2E2 #FDE6E0 #F3FFE1 #DAFAF3 #EAEAEF 默认  

第四章 EM78系列单片机程序设计 (3)

[日期:2008-02-12 ] [来源:东哥开发网(www.picavr.com) 作者:佚名] [字体: (投递新闻)

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(A)是一片具有串行接口的,可同时驱动8位共阴式数码管(或64只独立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
阅读:
录入:JETTA

推荐 】 【 打印
本文评论
      全部评论
发表评论


点评: 字数
姓名:
站长推荐