找回密码
 注册
关于网站域名变更的通知
查看: 325|回复: 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,答案正确吧?) R  j) W3 S3 F7 j* }) m$ N

. M2 Z2 K. E& w8 x/ C;C语言:4 p$ z" i: q  ]8 a
/ r: w! ?& b8 U7 m. e+ H
;============================================
/ }. L: i5 ]6 r0 S* B;16位乘以16位乘法:被乘数:{MD1,MD0} 乘数:{MD5,MD4} 积:{MD3,MD2,MD1,MD0} 9 P% q- B4 z3 ^2 q3 k' w8 y

. g( _0 a6 u3 D, X* d6 e* A2 {7 P;define MD3 (*(unsigned char volatile xdata *)0xfcf0)
- b! R$ n5 w: S; K;#define MD2 (*(unsigned char volatile xdata *)0xfcf1) / d1 d/ a* Y  g! Y/ w& U+ U5 U
;#define MD1 (*(unsigned char volatile xdata *)0xfcf2) / X( X7 @2 Z* r3 j
;#define MD0 (*(unsigned char volatile xdata *)0xfcf3)
, X2 Q9 a5 o) i  g/ M2 V( `;#define MD5 (*(unsigned char volatile xdata *)0xfcf4) " v2 q5 Z% v) K/ q' Z. ?" e' f1 c
;#define MD4 (*(unsigned char volatile xdata *)0xfcf5) ; h* {+ i' v3 u9 E5 z2 c
;#define ARCON (*(unsigned      char volatile xdata *)0xfcf6) * _6 j3 K& r- {) U' |: K
;#define OPCON (*(unsigned      char volatile xdata *)0xfcf7)2 d9 |9 c0 h* u- c2 T& M; Y
;sfr              P_SW2                =              0xBA;            
% J8 l) K) ]8 @* P; n0 X. N# J;////////////////////////////////////////////////////////////////////////////////
! Y- u% I( e/ {' ^;//16位乘16位//////////////////////////////////////////////////////////////////////////////
! Y6 H8 q4 Y: r9 @0 {' d;// unsigned long res; unsigned int dat1, dat2; 8 Z/ {; i% Q2 F7 q+ T& y, H/ q; j
_SW2 |= 0x80;     //访问扩展寄存器xsfr6 w" }" `# z+ h6 J5 O
;MD1U16 = dat1;     //dat1用户给定MD5U16 = dat2; //dat2用户给定7 p  \3 w! \% D- A# G) _( H4 v
;ARCON = 4 << 5;    //16位*16位,乘法模式
+ X7 R( F4 N. l5 M;OPCON = 1;         //启动计算
! `, v% G9 P7 z% {;while((OPCON & 1) != 0); //等待计算完成
$ v% \3 h: r7 G;res = MD3U32; //32位结
- K' d* }8 u; Y' p; |4 H4 M$ K: n( Z0 ^$ e: i) i
;汇编:
7 s* ^6 d# U5 t  y) LHEADBUFFER1 EQU 0A0H
1 V$ I, C% r' r) V3 C" v9 ZLASTBUFFER1 EQU 0FFH   ;第一组缓冲区
- V! Q1 W/ i$ M; u) d. UAUXR EQU 8EH
0 B/ |5 w' E9 t) lAUXR2 EQU 0A2H: v1 J4 |" E5 y8 ~( K+ e$ ~4 M
WAKE_CLKO EQU 08FH   ( X$ U4 ^; r( ?5 A4 B; h- y

- I+ t* a# c. d2 A' |# h# [: }MD0 EQU 0FCF3H
* \( `) |! e4 h- SMD1 EQU 0FCF2H
) d6 F8 I9 o  _( g" wMD2 EQU 0FCF1H. g! S5 }/ k+ e* m5 u6 A
MD3 EQU 0FCF0H3 H: q/ J1 {2 o7 m, H9 T
MD4 EQU 0FCF5H
  m! o3 D6 q, x1 @. CMD5 EQU 0FCF4H" `+ [: s# y8 N5 v/ v
ARCON EQU 0FCF6H9 c& K3 g# R" V2 h8 u
OPCON EQU 0FCF7H
8 n$ T, f, u; A: _& D4 H8 aP_SW2 EQU 0BAH            ;当需要访问 XFR 时,必须先将 EAXFR 置 1,才能对 XFR 进行正常的读写
$ P$ M( p" w6 x) i- K9 N+ P1 a6 Z+ d
7 d; |( D- N% `/ o* B) }ORG 0000H
4 ^6 M7 e+ i. i: m) i( ?LJMP MAIN( o+ X1 o6 V. q$ e
ORG 0023H. C: a5 B, h! o" I8 Y: B0 H+ {
LJMP UART1    ;UART1 RECEIVED INTERRUPT! b; G4 r! h# h( _3 j' C
ORG 0100H
5 k1 S# o# Z$ ~' P8 ]/ s3 p! x3 n- r- ]0 K/ x7 I+ Q3 S2 b
MAIN:7 S. S7 l# o+ ~2 e9 ^1 X$ @
LCALL DELAY1  ;用STC-ISP的串口助手,必须给点时间切换,否则上载后来不及接收结果(00 02 16 38)接收口波特率为115200 晶振:11.0592 STC8G2K32S4
6 u3 f( N& m9 m2 H; DLCALL DELAY1
4 c6 C' @, X( R/ }5 ?LCALL DELAY19 _! l$ M' t7 {2 J# m- J; Q
: r& g8 {+ [7 X' V
LCALL IOSET
* v: b, Y; l0 q2 ]' f- @5 z
- l4 t4 u6 m! b4 z  ]CLR P1.0
- f- R3 O) x+ o
3 j2 l! w* z* t. J$ m% v- H" n7 c0 dMOV WAKE_CLKO,#00000001B     ;ENABLE BRT(=4),T1(=2) T0(=1) HAVE CLOCK OUTPUT BRT@P1.0 T1@P3.5 T0@P3.4* a. z, D/ c0 v4 r/ d% [6 `4 c
MOV AUXR,#11111100B          ;T0X12,T1X12,UART_M0X6,BRTRUN,S2SMOD,BRTX12,EXTRAM,S1BRS
% |3 j( B1 X  g2 a9 T; a9 fMOV AUXR2, #00000000B        ;#00010000B=SHIFT UART2' o+ ]( H- ^% j9 X  P
MOV TMOD, #00100010B         ;TIMER0, TIMER1 AS MOD2(8 BYTE AUTO RELOAD TIMER)
% z5 Y' M. t* L% s+ N' X' Y                             ;GATE, C/T,M1,M0(T1) GATE, C/T,M1,MO(T0)
4 x6 y6 D4 Z0 bMOV 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)
3 f4 h% g- \5 d6 E9 a; p2 K! Z5 k7 T4 w! s3 O" [/ {  {3 @+ S
LCALL INITIAL_UART1        ;USE T1 AS SERIAL BAUD GENERATE FOR UART1 5 `; v! q5 A% u$ ~7 I
CLR RI+ C& y  ~* e! O3 L3 ^* b
CLR TI* e& i/ e+ ?& B# U" W
SETB  EA                  ;ENABLE ALL INTERRUPT3 p7 [0 m' e! i
( ]# f) h- N  ^  f; w2 a
MOV P_SW2,#80H            ;访问X寄存器打开
  m" ]2 }8 C, t" E- i# y& `5 }( ]7 @; n+ N) e- ^
MOV DPTR,#MD1             ;
5 e8 ~7 Q- Q0 q# M! {MOV A, #01H               ;必须通过A才能送到
4 A8 V; L3 M. W3 c  AMOVX @DPTR,A
9 Q; V  _& O4 x) Q8 z
% `/ H6 ~# b: Z. x4 g2 l0 V: e& nMOV DPTR,#MD0             ;
6 \* X9 _/ b( l- I( WMOV A, #07H               ;必须通过A才能送到
2 O2 Y( [1 i5 e2 z) I3 d# BMOVX @DPTR,A: R- Y# W9 K) S2 D
. B* C2 _3 {9 Y9 d$ O
MOV DPTR,#MD5             ;
$ d3 ?5 f4 K9 O5 vMOV A, #02H               ;必须通过A才能送到
1 N$ f9 L' o, r$ P: W1 U4 k4 ]$ ?MOVX @DPTR,A
% [( L" `  |# K
/ t: e) B. x: m% e8 G/ IMOV DPTR,#MD4             ;0 c9 n5 ~; t# X7 O8 ]0 d1 r
MOV A, #08H               ;必须通过A才能送到
3 K& ?$ ~& l6 b8 r: ?, T6 FMOVX @DPTR,A
7 p  B6 P8 q3 [" g; n$ ~: `/ @% c  V2 V7 c. V1 l5 l. S$ Q4 ?* z
MOV DPTR,#ARCON           ;& H/ b* x3 S% ~
MOV A, #10000000B         ;b7,b6,b5 4=16X16 5=16/16 : ]1 W4 Z% G  e' d: _& k$ i  Q5 I
MOVX @DPTR,A
( V' L2 q% H7 K- r; V
# X) ~) T* `' {+ D3 R0 MMOV DPTR,#OPCON           ;启动运算
) @  c" }) T: \MOV A, #00000001B             0 X& G2 m0 v5 h5 S
MOVX @DPTR,A
* G% q5 o; X! R8 v5 T7 R4 a/ {# J3 n' M! s
WAIT:
, {" y9 S" q- b% YMOVX A, @DPTR* J- }3 S) f& ^- x
ANL A, #00000001B
% q% h5 a, p9 t8 CJNZ  WAIT9 n+ a8 p2 ^0 I

  S& ^% E, ]- Z5 ?2 U% U9 TMOV DPTR, #MD3             5 q+ H' Q/ M3 i/ ]+ K
MOVX A, @DPTR
2 M, \  Q/ d, i) L2 f1 z
- E5 F% a4 D2 d5 mLCALL SENTONEBYTE1, ?5 H+ v; |+ b4 T) j" |" W3 R

