找回密码
 注册
关于网站域名变更的通知
查看: 264|回复: 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,答案正确吧?
; N1 H, U* J8 v
  D; H3 e' w' `) J;C语言:) V9 z6 @; Y. r6 N
5 n  \9 L: H' l0 L+ W
;============================================. u7 V. \# V. G2 S/ d
;16位乘以16位乘法:被乘数:{MD1,MD0} 乘数:{MD5,MD4} 积:{MD3,MD2,MD1,MD0} 4 m9 j' k  B  _7 J" g
/ f, f# L) t' V4 z* [) J
;define MD3 (*(unsigned char volatile xdata *)0xfcf0) ) J: q+ U6 _/ I6 g* x3 A+ q
;#define MD2 (*(unsigned char volatile xdata *)0xfcf1) ' E) F/ ]7 u( N% I* S6 }
;#define MD1 (*(unsigned char volatile xdata *)0xfcf2) ' ~! r6 c& _5 @0 U, s( N4 B
;#define MD0 (*(unsigned char volatile xdata *)0xfcf3)
" \$ V4 X' A7 |/ l0 J7 G" j7 t;#define MD5 (*(unsigned char volatile xdata *)0xfcf4) % F6 c  X1 J  _- f% C" x
;#define MD4 (*(unsigned char volatile xdata *)0xfcf5)
& u# j% \1 z3 K* g+ u2 M, k;#define ARCON (*(unsigned      char volatile xdata *)0xfcf6) ) [# V. s# ]4 T) y9 M
;#define OPCON (*(unsigned      char volatile xdata *)0xfcf7)
0 ^$ j8 ]/ O6 R6 P) a;sfr              P_SW2                =              0xBA;            
, G# e! f) E* n/ O2 o! H9 q;////////////////////////////////////////////////////////////////////////////////
; _, R) C. A- U/ h. O3 Z& Z;//16位乘16位//////////////////////////////////////////////////////////////////////////////
4 j, G2 f9 e. [# h; y7 m;// unsigned long res; unsigned int dat1, dat2; $ w, s4 j$ D8 M0 I: [/ F8 E& n- N
_SW2 |= 0x80;     //访问扩展寄存器xsfr
8 O3 F% V8 P0 b* W9 _. A2 w. w;MD1U16 = dat1;     //dat1用户给定MD5U16 = dat2; //dat2用户给定. z7 u9 R+ m- d  \) V8 l
;ARCON = 4 << 5;    //16位*16位,乘法模式
3 _6 x0 c' C. q7 v3 p# g* y;OPCON = 1;         //启动计算
- k+ n8 o  e. r4 c" \% O;while((OPCON & 1) != 0); //等待计算完成
  |6 j/ z9 X6 d. b. \; O;res = MD3U32; //32位结
/ G0 c* j8 ~+ Z; ^  I* L- c7 m8 G* X
;汇编:
- G' R7 z/ m/ t, uHEADBUFFER1 EQU 0A0H
$ n- b3 H0 a! O7 }+ i1 E2 g0 F6 q' xLASTBUFFER1 EQU 0FFH   ;第一组缓冲区/ K0 ^! w2 O! `6 F' l; D
AUXR EQU 8EH
# X; n3 Z7 p1 r0 E( uAUXR2 EQU 0A2H
& y2 V0 |, P$ }8 K3 G" v% HWAKE_CLKO EQU 08FH   
- K& I2 W5 q" L
/ I: B) q! L* B; U% PMD0 EQU 0FCF3H
  Z% z  E; W1 H3 v$ M5 Q3 JMD1 EQU 0FCF2H
' c$ ~1 E. t, _* ]5 `) {0 ~MD2 EQU 0FCF1H
6 ~! c/ r3 s! \. B6 bMD3 EQU 0FCF0H5 ~5 t4 B/ D% Q/ |
MD4 EQU 0FCF5H: P' D1 K* m+ h* `$ J8 `0 S
MD5 EQU 0FCF4H
  X/ O7 y) G/ a& o+ t7 Q% a3 sARCON EQU 0FCF6H
