|
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,答案正确吧?7 u p" c3 y1 |) @3 ] M" ^
) u9 W6 @4 l+ X/ b5 D2 p6 [;C语言: ]7 L7 ~0 v# U9 B, F8 H$ z
+ [6 K5 G1 _' r0 D1 o6 \) Z
;============================================) N& z% y" c0 f% P6 S- \
;16位乘以16位乘法:被乘数:{MD1,MD0} 乘数:{MD5,MD4} 积:{MD3,MD2,MD1,MD0}
1 T& q) o: n" Y" ]5 y, o4 C4 p
# u1 T' p" G9 n9 j y1 ]/ B1 f;define MD3 (*(unsigned char volatile xdata *)0xfcf0)
1 |. ~- c8 [* j;#define MD2 (*(unsigned char volatile xdata *)0xfcf1) ) Z" K: \) q# O4 O1 F' a# n
;#define MD1 (*(unsigned char volatile xdata *)0xfcf2) * v: v' k" Z& z; d$ }5 k6 F
;#define MD0 (*(unsigned char volatile xdata *)0xfcf3)
, r9 @2 o% v6 I9 X3 s7 u2 L; r;#define MD5 (*(unsigned char volatile xdata *)0xfcf4)
- U2 ]# F L; W7 ~6 D;#define MD4 (*(unsigned char volatile xdata *)0xfcf5) * X- M& Q6 L& ], ]* d9 o: _) B
;#define ARCON (*(unsigned char volatile xdata *)0xfcf6) ' g% ~2 @9 L, l4 c. W+ X' e
;#define OPCON (*(unsigned char volatile xdata *)0xfcf7)
+ L% A: V* I: V;sfr P_SW2 = 0xBA;
" e! k: C4 N( g+ B) ];////////////////////////////////////////////////////////////////////////////////
1 W6 \$ k! J8 l. m. c) ?;//16位乘16位//////////////////////////////////////////////////////////////////////////////
! H, D B- ^: K;// unsigned long res; unsigned int dat1, dat2; : R* i3 ?, k" C
_SW2 |= 0x80; //访问扩展寄存器xsfr; D1 a0 `5 Q0 b @3 _
;MD1U16 = dat1; //dat1用户给定MD5U16 = dat2; //dat2用户给定
/ I& `0 o4 [2 i! O;ARCON = 4 << 5; //16位*16位,乘法模式$ Q" O$ j) ^! O$ P+ Y& I
;OPCON = 1; //启动计算6 }# y* I) ]* ~9 s( @7 w
;while((OPCON & 1) != 0); //等待计算完成
: k- U9 C/ H$ @' u6 q9 N+ C;res = MD3U32; //32位结
# h7 ^- D9 C) H8 r$ H; u4 J, N, Y! r5 {* y+ n m0 @
;汇编:
) ~: o* f8 n! x4 Z( NHEADBUFFER1 EQU 0A0H
5 d0 i, I6 ]7 v! ALASTBUFFER1 EQU 0FFH ;第一组缓冲区- n! L% r8 O& _% q
AUXR EQU 8EH" g! ~4 Z3 b' R+ r' ^8 o
AUXR2 EQU 0A2H3 @) z X/ P# ~. e7 j; p9 h
WAKE_CLKO EQU 08FH
: O z/ [7 o! n t) @
# O8 N- Y- _/ y: R9 Y% nMD0 EQU 0FCF3H
- @+ `& e7 O; g3 g OMD1 EQU 0FCF2H
4 S* \' @3 t7 |3 r! k6 V) gMD2 EQU 0FCF1H6 @ e: Z. r' R# l& J3 Z
MD3 EQU 0FCF0H( j! W4 @$ `+ q7 H7 a$ W3 O
MD4 EQU 0FCF5H
% b+ W: z9 a( C1 ~; X! i$ D6 Q6 aMD5 EQU 0FCF4H: r: d) i! d- b
ARCON EQU 0FCF6H
) j f/ p2 E, r. yOPCON EQU 0FCF7H
- T. u3 u+ @! J" }- N' e* UP_SW2 EQU 0BAH ;当需要访问 XFR 时,必须先将 EAXFR 置 1,才能对 XFR 进行正常的读写$ l3 h! c; I7 b) X d
* @9 }6 \! S* M% V' O* u( {3 r( RORG 0000H9 [8 A) ]9 ~0 c% p9 P# l! \. B7 Y
LJMP MAIN) O+ J0 O+ p1 i ^1 L
ORG 0023H. a0 u3 T( K. R6 I% }* b% f9 t) W
LJMP UART1 ;UART1 RECEIVED INTERRUPT
- t% r9 |1 D9 x" h. N3 F& a7 Q. `ORG 0100H! L8 j+ R h4 r- F& u# E
2 S# k' u. ~% q7 t" p! R) b% ]. H
MAIN:
, E' ~- I$ F. y) KLCALL DELAY1 ;用STC-ISP的串口助手,必须给点时间切换,否则上载后来不及接收结果(00 02 16 38)接收口波特率为115200 晶振:11.0592 STC8G2K32S4
. U5 I8 M3 O1 p! R+ S2 v3 h, Q# DLCALL DELAY1; W2 y3 r% S+ U1 z4 G4 E
LCALL DELAY1( g2 z4 Q2 N' n. L# F6 \) X D E
4 `) g; N( g" t. M0 V
LCALL IOSET; C, W) D6 J# ^8 J" k
" I! F) d* M% x. x& T
CLR P1.0$ R5 Y% f" |2 n- T% X+ _
' D0 N Z: a' {- \
MOV WAKE_CLKO,#00000001B ;ENABLE BRT(=4),T1(=2) T0(=1) HAVE CLOCK OUTPUT BRT@P1.0 T1@P3.5 T0@P3.40 S# F0 C7 C. B
MOV AUXR,#11111100B ;T0X12,T1X12,UART_M0X6,BRTRUN,S2SMOD,BRTX12,EXTRAM,S1BRS $ r! N% H7 d. H0 O! z
MOV AUXR2, #00000000B ;#00010000B=SHIFT UART2
B7 W) ~. N& @8 u, iMOV TMOD, #00100010B ;TIMER0, TIMER1 AS MOD2(8 BYTE AUTO RELOAD TIMER)
8 d. _7 }' l9 q! j* |6 J ;GATE, C/T,M1,M0(T1) GATE, C/T,M1,MO(T0)
& m6 @! O3 e1 b: l% n! q: T+ F6 z2 M8 Q' ]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)
- C8 }) X. d& q) i* O' ^* q6 H5 A+ I" c# q
LCALL INITIAL_UART1 ;USE T1 AS SERIAL BAUD GENERATE FOR UART1 5 f" O9 b7 b# n
CLR RI
8 s q* m2 @8 V; G8 hCLR TI
" f: W6 D& s0 }+ w5 PSETB EA ;ENABLE ALL INTERRUPT
9 v x2 A) f/ x; L$ X
, m7 c9 X& T4 [6 q, qMOV P_SW2,#80H ;访问X寄存器打开* K! o- a! Z5 V# K; j( ~
0 |9 Q2 u0 m. [MOV DPTR,#MD1 ;
; N7 Y* A+ \' s. X Z/ }MOV A, #01H ;必须通过A才能送到+ w; V' @6 I6 t& n6 C
MOVX @DPTR,A( _, T4 | |# }8 j; r- t
+ }, a% t; j5 C) V9 Y/ Z; v" F- L
MOV DPTR,#MD0 ;
! j" Y @: k! `+ X8 _$ e6 hMOV A, #07H ;必须通过A才能送到
" e/ l$ s: T7 r( f l; gMOVX @DPTR,A- ~) ]8 V6 [( d0 S
% Z$ H- h, |2 b+ ~4 P1 _+ B- r6 ^1 |' qMOV DPTR,#MD5 ;- l/ t% l' ?; H; U
MOV A, #02H ;必须通过A才能送到
0 o* g H A0 L- S( K: AMOVX @DPTR,A+ M& T5 ?. E* W5 F, }
: p8 F, P1 d7 K: m/ m( BMOV DPTR,#MD4 ;
" D P! ^6 n; E8 `3 C# P/ `9 ? IMOV A, #08H ;必须通过A才能送到
2 v# N5 J' V0 r8 w. i- x4 @MOVX @DPTR,A: R" b* {/ p" z; A9 C7 y; R# @
# k4 s1 w" M( h" R* `MOV DPTR,#ARCON ;+ y/ E& J$ f9 r2 j, F: J; v; J1 ~
MOV A, #10000000B ;b7,b6,b5 4=16X16 5=16/16
- y! M7 S, N, u) aMOVX @DPTR,A
5 ?% d+ ?3 [; L5 n6 n5 w
8 z2 e) i! e% b; J( L9 Z- QMOV DPTR,#OPCON ;启动运算, r& g! [- b+ _! b& p$ H! o+ O
MOV A, #00000001B
5 c3 D: X7 Y9 tMOVX @DPTR,A0 h+ G) P8 V" C F2 d+ e3 \
3 ?! r! b* j I. H4 C6 y' S
WAIT:
' k M6 a$ v. m. S2 _+ r J% @MOVX A, @DPTR
7 R; j/ @, V: K# vANL A, #00000001B6 Z: b( \: p/ x8 I
JNZ WAIT
& h, ]9 n7 O, a! G) Y* {
# ]( a0 ?) I7 N: s4 N$ x$ LMOV DPTR, #MD3 1 y! d$ X* G$ f
MOVX A, @DPTR
+ i: L c* G! M( H+ M/ d5 r5 S
$ [7 y; b, U3 N8 [2 L+ \LCALL SENTONEBYTE1
0 k. M2 k* {2 j1 M
6 Z/ C0 j5 j8 |MOV DPTR,#MD2
# Y! V2 f% {+ u; v) l" c6 W# nMOVX A, @DPTR, {7 `( B* z% J& _( q) T. P
+ M* P# a" C- x% C7 MLCALL SENTONEBYTE1: ^5 |7 G v% n u2 ?
% X6 G$ E& j2 S. S
MOV DPTR, #MD1 + |( H- w( k& h s
MOVX A, @DPTR0 U" y- @$ X& p' p: {
6 ~. V$ J: |' S1 s1 F0 P
LCALL SENTONEBYTE10 v; _) a- v) ]$ A
" h' t0 p* r4 r+ W: k5 P
MOV DPTR,#MD0
- D1 t# _; ]( M4 c6 f5 t5 DMOVX A, @DPTR
8 u! `* T( B5 R3 y8 a+ ?3 [: l( U" w) ?( {* L3 p
LCALL SENTONEBYTE1
' ?/ P; ]7 M" l, I1 l
" A3 W) J9 l' j: C' [MOV P_SW2,#00H ;访问完毕要关闭
6 q. x2 e, f/ F5 `3 L1 J3 j9 X2 J% J: F: j) |& M/ P
LED: ;停机 n( T& T8 E9 A) Y9 i, \$ I
/ o0 G6 `9 m, o& jJMP LED
6 t% A! r: j! P6 [& Z3 V$ [6 m+ _! J7 r0 X0 l2 `% T8 m* g
NEXTBUFFER:5 q5 q+ X/ @" y& D7 d
CJNE R0, #LASTBUFFER1, NEXTBUFFER2
" V1 k8 m# O2 x* L, H; U. {, ]MOV R0, #HEADBUFFER1; o; ~9 t( f9 p, A9 v( G# `
JMP NEXTBUFFEREXIT
3 \( x3 [9 {1 z# E& _- zNEXTBUFFER2:
5 G# b- j) r, `7 [$ FINC R0 OINT TO NEXT BYTE0 P5 |9 e. [# \& k; p
NEXTBUFFEREXIT:
' h0 l. f2 _7 JRET
' u$ [& ?) T+ t0 V6 Q1 I+ N. f/ q0 R! M4 j
SENTONEBYTE1: ;SENT OUT A
0 r2 }6 o0 V, yCHECKBUSY1:7 U$ [0 f. o, X: E2 G$ j) ^$ g: V
JB 40H, CHECKBUSY1
H, z# b9 Y( |) wSETB 40H
h. ]+ U2 J$ V9 ]MOV SBUF, A+ G) ^4 Q$ q7 P; D. j
RET7 _ B3 A$ S3 g8 z* d& |
/ c9 C, ]0 F" P1 c% k, ^0 ]UART1: ;RECEIVED DATA FROM AIR
+ k: u4 C5 S& tPUSH ACC
r' L. Z y' S) r8 M! C3 N: YPUSH PSW. |! k! l( K$ i" i# \* C, U5 x1 y, q- U
JNB RI, UART1CHECKTI3 i* i N Z; D9 O7 j+ U" c2 K3 \
MOV A, SBUF ;READ THE CHARACTER FROM THE SERIAL PORT
' B0 `% G4 m) P1 D; h8 e1 q" `CLR RI ;CLEAR RECEICED FLAG
/ x$ \$ W( b" l- C0 lMOV @R1, A ;SAVE TO BUFFER
9 v4 i3 @8 I1 g6 W6 |4 _! `6 ZCJNE R1, #LASTBUFFER1, NEXTREADBUFFER
6 A/ S' R. T/ o2 f4 @6 ?$ y9 ?$ t" V! t4 ]MOV R1, #HEADBUFFER10 n8 }; |; R( l* m
JMP UART1EXIT
# V5 i9 S. w2 S+ @NEXTREADBUFFER:# Y3 ]/ Y& c5 b- q* v" ~- r1 [; i3 R6 R
INC R1 OINT TO NEXT BUFFER7 ]: X. Z5 |8 `2 c5 C X4 D
JMP UART1EXIT
, s/ |7 Y3 T8 hUART1CHECKTI:
, V- F& B+ A7 s z* ?CLR TI
6 w) q. D/ r! ?8 aCLR 40H 1 L8 B$ z1 l$ W( p' X& M/ W3 P; [
UART1EXIT:0 E" F; q6 d% k
POP PSW
5 \7 X# f; z8 hPOP ACC
* i/ ]5 O) g' w& hRETI
4 ]5 B0 N; s5 ?4 R/ }" m/ k* [0 P9 e- K5 Z" t7 j; ?
INITIAL_UART1: ;115200
' ?9 z5 f8 t8 i$ o1 q" A0 I& lMOV SCON, #01010000B ;SET AS BAUD VERIABLE, NO ODD/EVEN CHECK
& Q% M3 W% ?# a) `4 O* D; ^1 fMOV TH1, #253 ;247(11.0592, 38400BPS) FOR TIMER_1 251=115200(18.4320M 115200BPS) 253(11.0592M 115200BPS) IF PCON.7=0 4 c$ g3 [) y; V! ?! E5 I. E
MOV TL1, #253" R L" v8 d# o- p
SETB PS ;SERIAL PORT PRORITY HIGH, o7 \2 v! S" w, ~/ ?% {
SETB TR1 ;RUN TIMER_1
, Q0 v$ R0 S" ~! GSETB ES ;ENABLE UART1 INTERRUPT5 c. x5 |9 o/ ]" g m: {" N
RET
5 o& C. O3 l g+ ?9 M& A. p4 \# Z, H$ ] \4 Z; z% J8 l: M
IOSET:
6 A- H9 a1 e/ A9 z1 c6 w% R;-----------I/O CONFIGUE+ J' \$ w# D0 }8 [ A( f
MOV 93H, #00000000B ;SET P0 0,0=I/0, 0,1=HIGH CURRENT OUTPUT, 1,0=HIGH IMPEDENY INPUT 1,1=OPEN COLLECTIVE OUTPUT
* V( _+ U+ U& p: ~& WMOV 94H, #00000000B ;SET P0 (CONMAIN WITH 93H THIS IS SENCOND BIT)
, P6 L* g4 ?' P7 f VMOV 91H, #00000000B ;SET P1$ r- |. v! G0 H* l0 r& c* H
MOV 92H, #00000000B ;SET P19 Z& x* \1 l: i, T: g$ E( ~0 [
MOV 95H, #00000000B ;SET P2$ Z" f( d; v9 Z7 T$ d
MOV 96H, #00000000B ;SET P2
$ C% d) o; m# |" R& b% p! i/ p% CMOV 0B1H, #00000000B ;SET P3 % r& X8 r6 z8 A, B+ Q* ^
MOV 0B2H, #00000000B ;SET P3
. s& F) ~: ]; J& c4 J9 `MOV 0B3H, #00000000B ;SET P4 - n0 F2 }- n/ F. F5 Q
MOV 0B4H, #00000000B ;SET P4
$ Q. _5 ? v" `+ ?$ OMOV 0C9H, #00000000B ;SET P54 X3 f2 z. @" K$ w. F s: @- C6 l
MOV 0CAH, #00000000B ;SET P5: k3 d# v4 j8 f: _
;MOV 0CBH, #00000000B ;SET P6 r" [2 I, n, X1 t4 D) k/ w/ v
;MOV 0CCH, #00000000B ;SET P6& M* R4 R l: n9 \7 O6 U
;MOV 0E1H, #00000000B ;SET P7
6 Q% ?) K1 ]9 v* h1 B' ?;MOV 0E2H, #00000000B ;SET P7
9 }9 p, p4 X! j8 ]% v! \8 h& D' @RET
/ k+ w! E. l1 N3 X5 E& Y3 z) G2 Z: {! H+ U
DELAY1:
# ^6 E+ N9 t3 ELCALL DELAY2
) W9 ~9 d5 Z8 l( ELCALL DELAY2# e5 z8 R# \! J. r4 ~, q
SETB P1.0
, y$ W7 W# |, PLCALL DELAY2
( r; ]& g% n1 r! J- z/ HLCALL DELAY2
4 X" x4 f2 ]: O( Y, U r3 K) p+ yCLR P1.0* C$ D. p: t, |. C
RET; X C' y6 j1 R: G
/ V; R1 }- Y- e$ u2 O* X
DELAY2:
3 o- N1 W1 O3 n9 gMOV 35H, #2554 G1 A* v- k: S
SLOWDOWN0:4 w4 v. l m1 E& _! x
MOV 34H, #1707 O2 j2 Y3 u6 N0 A0 \' L- {
SLOWDOWN:' Q6 g& Z. G: k1 `8 r
MOV 36H, #2" L4 H4 E$ R) p* Q+ J/ n n5 J# @
SLOWDOWN2:
2 S0 w# S* O! hDJNZ 36H, SLOWDOWN2 3 t6 m. b% s. X' H7 ]
DJNZ 34H, SLOWDOWN
+ \: y# A! _$ B$ sDJNZ 35H, SLOWDOWN0
% l' P- r* W- G0 |; R" b+ D M0 BRET
2 m( h1 G1 ?* @# i) q
K5 m" E2 R7 {& V$ L% SEND: p+ ~: l5 @1 l; ^8 w& g8 o; B
# Y2 ^) I4 a" b) c9 e& B
|
|