;**************************************************************
;8位格雷码转换成二进制码
;8位格雷码在ACC中,转换后一字节二进制码仍在ACC中
;占用R7,PSW
G2B8: MOV R7,#7
RL A
GB1: JNB ACC.0,GB2
CPL ACC.7
GB2: RL A
DJNZ R7,GB1
RET
;**************************************************************
;16位格雷码转换成二进制码
;16位格雷码高字节在R2中,低字节在R3中.转换结果仍在R2R3中
;占用:ACC,PSW,R7
G2B16: MOV R7,#15 ;计数器赋值
MOV A,R3 ;第一次左移一位
RLC A
MOV R3,A
MOV A,R2
RLC A
MOV R2,A
MOV A,R3
MOV ACC.0,C
MOV R3,A
G2B161: JNB ACC.0,G2B162 ;移出的一位异或尚未移出的最高位,结果在尚未移出
MOV A,R2 ;的最高位
CPL ACC.7
MOV R2,A
G2B162: MOV A,R3 ;左移一位
RLC A
MOV R3,A
MOV A,R2
RLC A
MOV R2,A
MOV A,R3
MOV ACC.0,C
MOV R3,A
DJNZ R7,G2B161 ;未完成则继续
RET
;**************************************************************
;8位二进制数(在ACC中)转换成格雷码,转换结果仍在ACC中
B2G8: MOV R7,#7
RLC A ;B1->CY
MOV ACC.0,C ;B1->ACC.0
BGLOP: JNB ACC.7,BG4
CPL C ;CY(Bi-1) XOR Bi->CY
BG4: RLC A ;CY->Gi,Bi->CY
DJNZ R7,BGLOP
RET
;**************************************************************
;16位二进制数转换成格雷码
;16位二进制码在R2R3中(R2高字节),转换结果仍在R2R3中
;占用:ACC,PSW,R7
B2G16: MOV R7,#15
MOV A,R2 ;B1->CY
MOV C,ACC.7
MOV A,R3
RLC A
MOV R3,A
MOV A,R2
RLC A
MOV R2,A
JNB ACC.7,BG161
CPL C ;CY(Bi-1) XOR Bi->CY
BG161: MOV A,R3
RLC A ;CY->Gi
MOV R3,A
MOV A,R2
RLC A
MOV R2,A
JNB ACC.7,BG162
CPL C
BG162: DJNZ R7,BG161
RET
;**************************************************************