|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
用8051与1601LCD设计的计算器 带仿真和汇编源程序7 ?% a# U; L. s5 d. m, e
! a7 L6 q4 k, C% [" Y6 T& G
$ I l: B8 U/ F3 ]% _& C5 V2 F
4 W' c& G1 w! ]& h. i用8051与1601LCD设计的计算器仿真原理图如下:
' {$ ~4 p; t+ R S- u0 k5 o( T. i
" Y! N7 |$ M6 Q' p" m4 o7 @- V/ }- @9 R
部分汇编源码预览:
' L( o6 ?. ?# K, k
! @7 r) U# r! @3 h; K3 W
) _7 K# [- a3 a/*******************************************************************************; y' ]. r: z; w! i
************ LABCENTER ELECTRONICS ************
9 Z. C7 w3 P( z% o g8 @- {************ Proteus VSM Sample Design Code ************
. c4 W: q0 B: Q! j************ Integer Calculator ( 2K Code Limit) ************
( o+ Z8 s- X8 a, b$ Q*******************************************************************************/5 S$ d9 q3 E7 P: ?* t6 }* C
# s6 z& w# A0 P4 C* X/ {
/ @7 n ?0 T$ _7 z
NAME KEYPAD
7 t2 E- o+ x7 |( [2 S; This routine will read a character press from the keypad and return it in R7.
, ^; g7 ^/ m. F2 I+ f2 L J5 [! W% L4 K" z
5 q1 e& R2 ^# I! n; h+ {
;Set up Segments for the Input Routine - No parameters.4 V' y; W. z% s B; A6 @( K0 Z9 V1 H
?PR?input?KEYPAD SEGMENT CODE [7 z& u& s8 k, z
PUBLIC input! H. y, n# M$ I9 d5 n# G
?DT?input?KEYPAD SEGMENT DATA
* C0 j" B/ X) Y7 `( ?( `& A" R! Q5 M0 R+ ~& L, w
, Z6 Q' R1 `, g& P7 i6 DRSEG ?DT?input?KEYPAD ; Local Variable Segment for Output Routine.0 R- T/ r1 g$ Z. E: ~" e
3 x. x! [- b/ I9 I) G
2 ?) \9 G' j0 w- PKEY_ROW1 equ 0EFh
5 p" s5 ^, ^3 ^8 M4 R' W5 X3 BKEY_ROW2 equ 0DFh
: i0 l/ u& p7 ]" ^( z! D& yKEY_ROW3 equ 0BFh. g8 n9 T2 {) p. y4 n
KEY_ROW4 equ 07Fh0 ^1 ?8 Q! j% t( W' P4 \
1 o/ a# N" ~* F/ l2 ]0 J$ z4 O$ M
3 ]3 p Z2 t) z6 z9 ]- B" n5 zkeyflags: ds 16
+ Q, l* y2 c7 j. B& Z( j% |4 l* c3 c3 F0 K! F
/ `' ~) n. t/ b! C7 d5 [6 Y& ~
RSEG ?PR?input?KEYPAD ; Code Segment for Output Routine.
2 b7 Y5 i, c* q$ z. x$ v* einput:7 Z! C7 X3 P g) I& a# D0 u- t
- _8 E& ^8 \& k) w: r! J) |# r" }" W7 W6 `1 I8 T; i
keyscan:push DPH0 l- ]& u% S: a2 a1 G( ]
push DPL
0 {( |$ [9 d( A4 y; a 5 i% u ~1 O4 G1 y; \! R
mov R0,#keyflags ; R0 addresses the key toggle bytes
; G8 y- f4 Z+ ]5 y mov R1,#KEY_ROW1 ; R1 address the keyboard row address: }# `' [! E/ V+ N
mov R2,#4 ; R2 counts rows! J. l0 I: O/ [, x* v, a4 k
ksrow: mov P2,R1 ; Set row address to port P2
9 C" B4 |/ ?- w6 V) P nop
# T" p) C' e7 K* I" h' B mov A,P1 ; Read column data from port P1/ t: E* G7 P* b2 x9 ]
mov R3,#4 ; R3 counts keys per row
9 z$ C8 N. D9 y/ h, ] anl A,#3Fh
4 }2 X" g4 K. s5 }! U" Iks0: rrc A ; Move next bit into carry
" F' M0 x+ q- @2 Y/ h( `) H& l mov R4,A ; R4 preserves the row data' e C8 }, I2 A! S2 e6 ~
jc ks1 ; Jump if key not pressed
7 _/ V9 T" e; x3 t! @3 z8 \' Z mov A,@R0 ; Test if key already pressed
4 v* [" ^% [6 O+ X2 d8 t mov @R0,#1 ; Flag pressed anyway+ e# X# p' i6 h- N, P
jz ksnew ; Jump if key newly pressed$ F7 X+ E1 l, g0 d* M) v
jmp ks2
/ |/ @: l. C p" l( S$ X: m, }6 o" ?ks1: mov @R0,#0 ; Flag key as not pressed
6 @% @! A6 y w& R7 O" E7 uks2: inc R0 ; Loop for next key in this row
3 z' L1 M$ x8 j& P mov A,R4
9 T! q) q) K5 g+ P djnz R3,ks0
( b* m u3 k v! F
2 i8 d5 R" @/ K7 I+ b, q& x6 V+ o+ e+ M% ? O
mov A,R1 ; Jiggle R1 to address next row' e" g6 w, p% p- G( q2 E9 H
rl A : y# G. p" ~$ G. _' L7 p
mov R1,A
# V' _' _1 Y# P8 ]/ ] djnz R2,ksrow
0 n) n# e, K6 c& `) ^
9 G! l& v S0 @% G% Z2 S, m$ Y/ t7 c8 S
5 X$ f" G8 h. w2 _. H2 x- L clr A
* f. i/ j! w. q/ A mov R7,A ; Return zero - no (new) key press.
4 w/ D2 E; p3 I jmp ksend
7 |+ G9 M0 x2 `2 f& W: R # Q7 S& B' v3 T# ?' j T5 g2 e
ksnew: mov DPTR,#keycodes ; We've found a new key since last time:% Q R2 g9 s7 `0 I. D5 q
mov A,R0 ; The key flag address (ordinal) is in R04 R( k% j/ E0 o
clr C$ p! o) H9 C3 H; n4 ]
subb A,#keyflags$ O, `; H# _: @
movc A,@A+DPTR# d6 Z6 X6 {" |1 R/ o. a
mov R7,A ; Move the Key into R7 to be returned., r* Y* t( O1 Z
ksend: mov P2,#0FFh
8 ]2 w. n. m" y0 H) A- |- T pop DPL4 \% A0 y- Y3 @! G/ N$ ~
pop DPH7 L: o E. o1 b) ^4 h |
ret
, K; w# I1 S. N2 S) M) Y$ P a+ A- f6 r% j( x( \+ z9 G. @! z
9 r: e" d) H% Z) I; n
;Data tables for returned row bits' ]8 u) H' ?+ h: p2 Y
keycodes:
$ v. K* T; ` }* h* S db '7','8','9', '/'
& R8 L {9 {7 f+ z) U( v% h db '4','5','6', '*'
4 W% X3 U& {; f( Y2 A" E5 M* V db '1','2','3', '-'6 L3 {2 p6 ^& I+ S0 q$ I+ G1 O8 {
db 'C','0','=', '+'
8 s+ t2 d( U+ ^/ d0 V! C
: h' w7 {) n7 Z' j" u( Y3 h
* d+ z1 ~& k( t. f6 u; s6 Y; X END5 B# q4 s% G: U
$ S$ Y0 c4 v0 \* P8 a' \完整源码和仿真工程文件下载:- V9 F* i# M; a& G5 [
6 b0 m4 Q3 _$ [6 g
7 f3 a3 p9 b: w' e; u/ w! a7 n |
|