9 {; W/ A& E  ?8 b4 @# i% {2 CMOV DPTR,#MD2           
8 J5 ]2 [0 \3 _' ?( J+ }; |MOVX A, @DPTR
7 _7 b/ X+ X: e! i5 J) [6 R. m" |- M1 O
LCALL SENTONEBYTE1
/ S" r$ y1 G# i! P8 a# `: n' m: A6 D% D
MOV DPTR, #MD1             % D# e; s5 |! Q+ b% O9 H& Q
MOVX A, @DPTR. o, M, b4 ]) ~/ ^$ y- F' q
# {, _7 G  a& p4 D/ V/ ]( p. [
LCALL SENTONEBYTE17 ?* c+ L7 N3 F7 I  h* s

) R3 g* s/ V/ W  {+ ~: }MOV DPTR,#MD0          ( ~; T9 S* ?2 ]0 C
MOVX A, @DPTR
8 {7 }0 c$ g( Z0 O: e5 \/ I; h% F5 ?: p. V
LCALL SENTONEBYTE1& Y& O* X8 j: ]4 M4 g# p

6 a$ _/ V5 C5 A/ c  DMOV P_SW2,#00H            ;访问完毕要关闭
. X* _4 H) t0 T  N5 l5 i0 b+ ]+ _) _4 ?4 J0 M
LED:                      ;停机3 e5 N4 J; ]3 r4 z' s5 X  _5 t
. k8 B# E' D! p  l
JMP LED' f' Q% _- X) U4 O/ ^& j# Y

