; 预写内容存放在RTC_REG0.RTC_REG0.RTC_REG2.RTC_REG3,最高位在RTC_REG0
SPI4BYTE: mov R2,#4 ; 写4字节
mov R0,#RTC_REG3 ; 预字内容起地址->R0
clr SPI_LE ; 芯片使能
LOOPING:mov R7,#8 ; 每字节8bit
mov A,@R0 ; 以R0为地址的内容->A
acallTX8BIT
dec R0 ; 地址减1
djnz R2,LOOPING ; 已写4字节?
clr SPI_SCK
nop
setb SPI_LE
ret
TX8BIT: clr SPI_SCK
rrc A
mov SPI_SDO,C ; 低位在前,输出1bit
nop
setb SPI_SCK
djnz R7,TX8BIT
ret 汇编刚刚的,(我是看不懂)。。。。 本帖最后由 mov99 于 2022-12-2 17:44 编辑
ITOUR 发表于 2022-12-2 16:06
汇编刚刚的,(我是看不懂)。。。。
写着玩儿,而且,部分运算代码是抄来的:lol ; PIC18Fxxx汇编代码
; 写RTC6705,低字节在前,低位在前;片选=SPI_LE.时钟=SPI_SCK.数据=SPI_SDO
; 预写内容存放在RTC_REG0.RTC_REG0.RTC_REG2.RTC_REG3,最高位在RTC_REG0
MakeDatabcf SPI_LE ; RTC6705使能
movlw .25 ; 写25bit
movwf COUNTS
SendCodebcf SPI_SCK ; SPI_SCK=0
rrcf RTC_REG0,F
rrcf RTC_REG1,F
rrcf RTC_REG2,F
rrcf RTC_REG3,F ; 低位在前(右移),输出1bit
btfsc STATUS,C ; 查询,数据=0?
bsf SPI_SDO ; 否,置SPI_SDO
btfss STATUS,C ; 再查,数据=1?
bcf SPI_SDO ; 否,清SPI_SDO
bcf STATUS,C
bsf SPI_SCK
decfszCOUNTS ; 已写25bit?
bra SendCode ; 否,继续
bcf SPI_SCK
nop
bsf SPI_LE ; RTC6705禁止
return ; 24X8位二进制无符号除法
; 除数在AARGB3;被除数及商存放在BARGB0.BARGB1.BARGB2
; 余数存放在CARGB0.CARGB1.CARGB2
DIV_24X8movlw .24 ; 循环24次
movwf COUNTS
movff BARGB0,DARGB0 ; 复制被除数
movff BARGB1,DARGB1
movff BARGB2,DARGB2
clrf BARGB0
clrf BARGB1
clrf BARGB2
clrf CARGB0
clrf CARGB1
clrf CARGB2
TO_LOOP bcf STATUS,C ; C=0
rlcf DARGB2,F
rlcf DARGB1,F
rlcf DARGB0,F
rlcf CARGB2,F
rlcf CARGB1,F
rlcf CARGB0,F
bsf STATUS,C ; C=1
movf CARGB1,F
bnz CHK_NO
movf AARGB3,W
subwf CARGB2,W
CHK_NO bnc NOT_GO
movf AARGB3,W
subwf CARGB2,F ; 余数-除数 ->CARGB2
clrf WREG
subwfbCARGB1,F
subwfbCARGB0,F
bsf STATUS,C
NOT_GO rlcf BARGB2,F ; C->B
rlcf BARGB1,F
rlcf BARGB0,F
decfszCOUNTS,F ; 已检查所有位?
bra TO_LOOP ; 否,继续
return ; HEX码转BCD码(似曾相识?由MSC-51移植而来)
; HEX码输入到CARGB1.CARGB2.CARGB3,最高位是CARGB1
; 压缩BCD码输出在R0.R1.R2.R3,最高位是R0
HEX4BCD movlw .24 ; 循环24次
movwf COUNTS
clrf R0 ; 清零,待用
clrf R1
clrf R2
clrf R3
TO_4BCD rlcf CARGB3,F ; 带C左移,7bit->C
rlcf CARGB2,F
rlcf CARGB1,F
movf R3,W
addwfcR3,W ; BCD码带进位自身相加(相当于乘2)
daw ; 十进制调整
movwf R3 ; 结果送回自身
movf R2,W
addwfcR2,W
daw
movwf R2
movf R1,W
addwfcR1,W
daw
movwf R1
movf R0,W
addwfcR0,W
daw
movwf R0
decfszCOUNTS,F ; 处理完24bit?
bra TO_4BCD ; 否,继续
return ; 根据已知载波频率、参考频率,求除B、除A计数器值
; 芯片含除2固定分频器;预分频器P除64/65(P=64);除B计数器;除A计数器(或余数吞除)
; 载波频率=[(64*B+A)*2]*REF
; ① N=载波频率÷(参考频率x固定分频);② B=N÷64(取整数);③ A=N-(B*64)
; 载波频率在TX_BYTE0.TX_BYTE1.TX_BYTE2;除B在RTC_REG0.RTC_REG1;除A在RTC_REG2
FreqDescmovlw .20 ; 参考频率=20KHz
mullw .2 ; 乘以固定分频2
movff PRODL,AARGB3 ; 积->AARGB3(除数)
movff TX_BYTE0,BARGB0 ; 被除数(频率字)
movff TX_BYTE1,BARGB1
movff TX_BYTE2,BARGB2 ; 低8位
call DIV_24X8 ; 求除N;载波频率÷参考频率(含固定分频)
movff BARGB0,R0
movff BARGB1,R1 ; 备份除N,待用
movff BARGB2,R2
movlw .64 ; 除数(预分频P=64)
movwf AARGB3
call DIV_24X8 ; N÷P,求除B(取整数)
movff BARGB1,RTC_REG0
movff BARGB2,RTC_REG1 ; 除B->RTC_REG0.RTC_REG1
clrf BARGB0 ; 清零
movf RTC_REG1,W ; 除B->W
mullw .64 ; W*P
movff PRODL,BARGB2 ; 积低8位->BARGB2
movff PRODH,BARGB1 ; 高8位->BARGB1
movf RTC_REG0,W ; 除B高8位->W
mullw .64
movf PRODL,W ; 积->W
addwf BARGB1,F
clrf WREG ; 清工作寄存器
addwfcBARGB0,F ; 高位+进位位
movf PRODH,W
addwf BARGB0,F ; 积+高8位
movf BARGB2,W ; 除B->W
subwf R2,F ; N-(B*64),求除A
movf BARGB1,W
subwfbR1,F ; 减(含借位位)
movf BARGB0,W
subwfbR0,F ; 最高位
btfss STATUS,C ; 查询,运算出错?
bra ErroTips ; ***是,到提示***
movff R2,RTC_REG2 ; 正确!除A->RTC_REG2
return
;---------------------------------
ErroTips: nop ; 错误处理
; .......
bra $
页:
1
[2]