6 f1 w9 ~/ @$ t' gOPCON EQU 0FCF7H; d& m: e/ ~" ~
P_SW2 EQU 0BAH            ;当需要访问 XFR 时,必须先将 EAXFR 置 1,才能对 XFR 进行正常的读写
2 ?3 \, n) O: T* y7 w8 v; b9 I0 f0 r1 O) U# _* H* ?
ORG 0000H
5 C8 m" }6 R3 W0 q& B& FLJMP MAIN
  [2 }$ `  p+ r8 x, j" `9 PORG 0023H& M+ ?! [9 k, S( [8 `
LJMP UART1    ;UART1 RECEIVED INTERRUPT
  ?: m# w" C" f1 ZORG 0100H
9 w$ K$ {* a- c7 O9 z# M2 `6 E1 v, q( T
MAIN:$ q0 s3 m8 e! S4 z" T, K
LCALL DELAY1  ;用STC-ISP的串口助手,必须给点时间切换,否则上载后来不及接收结果(00 02 16 38)接收口波特率为115200 晶振:11.0592 STC8G2K32S4
1 d3 Q+ ~7 c+ [3 @LCALL DELAY1
9 x3 r. Q( ^$ W) y* ZLCALL DELAY1
2 B, c7 g& P9 N9 U5 {" ?
0 V, E/ X- ?$ J1 u1 iLCALL IOSET% |2 B: a5 l6 ^. S

/ F- u. I4 d( P7 ^% n: RCLR P1.0
: L, _1 W1 h, Z4 Y- E
6 E+ Y3 L; t$ P/ zMOV WAKE_CLKO,#00000001B     ;ENABLE BRT(=4),T1(=2) T0(=1) HAVE CLOCK OUTPUT BRT@P1.0 T1@P3.5 T0@P3.45 f% d& p' n" I2 J: `/ [; J3 E1 r
MOV AUXR,#11111100B          ;T0X12,T1X12,UART_M0X6,BRTRUN,S2SMOD,BRTX12,EXTRAM,S1BRS ; u/ t- y/ q+ ^' O4 h8 M3 x
MOV AUXR2, #00000000B        ;#00010000B=SHIFT UART28 z4 T/ S( b( |+ R* P, R
MOV TMOD, #00100010B         ;TIMER0, TIMER1 AS MOD2(8 BYTE AUTO RELOAD TIMER)% W/ _* }/ U4 h1 h* |
                             ;GATE, C/T,M1,M0(T1) GATE, C/T,M1,MO(T0) + c  G/ I" d& `/ Q+ B
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)$ s2 M5 H; E2 L& a" s+ [0 p
" m  }0 G( z$ ^& b3 h# a
LCALL INITIAL_UART1        ;USE T1 AS SERIAL BAUD GENERATE FOR UART1
3 m! D* N% o  b9 X# H) oCLR RI
, \+ Y  J% S& s4 K1 D& ?CLR TI% M' p9 U% X: M4 ~1 W  t
SETB  EA                  ;ENABLE ALL INTERRUPT
% N+ N' v' v& m0 m4 J# z; B# N0 i8 v  H; Q0 Q
MOV P_SW2,#80H            ;访问X寄存器打开
0 }: v- ]* x7 ?* g) c/ a. k1 R- Z+ X' M9 q% n6 j- r; Z' e. @8 n
MOV DPTR,#MD1             ;
# _0 L" I$ M, A: J0 ~2 @" Z, Y7 P9 VMOV A, #01H               ;必须通过A才能送到
6 z' D$ S. U0 E7 m! @  q; O( L. rMOVX @DPTR,A# r+ }% ^. Z) b$ s6 I9 p- x) g9 i

! ~( i3 U2 T" ]6 @3 LMOV DPTR,#MD0             ;
( f8 S% D+ T3 n. a! [- I8 GMOV A, #07H               ;必须通过A才能送到4 k8 Z. R. [' k% E% J& S+ _
MOVX @DPTR,A
$ K1 W( Z2 [9 ^' P$ b9 x- a. g- r; b1 w  g$ b
MOV DPTR,#MD5             ;
5 `' c/ b* O) v( B6 J/ WMOV A, #02H               ;必须通过A才能送到
0 Q2 O: w1 @4 u! ~6 B  k. L$ n, x9 KMOVX @DPTR,A
) ~* n- o* C; f/ q/ A+ u; S$ }, @' i% W( e  [
MOV DPTR,#MD4             ;6 F& W. d. j& H; w
MOV A, #08H               ;必须通过A才能送到% ~* t- W# E! I- D( d* h$ i1 d
MOVX @DPTR,A. i; [$ j: F' B! Z
. ^2 |1 ]5 q. @! B$ K
MOV DPTR,#ARCON           ;
/ l3 L, i7 M/ K( n0 IMOV A, #10000000B         ;b7,b6,b5 4=16X16 5=16/16 ! T4 \1 }. o; E3 V
MOVX @DPTR,A
9 `  j6 M% j8 N
- m2 D! Q8 p' L$ x" S+ GMOV DPTR,#OPCON           ;启动运算/ m6 J7 A! Z, v# v. r& c$ V8 ]
MOV A, #00000001B            
/ s6 E8 {6 X/ d( o  {6 L# B% AMOVX @DPTR,A0 U: q3 Z& O- V: V+ G

; a2 w) A% v" h( UWAIT:4 h' Z7 f+ S2 ]) q% R7 J1 |
MOVX A, @DPTR
) H  a3 h6 C4 Q$ VANL A, #00000001B
& d# I7 ?: i8 k# |# ~JNZ  WAIT
. i7 R1 r0 O. L- Z0 h+ ]
- s2 h* u% e4 p( [+ Y* s2 F3 p# TMOV DPTR, #MD3             , d( m4 F2 ?3 R) e8 I
MOVX A, @DPTR
" U; a1 O  R9 s1 E6 T1 k! h* ~. m6 L2 J
LCALL SENTONEBYTE1
/ E- a6 x& l6 V* s+ N# _) t- ?; k3 q  j) }6 X: s1 ~, Y
MOV DPTR,#MD2           ' p' ]5 ]5 E. J2 R
MOVX A, @DPTR+ [7 b) h! |) ~/ k) ?  I3 |& `7 u7 O
* O- l5 k9 P0 C9 r8 x- P( p* D
LCALL SENTONEBYTE1( L# E* y% b+ [* }5 K
# C9 b8 b/ y0 h5 W* N3 b- a
MOV DPTR, #MD1             * W- B6 R5 u  Z* P/ {0 B
MOVX A, @DPTR" L$ G1 J8 m8 T* k4 n0 Y
7 E3 K* W; s/ z# g0 A
LCALL SENTONEBYTE1
! q( H- M; r1 C6 }1 j+ E
! ^3 {! j$ {6 v* MMOV DPTR,#MD0          : Z0 e9 {) z5 y
MOVX A, @DPTR
. M1 O0 F! x* M6 N4 U5 x! X( f8 k6 w( p1 H1 ]
LCALL SENTONEBYTE1+ P( Y. H% N( N; u1 q2 p

0 V+ B! k( E' Z, O8 r4 u7 tMOV P_SW2,#00H            ;访问完毕要关闭
9 j5 Y, Q! I( j
4 C; S4 a1 `' W8 U' z1 j, QLED:                      ;停机
+ @) n& f. P( R0 }: a+ n2 ^5 t8 }& V- n
JMP LED5 w% |* B2 Z3 t- `

* ~$ l7 s: }  J  ?+ }/ S0 PNEXTBUFFER:
: B# e' L9 H, x  X- [9 i: gCJNE R0, #LASTBUFFER1, NEXTBUFFER2
/ q4 U; w5 X' ]MOV R0, #HEADBUFFER11 P' @! v$ L1 ~- N
JMP NEXTBUFFEREXIT2 C) I6 {5 s5 H7 W6 J1 J
NEXTBUFFER2:  C# O# K' i7 p7 r/ }
INC R0  OINT TO NEXT BYTE
  Q6 P3 F- F% M3 N, vNEXTBUFFEREXIT:
$ Q: l/ D1 A% c; J+ tRET
2 w, t# K: H, @  A
7 i0 S1 C5 c( P8 H% F- s% XSENTONEBYTE1:                ;SENT OUT A
4 o" _& k  Y2 I: S5 q6 HCHECKBUSY1:0 q& M, K9 g9 a& P+ T' b. L% ~
JB 40H, CHECKBUSY1
4 \) I8 V7 B6 _9 VSETB 40H
" x  C' W5 m5 n) NMOV SBUF, A
9 ~* i8 S( `0 D8 v) N0 z& VRET* _; ^- f) r% v9 w

) i/ c% P) r- v7 s9 x3 y6 @6 aUART1:      ;RECEIVED DATA FROM AIR/ V# k* J: M& ?3 v; n
PUSH ACC
# H; B& U# P8 u; ^PUSH PSW7 ?- W5 A  v- G* o9 L  H5 [
JNB RI, UART1CHECKTI
0 x" Y, ~9 `+ n; X& v9 tMOV A, SBUF ;READ THE CHARACTER FROM THE SERIAL PORT) r' G4 K7 }7 Z
CLR RI      ;CLEAR RECEICED FLAG0 K$ p* p  E7 ]3 C: I+ b- R
MOV @R1, A  ;SAVE TO BUFFER
* C& Y  f" ]; {1 K2 NCJNE R1, #LASTBUFFER1, NEXTREADBUFFER
4 U; ?  [* M9 ~( VMOV R1, #HEADBUFFER19 }* |& b# }8 j' l; I
JMP UART1EXIT
% B  y* `7 q( G" |/ y, L. vNEXTREADBUFFER:
5 j: E' c' M# Z2 yINC R1  OINT TO NEXT BUFFER0 |0 P- x4 `# I7 U( z2 c) G, I
JMP UART1EXIT
( E+ y( i; V8 Z; G* fUART1CHECKTI:# p7 v& D( d& W" a2 {$ N& f0 k. p
CLR TI
; x. l/ {5 M8 n0 |6 P8 NCLR 40H      
- @/ Z4 o: ^! a5 l1 M1 d. JUART1EXIT:; C& u* u3 J$ t. T/ H+ E" U, z" C* H
POP PSW+ M" o( e- u- H- V
POP ACC4 ~" O  }' \8 K& s# Q! Q$ {( c
RETI
  `* y6 K5 N4 @, m
% {8 @- M+ f4 `2 r) VINITIAL_UART1:           ;115200
# C# D# _# l4 O1 _+ yMOV SCON, #01010000B     ;SET AS BAUD VERIABLE, NO ODD/EVEN CHECK
8 L/ W! Q8 I& n& U. SMOV TH1, #253            ;247(11.0592, 38400BPS) FOR TIMER_1 251=115200(18.4320M 115200BPS) 253(11.0592M 115200BPS) IF PCON.7=0    $ _& t, a: }' X
MOV TL1, #253
9 C# b6 V; n9 e: j. [7 p; eSETB PS                  ;SERIAL PORT PRORITY HIGH
2 ]* L6 z$ D/ Z" i5 y+ P1 b' dSETB TR1                 ;RUN TIMER_1
: K) v0 l) ~, Y+ BSETB ES                  ;ENABLE UART1 INTERRUPT
/ h" U5 K- I( |  C& u* ]% J- i) qRET, O/ W1 Q- Q) A$ G

- Y: f2 r8 ], p  HIOSET:
: E; x( P, f% @/ k9 k* S;-----------I/O CONFIGUE( B' k2 y1 ~$ l' v6 m
MOV 93H, #00000000B      ;SET P0 0,0=I/0, 0,1=HIGH CURRENT OUTPUT, 1,0=HIGH IMPEDENY INPUT 1,1=OPEN COLLECTIVE OUTPUT7 l% f) I- c( R( d9 r. Z8 t  {! Q1 n
MOV 94H, #00000000B      ;SET P0 (CONMAIN WITH 93H THIS IS SENCOND BIT)
6 q/ b9 b: U8 \( [# s. a% KMOV 91H, #00000000B      ;SET P1
$ C$ A# {7 E' p( Z* J1 y$ SMOV 92H, #00000000B      ;SET P1
5 y* `0 m8 L) g4 ?MOV 95H, #00000000B      ;SET P2
1 Y( ~, d0 B) K: r" G, {/ WMOV 96H, #00000000B      ;SET P2& k- W9 I5 t' H9 G
MOV 0B1H, #00000000B     ;SET P3
; s3 d3 Z( v4 y/ _5 P/ ~+ qMOV 0B2H, #00000000B     ;SET P3
  l3 m" T+ u5 Y  }. ~; E6 FMOV 0B3H, #00000000B     ;SET P4
- Z# h5 v3 Y7 |8 f; }MOV 0B4H, #00000000B     ;SET P4
; h6 e% p: I, N, `MOV 0C9H, #00000000B     ;SET P5
5 m9 o( F& [) e- [% vMOV 0CAH, #00000000B     ;SET P5
, `  A' \! H, b4 @! F;MOV 0CBH, #00000000B     ;SET P6
" R& q7 R4 h# l  G! ^;MOV 0CCH, #00000000B     ;SET P6
$ W! F$ G/ u0 w* {;MOV 0E1H, #00000000B     ;SET P7
6 R" A; h$ r% k6 W$ Y;MOV 0E2H, #00000000B     ;SET P7* D7 h# n6 a7 Q# b+ W/ `, E
RET
0 ?  i& ?/ E7 J
* ^" @. o' N1 ^; @% {5 XDELAY1:% b3 ^7 f) i" e3 ~, c7 @
LCALL DELAY2
- R8 C' O9 ~5 G0 B, d; uLCALL DELAY2
, ]% J; V$ i' A( KSETB P1.0
( t3 @! N9 ]1 z! W$ m6 A! rLCALL DELAY2
; _; b# W9 t# ^; r2 p0 `LCALL DELAY2) F9 m) G2 N, F2 T' X! E
CLR P1.0
2 M: q' t9 B- e! gRET1 @+ r. U; H& ?
0 w4 r6 [9 h* \2 N. R. t/ _
DELAY2:
5 y! \7 G9 y2 k, nMOV 35H, #255
/ E1 D  b- R  P0 z! q8 Z) j. rSLOWDOWN0:# O3 |! v& `. k" F. C3 z
MOV 34H, #170" w; c- f& a# X0 c2 a5 r
SLOWDOWN:5 j; B1 V+ J. g: {1 l6 Q
MOV 36H, #2, u/ N) v1 \' ~2 t; v/ _; b$ }
SLOWDOWN2:# {; Q9 b3 A) f! U1 \7 e
DJNZ 36H, SLOWDOWN2 3 X/ g% G( e0 N& S3 D! L
DJNZ 34H, SLOWDOWN 3 D! ~# W- }6 w9 u$ b
DJNZ 35H, SLOWDOWN0
8 c# O  x* o- x# BRET
6 |% f; _9 ]( y0 J9 M& e5 ?0 d* _- g$ H* R. M& ?
END
) M# _* p" ]/ H4 j: d% t7 Q% d3 X; ~4 Z, j

该用户从未签到

2#
发表于 2022-6-9 10:05 | 只看该作者
(; P)是8 W1 o6 U* J. P% R) z. B, E2 v/ l) ~
啊啊啊,

该用户从未签到

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

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-7-19 02:53 , Processed in 0.125000 second(s), 23 queries , Gzip On.

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

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

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