7 F) p7 c+ f" Z& j- h: yNEXTBUFFER:: n# x4 E$ [$ t% n1 F6 q
CJNE R0, #LASTBUFFER1, NEXTBUFFER2
: `3 l/ E$ w# x9 F( T: p! TMOV R0, #HEADBUFFER1  m5 b/ d9 @3 x5 n
JMP NEXTBUFFEREXIT
$ a% d7 k" e, i' mNEXTBUFFER2:
0 R6 n' y+ x, P2 @- l( L3 lINC R0  OINT TO NEXT BYTE
7 @) {5 T  [- _* t2 h5 ~/ iNEXTBUFFEREXIT:
$ T0 z: |: \% }3 v* Z/ zRET
* I$ L* S5 O2 V/ X3 V  `- ], g4 y! k& G) @3 b# P' r" W$ e
SENTONEBYTE1:                ;SENT OUT A
7 c" S5 O, J: u9 {. o1 t5 x8 c% V: PCHECKBUSY1:* e( D, x* v8 l
JB 40H, CHECKBUSY1  C# r' T. e. O9 b- r+ H( \
SETB 40H
* S0 H6 q3 I3 x4 a0 P# T  N2 ^MOV SBUF, A% D9 l$ e5 Y$ m9 L9 J( g
RET" s: A0 k) I9 f* c- ~- h% P$ l6 R
( I; s+ s" r# K0 V
UART1:      ;RECEIVED DATA FROM AIR
+ j; b' J, k5 ?& Z$ y6 G! ^PUSH ACC) V5 S2 Q8 e4 s$ @
PUSH PSW4 O7 B, z- u" ?! s, l9 U" @  S; g
JNB RI, UART1CHECKTI
6 }* o$ b7 s* l& m4 f. xMOV A, SBUF ;READ THE CHARACTER FROM THE SERIAL PORT* b8 V$ J2 m6 Q
CLR RI      ;CLEAR RECEICED FLAG7 }. N8 d) m" V# N3 J* G2 P' A% |
MOV @R1, A  ;SAVE TO BUFFER
4 ]: E8 p, z. s) a7 DCJNE R1, #LASTBUFFER1, NEXTREADBUFFER
3 b* T4 A' W4 z: FMOV R1, #HEADBUFFER1$ H# u) {5 l7 ?2 V& `, N; t6 B- K
JMP UART1EXIT
$ m! Q! A5 Z2 ~4 y' V9 z* tNEXTREADBUFFER:. T( W2 m. V4 K+ u* \, u7 l
INC R1  OINT TO NEXT BUFFER& F- t# Q7 [) ^7 d0 J
JMP UART1EXIT  Y" F4 t( `* j! S
UART1CHECKTI:
" t5 ]& w! s0 Y- A8 Q& ~0 g: KCLR TI: G) O8 E7 @3 X3 K( h9 V
CLR 40H      
" E! ?, I# z6 o& FUART1EXIT:
' U1 t  ^( l3 {( k  rPOP PSW1 Y, A( S. \2 |$ f) H
POP ACC
& J- ?2 _5 R0 |RETI
" x2 z, U) a( |. y3 A
" D6 B% K$ N7 H% SINITIAL_UART1:           ;115200
- r! N% c1 S8 O. b$ H6 XMOV SCON, #01010000B     ;SET AS BAUD VERIABLE, NO ODD/EVEN CHECK+ k- D3 i, ~4 D7 A  J3 |, j- F% G1 Y
MOV TH1, #253            ;247(11.0592, 38400BPS) FOR TIMER_1 251=115200(18.4320M 115200BPS) 253(11.0592M 115200BPS) IF PCON.7=0    & ~- Z0 d8 q+ ~5 C$ B) d
MOV TL1, #253
0 R7 h- t* O5 x' w8 E" oSETB PS                  ;SERIAL PORT PRORITY HIGH  a/ M9 K3 e- v8 r* X8 S
SETB TR1                 ;RUN TIMER_1  m5 u5 E, Y2 e, s
SETB ES                  ;ENABLE UART1 INTERRUPT
7 _# g4 V1 d. f" F; {4 |RET
$ Z5 a4 |; t+ j0 X6 j, G' [7 ^
0 x. x7 v/ G$ y. z% V$ `IOSET:5 I5 y6 |+ V% W
;-----------I/O CONFIGUE
7 a+ ~1 j2 X) A4 X/ G/ OMOV 93H, #00000000B      ;SET P0 0,0=I/0, 0,1=HIGH CURRENT OUTPUT, 1,0=HIGH IMPEDENY INPUT 1,1=OPEN COLLECTIVE OUTPUT
9 _6 _3 L! g9 o' j- X- Q) EMOV 94H, #00000000B      ;SET P0 (CONMAIN WITH 93H THIS IS SENCOND BIT)! V+ l6 h5 V* j
MOV 91H, #00000000B      ;SET P1
2 A4 U4 j7 L, X( [MOV 92H, #00000000B      ;SET P1$ w! C! S- A" }9 ?: L( O( T6 d
MOV 95H, #00000000B      ;SET P2" {3 Y: o0 h4 ]2 g9 X1 D
MOV 96H, #00000000B      ;SET P2
3 L. p6 {+ e, W7 `* n  V: ^MOV 0B1H, #00000000B     ;SET P3 7 d% D( o  ^/ ~" \% v3 }$ c* T
MOV 0B2H, #00000000B     ;SET P3( e: a* S0 w, n5 Y3 N* h
MOV 0B3H, #00000000B     ;SET P4
0 G& ]) k/ X/ `# A+ f0 {, zMOV 0B4H, #00000000B     ;SET P4
2 Q3 n+ X0 j* N. v3 kMOV 0C9H, #00000000B     ;SET P5
' V; N( g* v1 K1 ~MOV 0CAH, #00000000B     ;SET P5
% T9 k; m  }( X9 v+ D;MOV 0CBH, #00000000B     ;SET P6
2 F' E* \! L6 A: d% W, D( [;MOV 0CCH, #00000000B     ;SET P6
% H4 _/ |) M# s5 k5 |;MOV 0E1H, #00000000B     ;SET P7
* E* C/ g& X/ i  z;MOV 0E2H, #00000000B     ;SET P7& g) e6 w/ X% R2 S6 }. j  b# }
RET9 f) z! n; p: g. ?6 v- O; e0 F  t
  l% g5 k0 N" e" D$ c3 }9 }
DELAY1:
6 a3 Y: [8 l  `1 T% _; I8 z( ?3 HLCALL DELAY2
8 M- U- S$ ^: v8 \0 \LCALL DELAY2
; ?, G/ c" ?/ M0 `/ A! xSETB P1.0 ; m9 ?* T2 v6 S' X; Y$ X9 ]
LCALL DELAY25 S6 e, E; v  |5 j
LCALL DELAY2: @9 k3 g# Q( h0 J, R5 @( B
CLR P1.0
# L; y  U* X3 f0 q) y0 h* Z! IRET+ s2 g; x( C& t
2 q9 E& K. r$ M2 n- v  f
DELAY2:5 @/ P" D. v' i9 m
MOV 35H, #255* E" M) _  {3 D7 b2 J, j' N
SLOWDOWN0:3 f& [' F% O; q7 Z/ p6 B
MOV 34H, #170
+ Y, K3 K. K. mSLOWDOWN:  J0 ^+ B0 ?2 i
MOV 36H, #2
, g' w9 D, ~: h% jSLOWDOWN2:# \! ?4 c" O/ N- j' P2 {" ?
DJNZ 36H, SLOWDOWN2 " e) [6 k4 F6 l6 i3 w& [
DJNZ 34H, SLOWDOWN
  q& d! u6 q1 y7 N+ M: |( h, {DJNZ 35H, SLOWDOWN0- J2 T9 a( @3 W! I( a! k
RET
. [- n" K9 ^1 M  l+ u8 E
$ z" d8 U- M/ o0 v- S5 zEND
9 S7 v2 E) e1 C' D. M, w
0 U. A% ?, H$ ?& a$ O; ^

该用户从未签到

2#
发表于 2022-6-9 10:05 | 只看该作者
(; P)是
& x' c' m' T: N( A& Y" B& J6 v- P啊啊啊,

该用户从未签到

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

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-11-4 11:10 , Processed in 0.156250 second(s), 24 queries , Gzip On.

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

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

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