|
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
|
|