|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
用8051与1601LCD设计的计算器 带仿真和汇编源程序
2 P4 q- P, ?9 t" z
: x8 ^9 h3 F i5 g+ e! d/ ?, ~8 w/ J1 V h, R* y& [, n
4 }" u9 B- l3 N3 k. j- n& L# k8 _9 h8 |1 K- G, t
用8051与1601LCD设计的计算器仿真原理图如下:& [& x6 s5 H& j. r- T# N
6 ]* b0 Q S$ F! W ' C5 S1 J8 l' |. d
# S& V$ j$ p9 [0 b. _! _* f5 q
部分汇编源码预览:2 P" y4 f/ J j+ D) S
* d7 D, ?$ U' W# m
9 U& P/ H' Y* l# c9 z8 `5 L/*******************************************************************************
, X3 ~! _9 l1 G0 R$ s3 U************ LABCENTER ELECTRONICS ************ 3 ^& w/ V3 z! D9 x1 x* h
************ Proteus VSM Sample Design Code ************ 8 V6 K+ s2 ?3 ^1 k' t
************ Integer Calculator ( 2K Code Limit) ************
/ G3 a! r {6 T$ p# W# H7 L*******************************************************************************/! X1 c% l$ Q$ \+ P& r
1 K2 x7 ?5 l9 q+ g3 E
4 A) H% l4 q/ t8 \( }NAME KEYPAD
F" I1 f2 V E" D; o; This routine will read a character press from the keypad and return it in R7.4 c9 L$ S/ B. I8 v$ L5 i8 B( @
: j. O" \' E# ?
4 p+ t+ O5 P6 b6 \: e) u;Set up Segments for the Input Routine - No parameters.
3 L; E4 ~, D, D }6 Z8 j?PR?input?KEYPAD SEGMENT CODE
" v0 C3 L- K$ h5 N6 U+ q3 e7 i( v$ q5 Q PUBLIC input
6 s& R# `' D$ T ]9 b* T, L# f?DT?input?KEYPAD SEGMENT DATA
5 y! o1 o+ R" E) w/ D& E, I+ l, k; c1 B' _# k
. X7 W: _8 I+ XRSEG ?DT?input?KEYPAD ; Local Variable Segment for Output Routine.3 I& ~# u3 \( {8 P& j% p
, q8 y* g( o: a6 [$ X B- O; ~2 q$ k/ q) Z% N# G/ ]6 \
KEY_ROW1 equ 0EFh
# A- W$ m4 y0 t: Q" DKEY_ROW2 equ 0DFh
1 ~7 f6 S' O1 r+ YKEY_ROW3 equ 0BFh
! q+ e1 r) \+ TKEY_ROW4 equ 07Fh
" O/ s% ], N. g7 T0 [) h3 U. u9 D! j! z l
( u5 T0 }8 n+ n6 Kkeyflags: ds 16
: e2 E) ~+ _/ [% W% a# P4 }/ w
3 W/ n7 e/ K Z$ t+ j5 `/ R" G" _3 J7 c2 T& B
RSEG ?PR?input?KEYPAD ; Code Segment for Output Routine.. C9 K8 |+ d# P$ J
input:" @6 P& u; N' g5 b- C s# l5 F/ @( X
# z6 ~# f a# u6 d9 U6 o% \& a9 b0 r+ Z1 x; M* r ^6 t4 z+ k, q" l4 @
keyscan:push DPH t8 X2 v7 P- z v3 k8 w2 [/ ~6 Q; z- G
push DPL% D# ^; {! E2 D" C& k
/ z5 N5 ?9 [& ^) i( [6 \
mov R0,#keyflags ; R0 addresses the key toggle bytes
1 z% Q) b t0 B" Q3 x5 L mov R1,#KEY_ROW1 ; R1 address the keyboard row address$ y% f9 {5 R+ O6 l
mov R2,#4 ; R2 counts rows
* o" P' E; c+ b; I4 v4 Nksrow: mov P2,R1 ; Set row address to port P2, ? Z/ u4 B, M8 P( o
nop
* Y8 E" Y) E o mov A,P1 ; Read column data from port P1! s0 e( y2 L8 w/ N: \ s
mov R3,#4 ; R3 counts keys per row
3 E7 e( L4 h3 j7 Z ^6 b3 k anl A,#3Fh
! \, g- a3 E: h2 |! k) [- L0 O% cks0: rrc A ; Move next bit into carry
2 A: v7 ]4 f8 p6 C9 q mov R4,A ; R4 preserves the row data9 t( d( U& V+ Y+ q; u
jc ks1 ; Jump if key not pressed
( y3 G- E2 j! T4 g9 k2 j- @2 I mov A,@R0 ; Test if key already pressed4 k5 G4 B; T7 Y: W7 f: p
mov @R0,#1 ; Flag pressed anyway
r0 V0 l: a w* ]+ J8 z$ o; Q jz ksnew ; Jump if key newly pressed
5 j+ y9 `9 u7 o1 ] jmp ks22 m% p5 K7 ~9 K
ks1: mov @R0,#0 ; Flag key as not pressed; t4 _ f/ N# \2 j2 d r$ b9 n
ks2: inc R0 ; Loop for next key in this row
( x- ]; T j& s% w; g mov A,R4" o1 K$ l: x( P4 I8 x L: }/ ^
djnz R3,ks0, n0 K: x" Y6 G6 q8 g7 B4 X. O
! q% ~" E3 m; Z' R) c1 `9 e2 t) ?; ?5 ]2 q& F
mov A,R1 ; Jiggle R1 to address next row
7 a! z1 \. ~8 N5 y( s rl A
) {+ M- d6 z& ` mov R1,A/ ^: ?' W( P9 u8 ~! E# _
djnz R2,ksrow" p7 ~0 X* L5 T: M* X: H4 j' F
9 C" _0 }1 J' Z+ J
% c: }- ^9 R; Z$ `) q% r$ C0 O clr A
1 N! M0 m0 G0 G4 s' ]. L mov R7,A ; Return zero - no (new) key press. $ c& M8 n& ?$ w% H: d1 F
jmp ksend
5 u1 e9 i( w& D$ n6 x# a- a$ q) o; _
* ]1 R, u* G7 x1 U! A% z, `ksnew: mov DPTR,#keycodes ; We've found a new key since last time:
3 f- C. g! Q, G6 G6 O% m/ I mov A,R0 ; The key flag address (ordinal) is in R0( o2 A7 S5 q5 P; Z" s1 X2 p
clr C. w- \3 n5 Y" B' ?, q
subb A,#keyflags
& x/ v# E7 V1 D movc A,@A+DPTR3 j2 u: G: q$ n: o, U: r. [; R
mov R7,A ; Move the Key into R7 to be returned.
4 h9 c# ?2 m( \4 h! eksend: mov P2,#0FFh
6 b. P! J! I: w$ B pop DPL0 V/ j; V3 _) |; N, `3 k
pop DPH
0 G/ Y) U+ C, Q4 q* J# M$ R) A: P ret& H1 Q1 V5 U% I: |$ Y4 J
- I/ D2 Y4 i" z/ N
& Q" h3 k: N& d8 ];Data tables for returned row bits
5 z2 Z" j: `; b6 _2 Z8 r9 Kkeycodes:
0 f3 j2 G5 y; q( s db '7','8','9', '/'$ Z: P6 F0 F) }
db '4','5','6', '*'
2 M7 e' P1 D9 h% c" E db '1','2','3', '-'& \% N2 G. Y# `6 B8 k, N4 X( A
db 'C','0','=', '+'
4 F/ d# w6 z& c$ ]9 O! |( v# D j4 R6 W- _4 W
) S; X( W9 s$ z9 S" {2 g! h END o! L! ]0 T/ k* R- z+ W8 M' M
" ]0 m y B. ?( M5 O% Y f* W+ @
完整源码和仿真工程文件下载:
% M- J4 m! l S% U/ g& A" D' [1 E9 b
3 w1 w% \" q6 ~" f, D# d2 Y
|
|