找回密码
 注册
关于网站域名变更的通知
查看: 280|回复: 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,答案正确吧?
* l: _) A7 x0 i8 R' l2 X" ^; Z
. @' P8 Q" c3 g9 C0 t! W4 I;C语言:: Z! C4 B- ], z8 [- p9 N% d+ N( A
( x  P7 B/ W$ z$ r! k: n
;============================================
  @3 E# N  J- C4 @;16位乘以16位乘法:被乘数:{MD1,MD0} 乘数:{MD5,MD4} 积:{MD3,MD2,MD1,MD0} % q7 w3 P5 k5 O2 @

) d5 n# L$ r/ M/ Y4 P8 P;define MD3 (*(unsigned char volatile xdata *)0xfcf0)
6 N# a  M# {8 x! ^" e' @& p; F;#define MD2 (*(unsigned char volatile xdata *)0xfcf1) 5 ^: o9 ~* @3 ^3 a
;#define MD1 (*(unsigned char volatile xdata *)0xfcf2)
2 H% R6 p4 T( o5 q% R" ~;#define MD0 (*(unsigned char volatile xdata *)0xfcf3)
0 Q; M( Y: G4 o6 m8 d) K;#define MD5 (*(unsigned char volatile xdata *)0xfcf4)
; h: R+ q4 B) z$ d4 B1 W" ?, ?;#define MD4 (*(unsigned char volatile xdata *)0xfcf5)
. h9 X3 |, N8 p" V. u2 R1 v;#define ARCON (*(unsigned      char volatile xdata *)0xfcf6)
9 J' P& G9 i) i- b5 @5 P! D. z;#define OPCON (*(unsigned      char volatile xdata *)0xfcf7)% @9 C: F6 v* N3 a
;sfr              P_SW2                =              0xBA;             # a0 y3 B  O7 ]
;//////////////////////////////////////////////////////////////////////////////// 8 b0 V1 q+ u; q7 O- |
;//16位乘16位//////////////////////////////////////////////////////////////////////////////
6 u$ @8 y' C) N4 M;// unsigned long res; unsigned int dat1, dat2;
0 [; W& I( A' K: t3 N3 X_SW2 |= 0x80;     //访问扩展寄存器xsfr  t# y) v+ K, ~* g3 r
;MD1U16 = dat1;     //dat1用户给定MD5U16 = dat2; //dat2用户给定  p. v; U$ N' A5 f1 t4 |
;ARCON = 4 << 5;    //16位*16位,乘法模式
9 ]! M- R9 C8 k+ p: d2 A;OPCON = 1;         //启动计算: {# |. n) c- L  `2 E: V" a
;while((OPCON & 1) != 0); //等待计算完成
7 _# m" e: p4 w9 e% S$ P;res = MD3U32; //32位结
$ G  m! I4 P  p5 P& ~/ b& j- y8 z# H( @# n
;汇编:" _9 K, n# R2 r# U
HEADBUFFER1 EQU 0A0H* [8 d' ^1 V' c$ q: D2 E" ?
LASTBUFFER1 EQU 0FFH   ;第一组缓冲区
1 Q2 i- K$ @) v5 @+ Z, e8 A9 U4 YAUXR EQU 8EH
! B% G+ H! M# k5 q, u: b2 W& vAUXR2 EQU 0A2H
" u' g. B9 Y3 E: E+ F7 y' V2 w4 sWAKE_CLKO EQU 08FH   
. E' z  _# n$ j- |% B) X1 D4 K  w9 L4 w" }
MD0 EQU 0FCF3H
! [" B$ v' G  O' C; r5 ^MD1 EQU 0FCF2H
- ~- p9 n( r9 IMD2 EQU 0FCF1H
/ z8 y6 f! N; {+ u- V; B$ i3 AMD3 EQU 0FCF0H1 o: K8 Q$ s7 U; v1 o1 }
MD4 EQU 0FCF5H5 w6 N, y- G# V+ P' V
MD5 EQU 0FCF4H7 b1 t( `9 ?. P; k3 S9 z
ARCON EQU 0FCF6H
% N' j6 A" H- B2 X% \OPCON EQU 0FCF7H6 T6 W5 D' w7 P: [2 c) L
P_SW2 EQU 0BAH            ;当需要访问 XFR 时,必须先将 EAXFR 置 1,才能对 XFR 进行正常的读写) p9 W. X6 W+ d( }' f
, t+ Q. R; O& q8 l" m* j5 h
ORG 0000H
1 _( K4 r; Q. o3 `1 bLJMP MAIN4 f2 @* m0 j( i2 s2 H; k3 A  J; y
ORG 0023H
& s* [. K0 B  m; }% Y2 fLJMP UART1    ;UART1 RECEIVED INTERRUPT7 s- ?/ y) D) j* L  d/ t: W
ORG 0100H1 d4 F. ^% K/ y- B
8 x/ l4 M1 X1 U
MAIN:$ G3 w# \$ T0 t% S( X6 b3 k
LCALL DELAY1  ;用STC-ISP的串口助手,必须给点时间切换,否则上载后来不及接收结果(00 02 16 38)接收口波特率为115200 晶振:11.0592 STC8G2K32S4
+ @3 y: `# e0 ?6 F6 KLCALL DELAY12 l- I6 j- F9 {  V* Y  w
LCALL DELAY16 P. L; o8 ]4 A2 L# i, f
' H$ W# K% n" E# Z" {2 {
LCALL IOSET% y5 W% E: u% Q

" |" h( V. s! W- n6 ECLR P1.02 ^% ~% A$ F% B8 F3 Q

0 d- W' q4 q! r7 s9 U& XMOV WAKE_CLKO,#00000001B     ;ENABLE BRT(=4),T1(=2) T0(=1) HAVE CLOCK OUTPUT BRT@P1.0 T1@P3.5 T0@P3.4( k" {* |* `' i( F
MOV AUXR,#11111100B          ;T0X12,T1X12,UART_M0X6,BRTRUN,S2SMOD,BRTX12,EXTRAM,S1BRS
) Z0 z) [  b' J/ E5 XMOV AUXR2, #00000000B        ;#00010000B=SHIFT UART2' O( @& g8 D1 t
MOV TMOD, #00100010B         ;TIMER0, TIMER1 AS MOD2(8 BYTE AUTO RELOAD TIMER)
. T( H" L+ B4 X, _- ~$ A/ j; E                             ;GATE, C/T,M1,M0(T1) GATE, C/T,M1,MO(T0) ( k& N* w3 s# h: R; @6 s; a6 d2 i8 y
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)
( Q* v' a: \  \, p' C$ }9 Z# K$ O5 W3 i) M
LCALL INITIAL_UART1        ;USE T1 AS SERIAL BAUD GENERATE FOR UART1
1 o' v& O) y: n6 VCLR RI7 X* V6 W5 V) c! N9 J
CLR TI
: ]: j) i! j3 V+ z2 w$ q/ f: GSETB  EA                  ;ENABLE ALL INTERRUPT6 D6 j3 L; Q, }2 h+ Q2 h' V

