找回密码
 注册
关于网站域名变更的通知
查看: 309|回复: 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,答案正确吧?$ v( b5 k- l! `6 I

7 \5 u3 H$ c7 E$ S9 M" |  K;C语言:& }9 q2 f9 y% Z' R% f. Q

/ s% C- u: W) F# D4 p( R/ U;============================================4 h- |0 J- W" [
;16位乘以16位乘法:被乘数:{MD1,MD0} 乘数:{MD5,MD4} 积:{MD3,MD2,MD1,MD0}
& T5 M- S7 W# B5 h! p
+ W) \, O$ I/ @;define MD3 (*(unsigned char volatile xdata *)0xfcf0)
6 m* L! _- {: P# h8 J;#define MD2 (*(unsigned char volatile xdata *)0xfcf1) , M2 F) Z8 a8 M/ M: O" C
;#define MD1 (*(unsigned char volatile xdata *)0xfcf2)
+ q7 r. c# |  V) q8 I( |% h' v/ w;#define MD0 (*(unsigned char volatile xdata *)0xfcf3) - ~, X1 W8 B9 s) @
;#define MD5 (*(unsigned char volatile xdata *)0xfcf4)
; L8 Q7 B$ a6 d. s% \; K;#define MD4 (*(unsigned char volatile xdata *)0xfcf5)
" g/ ]* a! H: I5 D;#define ARCON (*(unsigned      char volatile xdata *)0xfcf6)
9 v0 [. h% X4 T3 W% e+ ?* u;#define OPCON (*(unsigned      char volatile xdata *)0xfcf7)* @. |1 R* J) c# a# I
;sfr              P_SW2                =              0xBA;            
8 o, r6 M, h( Q8 @. y;//////////////////////////////////////////////////////////////////////////////// : J, s1 _/ Y- ^+ z
;//16位乘16位//////////////////////////////////////////////////////////////////////////////
9 Y" q( |& ^; [6 G2 ?  H/ M;// unsigned long res; unsigned int dat1, dat2;
! o' u2 I1 i0 I6 U6 N0 k_SW2 |= 0x80;     //访问扩展寄存器xsfr
8 q; n- \7 e& R# s% U5 v" j;MD1U16 = dat1;     //dat1用户给定MD5U16 = dat2; //dat2用户给定
: q1 [9 @# ~( C' x;ARCON = 4 << 5;    //16位*16位,乘法模式
$ ]3 x& u" A9 A3 U) e6 E# I;OPCON = 1;         //启动计算/ ], N, U5 o& I( m8 G4 Q3 G
;while((OPCON & 1) != 0); //等待计算完成
: @* V, j6 b/ F! b' v) T;res = MD3U32; //32位结' L" l8 t8 M; i# B+ _7 N2 ]( Q- z

- m( R, ~0 x: [% {: g/ u$ t8 a1 D2 n;汇编:1 ~5 ~. |- [5 f1 I8 f' K4 `% U
HEADBUFFER1 EQU 0A0H! G# J# u( B8 E$ o# i
LASTBUFFER1 EQU 0FFH   ;第一组缓冲区# s+ U' i7 \5 |$ H5 A1 ?
AUXR EQU 8EH
7 Y% n0 z2 @3 @/ \, PAUXR2 EQU 0A2H( _5 `* _4 x, }+ U: {/ p* Y  D  o
WAKE_CLKO EQU 08FH   
3 ?. U8 N( q; R0 ]
' |: n, c, B, j, G: v& LMD0 EQU 0FCF3H; c$ u- a( n: O- k. v
MD1 EQU 0FCF2H' d4 O8 z3 U- P5 u! s
MD2 EQU 0FCF1H& e; S+ z6 z, m" o
MD3 EQU 0FCF0H5 J( |4 d6 i7 J; ]
MD4 EQU 0FCF5H4 D: k7 c* j; }) o" [% a- Y
MD5 EQU 0FCF4H
  R7 K% E2 @- i9 zARCON EQU 0FCF6H
5 }3 t3 {4 M) Y7 f4 V9 ^OPCON EQU 0FCF7H
  G2 {1 g% p1 w( H3 C& }P_SW2 EQU 0BAH            ;当需要访问 XFR 时,必须先将 EAXFR 置 1,才能对 XFR 进行正常的读写
5 h2 c) x) r  y# w& P0 E2 B3 B  n
ORG 0000H) l" t; k1 ?7 v7 M6 g6 U$ z/ b
LJMP MAIN
3 f! c/ e/ j( C; H% E8 BORG 0023H
9 \8 `# c, _, c+ E. cLJMP UART1    ;UART1 RECEIVED INTERRUPT( ~- H; B# M& a3 n/ J: L: I% l0 U
ORG 0100H
. F2 N9 v* p  q7 j
  w, d! _% G+ p& ^MAIN:6 W. u4 H& e3 \& K8 M; J! l& a
LCALL DELAY1  ;用STC-ISP的串口助手,必须给点时间切换,否则上载后来不及接收结果(00 02 16 38)接收口波特率为115200 晶振:11.0592 STC8G2K32S4# C. T  i( q; N) e- K0 J% [
LCALL DELAY1
% g% r* m8 x# O" @, L6 F% gLCALL DELAY1
& \- N  S/ d/ `8 @$ I: w
. \4 o) J, F; o0 wLCALL IOSET
: l( Q" p& n0 F; a- ^" Q6 H' R$ m
CLR P1.0* q& A1 |5 x: |$ g$ \# j+ z
0 W6 T7 v1 I% j+ [$ |3 W0 L
MOV WAKE_CLKO,#00000001B     ;ENABLE BRT(=4),T1(=2) T0(=1) HAVE CLOCK OUTPUT BRT@P1.0 T1@P3.5 T0@P3.4
6 {! J6 ^0 z1 t: ^& WMOV AUXR,#11111100B          ;T0X12,T1X12,UART_M0X6,BRTRUN,S2SMOD,BRTX12,EXTRAM,S1BRS
5 }; v: ~6 C, l! T3 l8 \MOV AUXR2, #00000000B        ;#00010000B=SHIFT UART25 c& D" A9 u! m- W. L
MOV TMOD, #00100010B         ;TIMER0, TIMER1 AS MOD2(8 BYTE AUTO RELOAD TIMER)$ }; Q) B4 l7 x
                             ;GATE, C/T,M1,M0(T1) GATE, C/T,M1,MO(T0) : b2 l: y( ]$ ^; t
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)
+ [+ |; ]7 V( F
+ s0 A& y$ K$ m3 wLCALL INITIAL_UART1        ;USE T1 AS SERIAL BAUD GENERATE FOR UART1 * F3 g. Y) i4 W2 M4 U  c, d
CLR RI# L+ @, _6 j/ |* Y7 s2 E* I6 \
CLR TI. D. _" W5 A( ^1 z/ q1 J
SETB  EA                  ;ENABLE ALL INTERRUPT  \: a/ G* w' t9 z: m" _' r2 x" u
- d3 t: o7 r3 |5 i* T; H  F3 j, c' H' g
MOV P_SW2,#80H            ;访问X寄存器打开
! k7 x/ j. y5 \2 D2 K4 A" A, {! t/ [! |, Q2 W: H
MOV DPTR,#MD1             ;
8 i& y& x3 S3 HMOV A, #01H               ;必须通过A才能送到% R2 e& M% R; ]/ u' C# G
MOVX @DPTR,A
8 J- r2 C% U2 s# c& w
$ R+ q) X' n6 L. s& m& k7 ZMOV DPTR,#MD0             ;
% b& T( z( J+ fMOV A, #07H               ;必须通过A才能送到- Z; X7 I" I  Y
MOVX @DPTR,A. c5 k0 J0 V* S! i# w

9 `, b& k% C. e6 B2 I% o! nMOV DPTR,#MD5             ;
9 o  d* Q6 X8 ?MOV A, #02H               ;必须通过A才能送到# P1 I* t4 M' h" o: D+ T
MOVX @DPTR,A
' }+ n; J. j7 M) O* _9 \
; s7 ~  s! c7 I& ZMOV DPTR,#MD4             ;  r" q/ T4 q+ e3 @- ?1 E2 J/ [) ?
MOV A, #08H               ;必须通过A才能送到
; g* w, }) a+ x' \8 F) P) _: s$ KMOVX @DPTR,A
) \9 j$ c7 ~7 n$ z
( U* W! W0 `# u' C3 L6 T5 Q0 q0 tMOV DPTR,#ARCON           ;: y% [* f5 q9 u0 T) B' \7 ?. Z" \
MOV A, #10000000B         ;b7,b6,b5 4=16X16 5=16/16 - ~1 Q7 q$ P1 R/ Z) s
MOVX @DPTR,A+ t, C% g! v! X- s1 G  f

* j' B+ z, L. W( K0 ~: [MOV DPTR,#OPCON           ;启动运算$ r/ C  m' H3 J8 K, D
MOV A, #00000001B             + o8 t/ C9 |+ m  w% t
MOVX @DPTR,A3 t% i; ?4 W* w2 L2 e

2 s# f) s; ?: _# y' w  g$ H6 y+ v5 qWAIT:6 `) l' V$ i( N( ~$ M2 Z
MOVX A, @DPTR% _3 Y& P! C" h) f* T- b0 R: N
ANL A, #00000001B
& Q6 ~3 d& ]: p$ j" f. DJNZ  WAIT8 ?) W/ e& q8 Z

