|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
用8051与1601LCD设计的计算器 带仿真和汇编源程序
, h: ?# F: m# a6 C- G( A+ V2 ^; w/ L: M c/ r' [3 l
. m; _( _6 j' p% R7 n( ~& C1 s9 a- p3 l8 M8 Y& P: y; q
, B3 v' M$ |* C8 t. N0 X- j% l
用8051与1601LCD设计的计算器仿真原理图如下:
' g! J( O6 B' P6 b4 t( Q& g
7 P# G/ c4 v1 U. V" @3 z q+ H% N3 o/ d* p8 F, h
: w7 q4 M4 E/ A4 l2 e& x- F部分汇编源码预览:
3 Z$ t1 A; C- T+ z1 H' q" L0 J
1 v6 K7 \3 w9 E6 i* b ^! S. P
/ T" J. d4 c, b4 c. z/*******************************************************************************' Z: @# ^# a1 G! W ~9 \
************ LABCENTER ELECTRONICS ************ 5 \: K7 F/ x r
************ Proteus VSM Sample Design Code ************ $ u& _+ q* _& i- P
************ Integer Calculator ( 2K Code Limit) ************
3 j8 ], \# m' k' l) k7 w1 [" J; ^7 v*******************************************************************************/
5 I7 d# S$ M, X& X4 {2 j' ^! i0 B# U: D! m4 N$ \. S6 M6 u
' j" e" y! n4 l H) \
NAME KEYPAD
6 X% _/ E0 o$ p) X1 L; This routine will read a character press from the keypad and return it in R7.$ L7 _2 ?" S |7 @3 R1 l
$ d6 y% n7 X. T0 Y5 ~. X
+ I/ I4 G6 z) q7 f6 p7 s" S;Set up Segments for the Input Routine - No parameters.
0 |3 X& Z: a% A?PR?input?KEYPAD SEGMENT CODE+ S' h- i- V+ e
PUBLIC input7 N! ~: D: Z$ _7 `1 g+ r @
?DT?input?KEYPAD SEGMENT DATA/ h: }. {% `6 A" S5 b5 x3 L
4 O7 S" y( N* d! f! B$ K5 ]
* v& t. y C' |8 P1 `( oRSEG ?DT?input?KEYPAD ; Local Variable Segment for Output Routine.
8 b P, k7 S& {- @5 f2 M1 v% \ K7 y& Q/ k
5 G/ H J" N$ v
KEY_ROW1 equ 0EFh7 C) q$ y; X: [) `2 c
KEY_ROW2 equ 0DFh
. b9 A$ Z6 j" |3 Z$ lKEY_ROW3 equ 0BFh9 D$ m8 M5 J) C, j) S F
KEY_ROW4 equ 07Fh8 y. K/ F0 o$ e' v& m" i) X9 a# ]
4 f3 a3 F3 q* X r5 Q5 J0 V' j
" D: W) ~! X- \keyflags: ds 16# w( ^3 H7 L" l* w0 ^- K6 m
/ m z+ t8 u2 l& G1 p. @) A' l
0 o. k8 L8 \# fRSEG ?PR?input?KEYPAD ; Code Segment for Output Routine.
" K8 A7 _0 M0 i/ ^" [" Ginput:+ M! f" ^' _. n3 f- M9 g
1 |4 q0 w: U2 z# t% J( _. z" r2 f* ]+ C6 E' C. C
keyscan:push DPH
+ h1 Q, o( I% R n6 o) C% E& R! i push DPL* U* m" b) z. a; j+ D! P- I
+ @8 |% b. q4 ^/ ], F mov R0,#keyflags ; R0 addresses the key toggle bytes( `5 _3 g. p! L9 ~. n% i
mov R1,#KEY_ROW1 ; R1 address the keyboard row address
1 k7 j% t) ?5 `: ?- o! S6 j/ x mov R2,#4 ; R2 counts rows
- s: O; k' [. Y0 T. M& g: ]ksrow: mov P2,R1 ; Set row address to port P2
/ g! M9 t9 T) M4 i; v9 C nop3 l. l) N& e$ n6 h) i3 Q
mov A,P1 ; Read column data from port P1* d/ L _1 y3 a
mov R3,#4 ; R3 counts keys per row
2 s* J9 i3 h* p+ Z! d# {0 u anl A,#3Fh
" H& @& r) D) m" e$ s. [3 S6 `9 Mks0: rrc A ; Move next bit into carry. P* u6 h) Z% o" {: S& V
mov R4,A ; R4 preserves the row data
3 A+ a; |8 b7 c2 o jc ks1 ; Jump if key not pressed
; R9 H9 a( F3 o mov A,@R0 ; Test if key already pressed) J- `* K. y" ]/ |) V) }5 c
mov @R0,#1 ; Flag pressed anyway
9 Y9 p2 A0 `; E" M2 | jz ksnew ; Jump if key newly pressed/ c+ ?* c- h8 I; J, o* z, w
jmp ks2, f1 F+ G! |% Y- x( s. j
ks1: mov @R0,#0 ; Flag key as not pressed2 I& G2 N+ q* K9 \
ks2: inc R0 ; Loop for next key in this row
5 k7 |$ j8 t. H/ m# Y$ ^( M; [& H mov A,R4
3 K4 r* ~) f5 Q5 |& |2 d9 }$ e djnz R3,ks0/ w1 f9 E0 q: d0 z9 E4 C
2 F: ^4 ^9 K8 c5 i/ O" i, x
, z7 |9 O$ m- @( D mov A,R1 ; Jiggle R1 to address next row
6 o+ G" h1 |( F rl A : ]( k0 |( p! R9 D! g0 ]( P( z
mov R1,A
& F1 f$ b$ |& q( H djnz R2,ksrow( J3 b1 Z% Z" a7 r$ p! {( Y
( v9 N/ d# J) v+ ~8 {7 \
# M# O/ m+ f( y clr A
! R( q' ]; Y; g. E mov R7,A ; Return zero - no (new) key press.
/ T5 b. P9 X. B% e jmp ksend2 k! L+ s# m4 @/ P
: x# g0 T* I$ G; L% M# C
ksnew: mov DPTR,#keycodes ; We've found a new key since last time:4 b& F+ ~) G% L
mov A,R0 ; The key flag address (ordinal) is in R0, J) U' n4 n2 I8 p) Z
clr C* h4 E0 f- Y& l0 o+ y
subb A,#keyflags
2 i$ \5 D" P: v5 a* Y1 A: H; x/ }0 G movc A,@A+DPTR4 N! |' f; _$ V7 H; ^! Z- {' }/ L
mov R7,A ; Move the Key into R7 to be returned.
+ N2 C( |$ f$ J% o. Aksend: mov P2,#0FFh' G7 h; o7 D& | f( [, c5 c
pop DPL3 L5 I# P. U; B1 y- r
pop DPH
9 i! |2 U, C. S7 f. t ret1 s% } _" R/ \! d+ I1 u
. W) d z$ R, ` M3 z2 F# R( |
/ V4 y. s) r" _( a. S/ u
;Data tables for returned row bits( A* C ]- X' u/ W2 t$ {7 o L
keycodes:" G. V$ @- k+ v. ]+ q9 m
db '7','8','9', '/'
, x( ~3 i0 Q' k" x7 P2 X) b db '4','5','6', '*') F6 R3 \# p: ^: g) @$ c
db '1','2','3', '-'
( x2 s: ?5 d1 p. B4 o A$ l db 'C','0','=', '+'
0 }+ r8 L0 X+ H( V5 g. k! M2 F8 d3 X- x7 w- h* B j" O
9 K: Y: t* Z" }% G' ^% _0 t! Z END; X) S. a0 m% X' N9 k+ z B
9 I8 G: @; w5 j7 B
完整源码和仿真工程文件下载:
6 E) d+ | F3 O3 F( r0 _9 G+ F+ z& U( W9 C
! i8 Y2 W; k% ` |
|