( V$ B1 N5 u' h  CMOV P_SW2,#80H            ;访问X寄存器打开% J/ K' s/ j- }3 B4 c
; |. D+ G) n' F! [9 S
MOV DPTR,#MD1             ;
) q! ?6 I) x. A3 T0 E$ d8 t; t6 pMOV A, #01H               ;必须通过A才能送到. ^) \0 f$ ]0 L! C0 \8 g* l# R
MOVX @DPTR,A2 g+ X8 d1 q# M1 G7 I6 w

6 V, z1 i* ]3 [4 R, rMOV DPTR,#MD0             ;
( N" O% V; ~8 M* @# t6 U/ sMOV A, #07H               ;必须通过A才能送到# |  \6 D$ D( F4 b2 y6 A. k/ I
MOVX @DPTR,A
/ {, F0 ^$ ?% ^% I! r7 a. {4 u% b
+ F+ @8 J4 w+ ZMOV DPTR,#MD5             ;
. t8 d. C% h2 q1 tMOV A, #02H               ;必须通过A才能送到
( R! C4 ?- Q& j7 U2 t% i7 NMOVX @DPTR,A
7 T; T( G2 [+ h3 G6 M$ E* f9 Z% t* d8 H# b  n: |
MOV DPTR,#MD4             ;
: \, v. R) y6 }' B/ O; u, \MOV A, #08H               ;必须通过A才能送到
- ], h0 q5 Y1 O- Z* H  S) g  ZMOVX @DPTR,A
* e" e- E4 ?- B. U, h
/ F  l$ f5 q) |9 \( ^0 m3 I8 lMOV DPTR,#ARCON           ;1 b4 |7 u9 D' O( t' ~
MOV A, #10000000B         ;b7,b6,b5 4=16X16 5=16/16 $ o/ R- k* U$ Z1 e" r
MOVX @DPTR,A) \- n2 {) p- ^  _
* L5 J+ V. `+ a4 z4 V0 K; j
MOV DPTR,#OPCON           ;启动运算; [5 v: J2 J5 F
MOV A, #00000001B            
% I% C$ l6 Y5 jMOVX @DPTR,A
- Z0 t3 F5 v2 L& }5 f" l9 w5 L8 c
0 l, _5 h3 Z* t+ l5 Q( ]- S: h/ `WAIT:, }: y8 T1 `' [4 l) M+ x
MOVX A, @DPTR
1 ^! g0 |# r" _6 k& [0 g; v% DANL A, #00000001B
) v9 B4 R  @' d' [3 _, SJNZ  WAIT
( A5 L- G4 l! B* k
9 H% f4 y1 X4 r3 wMOV DPTR, #MD3            
! e3 c- e: ^' Y# _- G6 P) i$ kMOVX A, @DPTR
" H$ H$ ~& P( W1 s  \0 s# ]
- `: u. C  T; Y3 tLCALL SENTONEBYTE1
$ s6 H/ a7 f1 @8 I* s4 b" J; a/ [8 n% A
MOV DPTR,#MD2           
6 u6 v$ H8 h/ G6 G$ |) t' B/ ]! jMOVX A, @DPTR1 i9 ^: G8 E' v: r6 z- ]6 [4 N1 z
2 F( x  r( }! f. P
LCALL SENTONEBYTE1' D& L! e2 o9 y9 l& S  s
- M0 w# o( M" R7 t" T; \; K7 ^8 d* j
MOV DPTR, #MD1             . o, A. e0 V# o" `! Q
MOVX A, @DPTR8 E: |; V' M) X  h1 O

$ @: G, e0 ^' T) Y3 DLCALL SENTONEBYTE19 i, m& R. i! A/ k
. T  q; ^0 i" m3 ]; R. H
MOV DPTR,#MD0         
( ]! S$ Q7 z9 cMOVX A, @DPTR
% s) B" z3 R  i$ y9 ~& ^
4 ]% H" G+ o; I0 i& Q% I  T% `LCALL SENTONEBYTE1
: X; |/ I9 ^3 h1 q0 [4 L1 z- k1 T, _2 f5 p8 z* a' R' a7 l: U
MOV P_SW2,#00H            ;访问完毕要关闭
- J) W2 |- P' Z6 m! P+ d6 |5 y, J% H! M1 l) n3 p; r' H
LED:                      ;停机5 b( b  v" e& Q. H8 q
1 p! e0 J( ]: R- W
JMP LED6 U: C7 Y& u+ ^5 \2 `+ y8 D
; G- q) N% d1 M. V+ ~" z
NEXTBUFFER:
5 q/ i3 g2 ]) h/ e. iCJNE R0, #LASTBUFFER1, NEXTBUFFER2
8 m4 ]/ J1 B; U& t7 N1 V7 wMOV R0, #HEADBUFFER10 M8 {( u8 B) h
JMP NEXTBUFFEREXIT
+ |, u2 J" o3 _. LNEXTBUFFER2:& R2 H2 u7 ^8 W2 ~* t; @+ U5 v
INC R0  OINT TO NEXT BYTE
2 U" Q0 ^6 \! `NEXTBUFFEREXIT:
6 N9 Y* Y+ j9 R& V3 s  h8 iRET2 y. E3 h+ f/ O- y  I7 I& W- g

9 _+ I% J. f( p7 c+ Y, f3 DSENTONEBYTE1:                ;SENT OUT A
# i; g9 H3 p' p% V1 u& u/ z. CCHECKBUSY1:# w3 Q, b4 T8 d$ i
JB 40H, CHECKBUSY1
- W  Q; a1 q2 b) @; z- ~) fSETB 40H
# \4 M9 N* e6 }) w, B& FMOV SBUF, A. L& Z2 s5 x# K* \: D/ }, D6 f7 b
RET! ?! f( K( f5 F- d* a
5 T; a6 n7 C2 i  z3 J# ]* P# }
UART1:      ;RECEIVED DATA FROM AIR$ t5 W$ d6 {2 O3 M; b
PUSH ACC0 p" `' m; ^9 E, S0 M( [; l5 a
PUSH PSW
; M: s' V/ l( W& B0 g. u. ?JNB RI, UART1CHECKTI" B4 h) @4 B" z3 l# _
MOV A, SBUF ;READ THE CHARACTER FROM THE SERIAL PORT7 Q* T9 m* _" W* c
CLR RI      ;CLEAR RECEICED FLAG
" B5 F+ `8 S  B+ s! `: D+ iMOV @R1, A  ;SAVE TO BUFFER
* L6 N  w& `5 Q# P0 xCJNE R1, #LASTBUFFER1, NEXTREADBUFFER
( {1 s7 R) z4 ]# x! z6 {MOV R1, #HEADBUFFER1) _* I$ n4 M" u' f8 B/ [. C* T
JMP UART1EXIT
7 [! T; L5 I8 m( J8 d" INEXTREADBUFFER:2 [0 P& r5 D) f& ]( Z+ c- q
INC R1  OINT TO NEXT BUFFER7 j$ G# S/ N, f8 s
JMP UART1EXIT, C* t. `* ]1 O$ _& f
UART1CHECKTI:
2 c. z7 x1 z2 Y* q: X6 zCLR TI
2 a" }! ?% H/ S( X0 oCLR 40H      " Z' W* ~  I- y6 ?  `
UART1EXIT:) N" [: t5 u9 @" s1 t
POP PSW
; A( ^. f  n5 y( {) Q- o8 \POP ACC
5 d% A0 Z8 O/ V6 i7 YRETI
! N0 S$ H# b. A" b" W# K# T# s$ J: x& _) ^; C
INITIAL_UART1:           ;115200
1 [/ e( _5 L' ~+ |: H1 fMOV SCON, #01010000B     ;SET AS BAUD VERIABLE, NO ODD/EVEN CHECK
5 j+ X; y7 l; T/ Z! xMOV TH1, #253            ;247(11.0592, 38400BPS) FOR TIMER_1 251=115200(18.4320M 115200BPS) 253(11.0592M 115200BPS) IF PCON.7=0   
2 T4 W3 \, w' ^$ I+ V; X! YMOV TL1, #253+ y  w" p9 F  s. }! F: U; O
SETB PS                  ;SERIAL PORT PRORITY HIGH: J8 m* I# q, H. y" y
SETB TR1                 ;RUN TIMER_1
3 }$ O( D) W7 hSETB ES                  ;ENABLE UART1 INTERRUPT4 e, s& B, I8 B/ i: _% i# {" d( e
RET2 h; ?$ x4 C/ L% l

: Z# s6 L: S" ]. ?/ t/ k* w9 MIOSET:
' e3 R6 l/ Z: n9 Z' a;-----------I/O CONFIGUE
) ?8 B$ |. E  s/ N3 _* YMOV 93H, #00000000B      ;SET P0 0,0=I/0, 0,1=HIGH CURRENT OUTPUT, 1,0=HIGH IMPEDENY INPUT 1,1=OPEN COLLECTIVE OUTPUT" j8 R" q# d" b
MOV 94H, #00000000B      ;SET P0 (CONMAIN WITH 93H THIS IS SENCOND BIT)
$ x4 ~. G4 Y! G# BMOV 91H, #00000000B      ;SET P1: q- \; L9 O. w; K+ J  B: P
MOV 92H, #00000000B      ;SET P1
) a' l  g' o+ [MOV 95H, #00000000B      ;SET P2
  N. p8 ~  ~6 I1 @MOV 96H, #00000000B      ;SET P2. z) [; c* y' Z( i! }/ ?- ~
MOV 0B1H, #00000000B     ;SET P3
, Q8 T9 W1 F& j' @1 yMOV 0B2H, #00000000B     ;SET P3/ h+ Z+ Q0 T/ M; Y6 P2 I* H
MOV 0B3H, #00000000B     ;SET P4 * e6 {3 t5 g0 z
MOV 0B4H, #00000000B     ;SET P47 t, J" p- F& j- s. Y5 \" O# Q
MOV 0C9H, #00000000B     ;SET P5. T$ T& T2 ]/ \7 O: [7 z+ G5 P9 ~
MOV 0CAH, #00000000B     ;SET P5
9 E! E) k5 {4 u/ r) \) \% g# ];MOV 0CBH, #00000000B     ;SET P6/ p" y4 G  e* @/ I6 w
;MOV 0CCH, #00000000B     ;SET P6
: m* T: i, j( ?1 V;MOV 0E1H, #00000000B     ;SET P7
4 ^" D; u9 d  q9 z8 V* H1 c;MOV 0E2H, #00000000B     ;SET P7
8 r! i" W8 Q& T# NRET
& Y# o" |1 {* Q8 C" U- F) R/ l0 y& o' n0 U2 ]* Z, O' t- e
DELAY1:
, u% G8 d6 w* KLCALL DELAY2! R3 g) B# D7 y
LCALL DELAY2! E% B$ u7 G7 k! ?
SETB P1.0 ( K3 o! w/ f' F4 n( R
LCALL DELAY2
5 U5 ^: G$ Y( G2 dLCALL DELAY2- g. Y: @8 W; _9 G3 H/ Y& M5 E$ q
CLR P1.0" V9 ~% N1 d: l: E
RET
, H% }) F& n2 ^8 @4 F8 _/ ?0 v$ g
) M" {2 K0 P8 @/ i$ T, q$ j' |4 s6 IDELAY2:& d( l/ Z) }$ e% c8 D+ ]+ y7 f
MOV 35H, #255
/ F. a5 ~2 G. E/ g- T8 T& t' s2 ISLOWDOWN0:
8 s' i' J' c! s$ B5 E- i: `3 nMOV 34H, #170
9 h/ M. G* `3 [5 nSLOWDOWN:
* e1 G! G8 w+ `- tMOV 36H, #2
2 O* K5 z0 |# o. p* i7 ?: }& oSLOWDOWN2:, L8 e" @" G5 h2 N3 z+ z
DJNZ 36H, SLOWDOWN2 - v, j" g, x% J3 r  Z4 J% s
DJNZ 34H, SLOWDOWN 4 m+ u& O" I7 E& M- o) q% e  d
DJNZ 35H, SLOWDOWN0
+ B1 S! M& s) z( p/ G/ WRET
6 I; f/ D$ K" @  B5 C
$ K  @: t( `6 k& q! N6 ^* pEND
2 F8 ]$ V) d4 Z
9 }# T2 W- Y3 N6 `+ V7 w

该用户从未签到

2#
发表于 2022-6-9 10:05 | 只看该作者
(; P)是( j! V* N5 Y. g# q
啊啊啊,

该用户从未签到

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

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-9-7 22:56 , Processed in 0.125000 second(s), 23 queries , Gzip On.

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

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

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