- V! Q- _- y* Y# bMOV DPTR, #MD3             8 X6 @6 d. d8 x& ]$ o
MOVX A, @DPTR
' C# h9 Q0 m: @7 O; V3 P6 c0 Y4 @
LCALL SENTONEBYTE1
5 k# ?2 n( K+ `( H+ W4 y0 |% c( Y" p
MOV DPTR,#MD2           
7 K- Q0 q! r5 @4 h% W7 _" n4 q0 O2 p$ _MOVX A, @DPTR
$ D; ^- n' ^! u0 E2 B7 L! Y
" ^% P; ?+ ]9 T9 L2 c' _5 @LCALL SENTONEBYTE18 J$ d& H# t. Q2 j9 W5 t

1 Y) i6 W( w% Y+ R) EMOV DPTR, #MD1            
) \2 l3 y  c! v: O3 cMOVX A, @DPTR- t6 ]$ Q) z. i4 x% u) q2 t

2 R! f% }- Y4 B. ^( eLCALL SENTONEBYTE1
. g- t1 U9 L* o  R: k: |# n8 i( [" w( x6 c! m2 \) [
MOV DPTR,#MD0         
1 X+ O9 i5 _9 \' ^MOVX A, @DPTR
- E+ m$ ^( o% e; d! r# T$ B% W2 M
LCALL SENTONEBYTE11 A! h7 b2 X1 F

9 `1 f9 s1 p+ y# J/ r7 q% Q+ zMOV P_SW2,#00H            ;访问完毕要关闭8 ^6 Q; Q- L5 @; Y, g; R

6 a" d* J5 ?1 A" QLED:                      ;停机0 q4 l1 u$ S& J# J% m6 U! V

8 w* c  W) x- MJMP LED
$ b5 J) }/ s# I. ?
, \: L4 w" K8 O+ |$ s5 ?  i" S' N6 kNEXTBUFFER:
, }* W" [( ?& o& c  A8 f1 ~7 ]" `9 u% cCJNE R0, #LASTBUFFER1, NEXTBUFFER2, O# F$ a' C$ i6 }
MOV R0, #HEADBUFFER1
% s$ x/ X0 Z% j: ]. b7 \7 TJMP NEXTBUFFEREXIT" M( }) d9 b, F/ k# S
NEXTBUFFER2:
/ H) _& [+ u$ l+ h% ?INC R0  OINT TO NEXT BYTE
. W! o) u3 i9 zNEXTBUFFEREXIT:: w8 H/ H; O0 w# ~  S
RET
& ]2 l2 c2 a2 Z5 @# B( E: e7 _5 [
SENTONEBYTE1:                ;SENT OUT A
/ r: r$ {  X/ G3 Q2 Y' U! xCHECKBUSY1:) w: o- W+ i* U: E! P! Q) `
JB 40H, CHECKBUSY1( ^, x* m0 l6 ~0 t6 G. e
SETB 40H
& B# a/ w9 V8 n$ U6 G3 D" yMOV SBUF, A
* f0 T2 M1 Y/ K) k2 ~RET
- {5 c. c- _$ S+ a
7 p( M5 k# Y. Z; m% MUART1:      ;RECEIVED DATA FROM AIR1 R1 Q! a6 c6 J
PUSH ACC* a/ D: y2 s, i
PUSH PSW
9 K# w8 i4 F5 y# bJNB RI, UART1CHECKTI
# x+ ?( p4 z% R- OMOV A, SBUF ;READ THE CHARACTER FROM THE SERIAL PORT
/ H$ c2 ]* }# B) P, iCLR RI      ;CLEAR RECEICED FLAG
1 W: [  I4 h/ _( V% R6 M) kMOV @R1, A  ;SAVE TO BUFFER
- a# t( {5 N' a4 U3 dCJNE R1, #LASTBUFFER1, NEXTREADBUFFER7 T4 H* l% w0 f
MOV R1, #HEADBUFFER1( Z- b( E7 X+ M$ {- L2 \) c
JMP UART1EXIT9 i+ J9 }' U2 Z9 x+ ^+ z0 Y
NEXTREADBUFFER:
5 Q. t2 {& L5 h7 iINC R1  OINT TO NEXT BUFFER, v- M2 {4 f- c7 s- E) o( Y, H
JMP UART1EXIT% b4 {$ M7 Y/ w1 M2 |7 @3 f4 E
UART1CHECKTI:
) d$ G/ ]2 K3 _0 Q/ f& y0 p' RCLR TI
" z) d- _4 d0 ]CLR 40H      : {  c$ j3 q: t% a+ }
UART1EXIT:2 N9 A3 x* ?0 M
POP PSW' w0 a8 T, X* B2 W4 C6 j  j
POP ACC
6 Z4 T4 j# d( {/ O! [RETI. T8 B3 D; U/ Y7 Q
* o6 E  m) O5 R9 B5 A+ d/ n
INITIAL_UART1:           ;115200% c+ `' r9 }( }8 u3 B  D5 D( T+ i, S, E% h
MOV SCON, #01010000B     ;SET AS BAUD VERIABLE, NO ODD/EVEN CHECK: r7 J% b2 ~6 x# k
MOV TH1, #253            ;247(11.0592, 38400BPS) FOR TIMER_1 251=115200(18.4320M 115200BPS) 253(11.0592M 115200BPS) IF PCON.7=0   
# x( B, \( M7 h) K$ v' b9 BMOV TL1, #253
, S9 h( h! c* ~SETB PS                  ;SERIAL PORT PRORITY HIGH% C! V4 E: ^* m1 ?" Y5 k+ i
SETB TR1                 ;RUN TIMER_1
. \: ^9 Y. X4 ESETB ES                  ;ENABLE UART1 INTERRUPT. s$ [3 t" h/ I: e( H& {! Z
RET: m+ E% E9 h2 d/ @' m
! d5 v& z. H) X7 B
IOSET:+ u# s& C& E9 R9 [% `1 S! A
;-----------I/O CONFIGUE2 ?7 p3 S$ {) w" q4 b
MOV 93H, #00000000B      ;SET P0 0,0=I/0, 0,1=HIGH CURRENT OUTPUT, 1,0=HIGH IMPEDENY INPUT 1,1=OPEN COLLECTIVE OUTPUT
" O" q# r+ r5 i- N% O( ^8 kMOV 94H, #00000000B      ;SET P0 (CONMAIN WITH 93H THIS IS SENCOND BIT)
! X4 M" Q, I: s6 s2 ^1 k! {MOV 91H, #00000000B      ;SET P1
( B1 g* @2 u2 y8 F: {) _MOV 92H, #00000000B      ;SET P11 Y) ?* f" q# \4 w# H
MOV 95H, #00000000B      ;SET P2: ]+ K1 p+ E* ?+ B& V; ]! C0 q: q; J
MOV 96H, #00000000B      ;SET P2
; b6 O5 |: W+ E' ^0 B7 R% gMOV 0B1H, #00000000B     ;SET P3
4 D. q8 E* p6 XMOV 0B2H, #00000000B     ;SET P3- i/ k: `, a$ A' x0 u! @9 Q
MOV 0B3H, #00000000B     ;SET P4 7 n% R, _& K* ^3 l% h& ^# Y
MOV 0B4H, #00000000B     ;SET P4
. R# A& h3 S  S1 x& w& yMOV 0C9H, #00000000B     ;SET P50 b. }3 d$ U$ @5 L3 M
MOV 0CAH, #00000000B     ;SET P5- j6 R) E) D8 C! q+ w
;MOV 0CBH, #00000000B     ;SET P6
3 i! S5 `  d. u6 l;MOV 0CCH, #00000000B     ;SET P6% E) r8 Z: N" X9 \
;MOV 0E1H, #00000000B     ;SET P70 h4 m+ r: X* ~5 d
;MOV 0E2H, #00000000B     ;SET P7. r" M/ k) w; i8 J3 N
RET8 P* x6 Z; F  Q2 F

5 X9 y2 P3 H. G* i- t# F" \DELAY1:
, Z  C( R% F( t1 C9 E/ x7 s) yLCALL DELAY2
9 Y* d3 C2 E4 o+ _9 OLCALL DELAY2
( x! `5 f* @: p5 n9 T. c) q$ KSETB P1.0 + K# K0 v! L+ L9 q
LCALL DELAY2
1 ?2 q: N0 j4 nLCALL DELAY2
4 ^2 y: c  m) H9 o7 [# {' uCLR P1.0( T# [4 |3 [. I0 S) @: }* ~
RET' n! i8 y3 r! {" R) C+ v
; J' ~- J, N- q. p5 G. {7 w: y  A. F
DELAY2:8 z' ^9 x+ w. k
MOV 35H, #255
9 d$ A1 T1 Y4 b; l8 K3 m$ x7 wSLOWDOWN0:$ F: @# V) {- C8 {
MOV 34H, #170
6 K9 K  Z9 _, y5 ~9 l- c/ H, R$ [SLOWDOWN:
' q. D7 m, Y; z6 j8 OMOV 36H, #2# n6 f$ q. u0 p$ `2 J( P
SLOWDOWN2:
0 X9 a: I: @4 FDJNZ 36H, SLOWDOWN2 8 c. L  s9 ^. l' \" J/ O+ c2 d
DJNZ 34H, SLOWDOWN
% l( Y( f$ Y- y1 ~, ^1 X) ]DJNZ 35H, SLOWDOWN0  j6 r! R$ k& U0 |+ E. H0 f
RET
# s8 f% N8 R8 k- Y, q
& ^! I9 c7 a1 ]! e7 q/ AEND
9 ^0 m) O& L- _: @6 y; ~4 c9 O+ e% F# C0 W3 t' H+ w# a2 ?$ L

该用户从未签到

2#
发表于 2022-6-9 10:05 | 只看该作者
(; P)是8 G( C1 J9 `! J% V) W2 D& h
啊啊啊,

该用户从未签到

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

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-10-7 03:50 , Processed in 0.140625 second(s), 23 queries , Gzip On.

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

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

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