找回密码
 注册
查看: 235|回复: 3
打印 上一主题 下一主题

STC8G单片机MDU16位乘除法器C语言改汇编程序

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2022-6-9 09:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
最近需要用到16位乘16位,记得STC有硬件的16位乘除法器,看了说明书,找到了例程,却只有C语言的,看来汇编已经快被抛弃了,只好自己改写,C语言就是一堆难懂的符号,像这句“ARCON = 4 << 5;    //16位*16位,乘法模式"就看不懂,但只要看原理说明就知道,这乘除法器就设在传统51单片结构外,利用一个P_SW2的寄存器做开关,开关打开后,就可以用DPTR指针往外面的寄存器(MD0-MD5)赋值,再打开一个外面的开关OPCON,就会开始运算,等若干时钟后把运算结果读进来,再把P_SW2关闭就可以了。明白了原理后写汇编就很简单了。为了验证寄存器没有搞错,将结果通过UART1显示出来,网上有不少HEX的运算器,我把数字放上去计算,出来的结果都看不懂,最后是把16位的乘数和被乘数都转换成是进制,再用五元的家用计算器算出结果,再把结果转为HEX,0107HX0208H=00021638H,答案正确吧?
* i4 D$ m/ G7 |' K4 c) z+ ]4 a* m3 j! e; X; q& q
;C语言:
+ B/ S0 c0 C3 R% M. L6 m8 ~1 F" I, Z. V3 u& ?
;============================================1 M3 {+ f% f# R) M
;16位乘以16位乘法:被乘数:{MD1,MD0} 乘数:{MD5,MD4} 积:{MD3,MD2,MD1,MD0}
+ Z, G% D0 @8 K) M! e$ M4 h9 x3 H  m% b& A7 X: O/ X3 \1 S- M
;define MD3 (*(unsigned char volatile xdata *)0xfcf0)
0 r* q0 f& R& v2 ~;#define MD2 (*(unsigned char volatile xdata *)0xfcf1) 0 {7 r+ L3 O# w4 Q4 W7 ?  s( `
;#define MD1 (*(unsigned char volatile xdata *)0xfcf2) 2 _6 k) Y- G1 ?; L
;#define MD0 (*(unsigned char volatile xdata *)0xfcf3) 4 N/ z& P( o: u  B. n/ {
;#define MD5 (*(unsigned char volatile xdata *)0xfcf4)
8 s: `' J4 e  Z& v% U+ o! h3 K: i;#define MD4 (*(unsigned char volatile xdata *)0xfcf5) ) n; |7 ?+ ^) W% W
;#define ARCON (*(unsigned      char volatile xdata *)0xfcf6)
$ s2 [, S3 d) h6 w;#define OPCON (*(unsigned      char volatile xdata *)0xfcf7)
; X# O6 z$ x* K: @;sfr              P_SW2                =              0xBA;             $ d7 q" P% J* T$ e
;//////////////////////////////////////////////////////////////////////////////// 1 x6 w8 A4 r' L4 }; k
;//16位乘16位//////////////////////////////////////////////////////////////////////////////
/ Z# t8 V4 [  R5 V1 X! D) c- g2 Y# z;// unsigned long res; unsigned int dat1, dat2;
+ k; k- d+ q* B, d_SW2 |= 0x80;     //访问扩展寄存器xsfr
0 g0 f% F1 X: p4 b" P;MD1U16 = dat1;     //dat1用户给定MD5U16 = dat2; //dat2用户给定9 `! s4 _! m* s+ A* X8 j* M; L
;ARCON = 4 << 5;    //16位*16位,乘法模式
/ d) B0 C& G; Q+ ]7 z# G6 F;OPCON = 1;         //启动计算
( Y! ^, K& `5 t" U;while((OPCON & 1) != 0); //等待计算完成$ ]: m1 l: i8 R5 }" F  I
;res = MD3U32; //32位结
$ y: a' j* S! E9 }% h$ p( n/ Y1 V, a# v
;汇编:3 D1 D4 a. I3 R% S. W, p/ A, E
HEADBUFFER1 EQU 0A0H4 b; m. S  D# ]
LASTBUFFER1 EQU 0FFH   ;第一组缓冲区+ P+ P/ h! D% R. ^5 z
AUXR EQU 8EH5 z1 z5 Y: @; b0 X
AUXR2 EQU 0A2H! ?2 E4 y7 {3 H7 c
WAKE_CLKO EQU 08FH   
. L% ~+ n; W' R/ J7 m, m/ B% S$ H- x9 H7 ]4 Y
MD0 EQU 0FCF3H
4 |; P+ ?6 W- g) e" }. K; a; l7 ZMD1 EQU 0FCF2H4 F' {% v' z- l# @8 N
MD2 EQU 0FCF1H
+ W6 }* v  h: N2 e7 B, @  M+ KMD3 EQU 0FCF0H) W5 w5 L) ^" F
MD4 EQU 0FCF5H
3 d! d; q6 u( r6 h4 uMD5 EQU 0FCF4H( q- i% L) w1 B4 p% {
ARCON EQU 0FCF6H4 P) Y. I% T' X1 w/ p! E* s3 V+ h( {
OPCON EQU 0FCF7H8 C8 u6 d- y( X
P_SW2 EQU 0BAH            ;当需要访问 XFR 时,必须先将 EAXFR 置 1,才能对 XFR 进行正常的读写
3 L4 ~! ~) j9 L$ s# q. k9 S+ \. q$ O! l; t) K
ORG 0000H
6 p8 c: W! K% t/ C6 ELJMP MAIN7 J3 u$ i5 a6 X0 C6 `
ORG 0023H
+ W' t, @9 M4 dLJMP UART1    ;UART1 RECEIVED INTERRUPT
/ t, P  L& r, U6 ?& t/ H, i8 XORG 0100H
/ x: S: n  w5 E8 g5 n8 z$ F* E, l! ?  {2 e' R$ A8 @
MAIN:$ z& t! n9 ?- c& n. W* k
LCALL DELAY1  ;用STC-ISP的串口助手,必须给点时间切换,否则上载后来不及接收结果(00 02 16 38)接收口波特率为115200 晶振:11.0592 STC8G2K32S45 }5 _$ u+ W4 K
LCALL DELAY15 g6 j7 g9 T" g& t2 L
LCALL DELAY1
( d( C  d; G4 a5 z- P) V
- z+ E+ @8 w/ v5 E- N1 fLCALL IOSET+ Q- K, O; g1 D. B( \

. ^! C5 i7 f; V- H1 Z* bCLR P1.0  b6 f6 o8 j# M$ G

2 d2 u  L; H7 G7 ]! b9 [; G0 ZMOV WAKE_CLKO,#00000001B     ;ENABLE BRT(=4),T1(=2) T0(=1) HAVE CLOCK OUTPUT BRT@P1.0 T1@P3.5 T0@P3.4* E5 C; p9 ~. V1 u
MOV AUXR,#11111100B          ;T0X12,T1X12,UART_M0X6,BRTRUN,S2SMOD,BRTX12,EXTRAM,S1BRS
$ b# |# c+ V6 L$ I8 a# MMOV AUXR2, #00000000B        ;#00010000B=SHIFT UART2$ B+ f: \* d0 ]* c; p/ F
MOV TMOD, #00100010B         ;TIMER0, TIMER1 AS MOD2(8 BYTE AUTO RELOAD TIMER)
0 ^2 T, Z( \& T' Y" y$ d9 H                             ;GATE, C/T,M1,M0(T1) GATE, C/T,M1,MO(T0) ; k& N( c3 P9 Z, Q* B9 A9 P1 W6 h
MOV PCON, #00000000B         ;THIS DOUBLE THE BRT AND T0 T1 RATE; SMOD IS AT PCON.7 249(3.64=32US) 219(18M= 2USX16=32US MIDI VIEW AT P3.5)
( l! d& l( {/ B3 ^: K2 g1 J# U% V& g7 j
LCALL INITIAL_UART1        ;USE T1 AS SERIAL BAUD GENERATE FOR UART1
, _+ E; ]0 _" O- K5 JCLR RI$ _4 j# e- a8 J# ?5 n. j) J# W
CLR TI
1 s" r5 _& _, pSETB  EA                  ;ENABLE ALL INTERRUPT
  T2 p* M" R( \, R
$ K8 N1 r' I$ ~0 bMOV P_SW2,#80H            ;访问X寄存器打开% \" Z! r" b$ C+ g

; W" e- H& u2 {MOV DPTR,#MD1             ;
1 G5 @8 z' x6 V/ {MOV A, #01H               ;必须通过A才能送到
: H7 H/ O$ X6 b) s3 ~MOVX @DPTR,A9 X) O4 ^, e. }! s; p
# G. T# ^- f4 R1 w' p9 @9 H, l
MOV DPTR,#MD0             ;
+ F+ W9 X" K" E4 J, \1 a6 HMOV A, #07H               ;必须通过A才能送到8 I8 B+ r+ P* \, x  y8 x# ^+ F
MOVX @DPTR,A
( M; p  d6 [" r% G' T
9 [- J) c: Z+ Y: r# ?$ }0 _MOV DPTR,#MD5             ;
/ h; z( ]- t' AMOV A, #02H               ;必须通过A才能送到* A+ `2 G6 z4 U, w6 B0 _
MOVX @DPTR,A
3 j( C" I' R) X5 e/ |% R4 I1 }$ q
* K0 p9 W! n6 M2 H/ z+ CMOV DPTR,#MD4             ;
& p1 ~+ z+ J& B8 b+ ]7 Y+ `MOV A, #08H               ;必须通过A才能送到) d4 y/ x% ~! G6 l" ~' }
MOVX @DPTR,A& S* t. v5 Z( T8 T

9 H/ ^$ `$ n* S" s! `MOV DPTR,#ARCON           ;2 b, K% {. Y7 j) k" y! ^
MOV A, #10000000B         ;b7,b6,b5 4=16X16 5=16/16
; a1 k8 r/ `# OMOVX @DPTR,A( Y  D$ d3 Y; g' d. S1 n, u
2 M0 }2 w0 A. {3 E6 Q' ]: O
MOV DPTR,#OPCON           ;启动运算
& M/ k$ V9 `6 f1 wMOV A, #00000001B            
3 ]; F1 Q" k8 ^MOVX @DPTR,A2 ]: ]- S2 h, V9 W- l/ Y

' z8 [) r( C3 n  d& O& `WAIT:
2 C4 K) Z8 Z. A2 K& fMOVX A, @DPTR5 b6 \) k3 B8 I9 a4 A8 W/ ~- ]
ANL A, #00000001B! J6 b( t' E: {+ c" e/ x" R
JNZ  WAIT
7 S+ n  \* ]: k% {. w# ~$ a
/ I# i% _# r2 T: S3 [) eMOV DPTR, #MD3             ) D9 \  i1 W6 w6 ^
MOVX A, @DPTR/ ]+ _; e* i, D+ m, F7 M* f9 B$ C& N
- H8 q2 o2 `" h, o
LCALL SENTONEBYTE1
( b( ?  D1 h9 S; m* F* p9 k) {( h! z7 }" U; x2 x
MOV DPTR,#MD2           4 w# H# I% B7 L' E' h2 U
MOVX A, @DPTR
+ E0 B1 B  Z' v( S8 Y- C# A" Q
' V( b% D; t* _/ e5 _LCALL SENTONEBYTE1
% j" P+ Y: a1 r3 t4 ~! U7 g
2 u- w( w7 l4 j8 ~: k: L9 [) }MOV DPTR, #MD1             - r4 I' h3 A/ e, _9 d- V
MOVX A, @DPTR
' F, @2 z' y  d  k8 _# U8 s* @' p$ _7 e# r+ Q9 }
LCALL SENTONEBYTE1
" {1 E* {# W9 z3 ~$ S6 g% Y# D1 m" Z: u$ |  K
MOV DPTR,#MD0         
+ D# o; ?. K/ b( u# EMOVX A, @DPTR& i9 |6 }& c/ C9 t( T# u1 G
- ~+ }" U* N' U
LCALL SENTONEBYTE13 i+ f2 O4 P% [& \, p
! g* n- ~: n+ G8 S
MOV P_SW2,#00H            ;访问完毕要关闭
: U7 {! h: a2 I1 m/ R: q
5 a  g2 v- y' J' a7 N/ _3 j* eLED:                      ;停机
. @% o0 u/ M" y9 [+ ~& @; F3 D- J0 C6 u& j& `# S4 O& p0 y9 ?. E- B
JMP LED
: q" g, H0 _" J5 |/ ?
4 Q1 @" U0 E4 L" ENEXTBUFFER:
$ S8 m# C+ q' h0 h% K( s: h8 \CJNE R0, #LASTBUFFER1, NEXTBUFFER2# x0 i# @; s7 D1 s% C0 |
MOV R0, #HEADBUFFER1
) t9 x# s, z! t; EJMP NEXTBUFFEREXIT
1 d" @$ \5 w: e7 t) e( e, PNEXTBUFFER2:9 \& r4 S/ m( {7 y: |: P
INC R0  OINT TO NEXT BYTE
5 g3 c/ n. e1 j  SNEXTBUFFEREXIT:9 k$ l6 c2 I5 i/ ]+ k
RET
+ b0 U' B8 u0 t( N, n' u( j/ n" P
! J" |: u% N* ]) @4 d% ASENTONEBYTE1:                ;SENT OUT A6 X, R8 F6 [1 D1 a/ l. b
CHECKBUSY1:
2 }0 b4 \! U; ]1 _, h. ?' g; oJB 40H, CHECKBUSY19 M' }. }; q3 z( W
SETB 40H
7 n; N9 ]( Z: {( KMOV SBUF, A, P8 \1 v( J( C& E# k/ x6 T
RET
/ F" @: j2 O; ?
" F( q6 F5 s3 ?! Y) n' Y! \UART1:      ;RECEIVED DATA FROM AIR
* N! U! h" T1 u( Y3 {2 \1 wPUSH ACC
! z* b5 L' S: m, U8 CPUSH PSW/ Q! V' Y( Q5 l
JNB RI, UART1CHECKTI$ G: M5 k( C7 B" ?/ x! D: u
MOV A, SBUF ;READ THE CHARACTER FROM THE SERIAL PORT: l  {% V# ~# P: F
CLR RI      ;CLEAR RECEICED FLAG" m1 D$ I2 h8 X% Z9 I7 w
MOV @R1, A  ;SAVE TO BUFFER
4 g8 w1 e3 K/ [& I! zCJNE R1, #LASTBUFFER1, NEXTREADBUFFER
) R, v7 C# M& e1 K3 ?2 t/ aMOV R1, #HEADBUFFER14 E5 f, [3 N' {% {6 K+ f
JMP UART1EXIT
. ]6 t' M$ b0 ~. xNEXTREADBUFFER:
8 k. p1 K" n# rINC R1  OINT TO NEXT BUFFER
7 n% k6 u/ ^/ VJMP UART1EXIT8 z( ^8 F( y. `9 K9 s
UART1CHECKTI:- g0 g* Q+ e. M) }7 ~
CLR TI7 ~7 j; N0 A$ {  E( ?' d
CLR 40H      
1 }' c0 D, H, A" }9 j1 f- hUART1EXIT:
; \0 [2 p' N% I+ FPOP PSW
( W3 g6 I! D' L: M0 CPOP ACC
, e) i- D& o  ~1 u) BRETI
) \+ A9 ~! J* t  E. ?" q# q$ o+ O( f  T" ?0 @7 [& l$ z
INITIAL_UART1:           ;115200
1 G) a, D5 S/ W0 \( _7 [' Q. JMOV SCON, #01010000B     ;SET AS BAUD VERIABLE, NO ODD/EVEN CHECK
4 I" z+ q$ F4 N% K( l% \8 [! NMOV TH1, #253            ;247(11.0592, 38400BPS) FOR TIMER_1 251=115200(18.4320M 115200BPS) 253(11.0592M 115200BPS) IF PCON.7=0   
! i& U0 L( U6 [4 X9 B5 VMOV TL1, #2538 z/ A( K" ?! @6 \
SETB PS                  ;SERIAL PORT PRORITY HIGH) F% E5 j0 y" w! K
SETB TR1                 ;RUN TIMER_1
& l, `9 s. D) Q6 t) J+ dSETB ES                  ;ENABLE UART1 INTERRUPT$ F# m5 f  E3 d+ |1 B
RET7 X0 s5 {* k9 f3 g8 T" g' O& M/ R
9 P- H, |0 P8 [+ W& J
IOSET:
+ \' h9 Z: Z( k9 H3 |) H;-----------I/O CONFIGUE
; i# Y7 p6 h5 ]& N$ AMOV 93H, #00000000B      ;SET P0 0,0=I/0, 0,1=HIGH CURRENT OUTPUT, 1,0=HIGH IMPEDENY INPUT 1,1=OPEN COLLECTIVE OUTPUT
( j) D$ f+ q5 }% O. t( mMOV 94H, #00000000B      ;SET P0 (CONMAIN WITH 93H THIS IS SENCOND BIT)( x0 b- M' m+ O: z4 J
MOV 91H, #00000000B      ;SET P11 t" A, s7 e0 ~9 z! X1 w* K& g6 v
MOV 92H, #00000000B      ;SET P1
2 U$ u, z+ u9 g+ ~: IMOV 95H, #00000000B      ;SET P2) k7 W- q4 M( v, E9 [
MOV 96H, #00000000B      ;SET P2& T4 [$ B, T2 |/ C/ \  I$ J
MOV 0B1H, #00000000B     ;SET P3
* W+ j1 |0 ]8 F; YMOV 0B2H, #00000000B     ;SET P32 ]$ a. M  d) F7 b; [
MOV 0B3H, #00000000B     ;SET P4
7 @, J( a: p( D* V# tMOV 0B4H, #00000000B     ;SET P47 E* i: O% u* |1 T% Z
MOV 0C9H, #00000000B     ;SET P5" L1 `' N/ R+ y1 H/ n0 |
MOV 0CAH, #00000000B     ;SET P5$ b3 Q. J# u& ?8 `  v( Y6 s) ]
;MOV 0CBH, #00000000B     ;SET P6
7 D: E1 Y+ B" m# ?;MOV 0CCH, #00000000B     ;SET P66 k! F* O- S3 f* \2 q
;MOV 0E1H, #00000000B     ;SET P7
9 Y( H8 T/ r3 M0 z8 `1 L, O( ?4 C;MOV 0E2H, #00000000B     ;SET P7
9 E: {8 d1 ?3 b/ PRET
# \: z  e4 C& O& x% a; b6 j
7 O9 u  H2 H* ^% LDELAY1:9 m& U# S* }+ M
LCALL DELAY2
7 s+ u# @- R* a% l. @& v" FLCALL DELAY2! `' Q! O, B# ^9 w- p8 l- O" B- R$ P
SETB P1.0 % ]/ ~# [! L7 |
LCALL DELAY2
: X4 [  W1 f: I& TLCALL DELAY2
$ ]* p' ~; f" Z% Q3 KCLR P1.0
- t, f2 s6 a% S4 e$ p3 {: X8 A" URET
7 q& h4 `  E" l
; T6 h+ u1 d  f7 iDELAY2:1 g: l6 {; r, q( V- S+ u
MOV 35H, #255
6 B9 a/ }; {( l2 A3 b4 Q  CSLOWDOWN0:
# N& i* [; H! t$ B9 \4 H% z3 R# j, SMOV 34H, #170
+ }6 f' p9 L3 s6 GSLOWDOWN:# L) W: U! ?/ A
MOV 36H, #2& b5 s; c& l. l  L4 J, w9 g
SLOWDOWN2:" h) }0 ^6 Y7 t5 N8 p) `) |
DJNZ 36H, SLOWDOWN2
2 h$ N. i# V' M# U2 hDJNZ 34H, SLOWDOWN
9 c- j6 y' _* Y" l' wDJNZ 35H, SLOWDOWN0
: H+ o* M: a8 [# NRET
. A$ H" I( V$ }, t* X2 N7 l' G" t" z1 a* d
END
; W3 A9 v$ w5 A" ^+ f9 ]8 x
. {5 L) X$ F# K7 S

该用户从未签到

2#
发表于 2022-6-9 10:05 | 只看该作者
(; P)是- O- J8 _) R& Q) `6 V
啊啊啊,

该用户从未签到

3#
发表于 2022-6-9 13:54 | 只看该作者
逆向学习学习。啊哈哈哈

该用户从未签到

4#
发表于 2022-6-9 14:54 | 只看该作者
逆向学习学习。啊哈哈哈
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-5-26 05:07 , Processed in 0.078125 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表