|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
用8051与1601LCD设计的计算器 带仿真和汇编源程序3 K' }4 E* b7 E
9 K4 G9 p7 g7 @& r
8 R) P) \: E+ E; _2 B( d( H \) p" b6 _) y2 Z8 z4 R, D% C
- R# T w; C# z0 P& r+ B0 n( k
用8051与1601LCD设计的计算器仿真原理图如下:4 m, n, t) O) U( p. @- h
0 K1 r; e x: z1 x, F& f; W- m
8 Y% u0 H O! { k* z8 U
% h1 @8 I4 D4 O7 q- i3 P
部分汇编源码预览:# G4 n" t) D0 o! L- k
7 ^5 w4 t- D' Q, K5 w
8 Z2 o$ Y6 Q3 [( u n2 O/*******************************************************************************7 a% ~* _( k, d. v- Q
************ LABCENTER ELECTRONICS ************ * b/ q$ ^2 y( o3 v1 y6 h
************ Proteus VSM Sample Design Code ************
/ J/ e& X$ H) j7 \" @4 n) Z! Z) q+ {; G************ Integer Calculator ( 2K Code Limit) ************: i' y6 o" Z7 K* M
*******************************************************************************/
2 F; }, g" n w; {# V0 c4 G
: W5 q9 e4 i) _
6 h9 [2 {2 e, X: R1 GNAME KEYPAD- A H K- F6 y) L
; This routine will read a character press from the keypad and return it in R7.
U' o3 X' V1 y: \' Q- k3 `! ]! T/ z( T8 a+ X6 k4 D8 g% Q
5 V, ]0 G, \* h1 ^, d;Set up Segments for the Input Routine - No parameters.- I4 j# j/ \5 j
?PR?input?KEYPAD SEGMENT CODE! d. ]1 Z% s+ L0 ]: b) y( [
PUBLIC input9 g: C) }/ `8 W
?DT?input?KEYPAD SEGMENT DATA$ j: u' Y. C: q$ x
7 J" P V o5 D" \) P& }! S; ^/ ]
% a" q; U7 O ~ F I$ S7 KRSEG ?DT?input?KEYPAD ; Local Variable Segment for Output Routine./ x0 g+ I' N3 x! T5 V: \* L4 f
3 e+ b2 k! [0 _ a q; i2 S" E* A8 ^1 e z5 ]: Y" d' e% r
KEY_ROW1 equ 0EFh
- J6 p# D( d5 Q! G3 Y6 Q; i5 ?4 HKEY_ROW2 equ 0DFh
2 c# Z5 d+ K4 `4 k8 pKEY_ROW3 equ 0BFh. Y" P7 @* r( h L- i
KEY_ROW4 equ 07Fh8 r# r0 p0 P: c+ S
4 }& G% P M2 ?8 K4 y+ f* S g2 _. _
5 G7 \/ H% x$ {# q* g/ Kkeyflags: ds 16
# u" A& s) D* r, M' D1 F4 N# j7 {" G+ W7 h8 y% K' Z
! B9 N7 I7 W% {$ l0 N `
RSEG ?PR?input?KEYPAD ; Code Segment for Output Routine.
. h8 x1 _( [6 Z" E' M3 einput:
' W6 J: H. x9 V" P% n
: N% O" K1 o3 a% [# y0 b: ~- m2 K, p9 B; b5 j9 p# n0 P
keyscan:push DPH$ X/ Z" a3 y/ u, Q4 L
push DPL
( H6 K! R/ s, O 4 L! B9 o! m# t& t
mov R0,#keyflags ; R0 addresses the key toggle bytes
' x5 o; e" q$ x mov R1,#KEY_ROW1 ; R1 address the keyboard row address
. o8 Z$ n7 q" S( h: _9 Z mov R2,#4 ; R2 counts rows" {0 {$ [4 P! W. M
ksrow: mov P2,R1 ; Set row address to port P2
8 C1 ~* \# v- `) |6 n" L$ t nop, [: M* ?* k3 n
mov A,P1 ; Read column data from port P1
; o9 f4 S I. Z mov R3,#4 ; R3 counts keys per row+ o$ I/ o) e0 `: w( I
anl A,#3Fh+ E' j; F% o, q9 N
ks0: rrc A ; Move next bit into carry
; @: e2 ^ @% d# p( } V$ T/ R mov R4,A ; R4 preserves the row data
' p' z1 f) g* l u jc ks1 ; Jump if key not pressed5 A. R) Y# }! d, n3 o1 q) u: B
mov A,@R0 ; Test if key already pressed
0 _5 D) G+ E+ F mov @R0,#1 ; Flag pressed anyway
1 J) z8 d: N8 \0 | jz ksnew ; Jump if key newly pressed+ \8 E* D# `7 j h
jmp ks2
6 } a9 f- l! H5 ~3 c, [% P9 Lks1: mov @R0,#0 ; Flag key as not pressed
, L& s/ r/ `8 }% p% iks2: inc R0 ; Loop for next key in this row$ P5 f4 Z( B4 e6 }9 O
mov A,R4" z* X& T" T7 i% Q$ B
djnz R3,ks0
! R A# j/ {! f. @1 E9 ]2 k
1 ^8 K" h+ Q: s& N+ Q( s. b9 a! l# n/ H ~( l
mov A,R1 ; Jiggle R1 to address next row
( ~8 ~7 i' c, K rl A c+ O+ `8 c- s. D1 R) C
mov R1,A
# D" s, K- y2 P5 R2 _9 w djnz R2,ksrow P6 {% k+ {( v9 E
5 A/ {: C4 K6 L: J( o( K0 D. Y7 _- M: S3 n% M- J
clr A
9 `% ?& P8 P y mov R7,A ; Return zero - no (new) key press. ' y2 Q% L6 w* N4 v+ c8 f
jmp ksend5 [" G0 ]4 q5 W3 u
3 A8 F `8 R! D; X5 b7 M+ Lksnew: mov DPTR,#keycodes ; We've found a new key since last time:
! D) l: r3 H/ @. O2 _ mov A,R0 ; The key flag address (ordinal) is in R0" n6 w0 _) m1 z1 c
clr C
! j- \+ {: U8 e6 S1 a% h+ [- E subb A,#keyflags4 m8 Q( {2 _; |% @0 b
movc A,@A+DPTR* I! i/ X3 p- b2 r6 a+ F
mov R7,A ; Move the Key into R7 to be returned.
) s# M( z6 z0 F. Mksend: mov P2,#0FFh& q! t- ?; ]6 F/ W& K! _. c7 h
pop DPL
0 m2 t+ R3 G& p- B4 C( [ pop DPH0 i* l9 z0 [& o4 i7 n* a
ret0 F) |3 u! d1 E7 o# q2 x% ]1 A! Y/ l: g
5 `. l, g" ~3 B0 M) L4 o/ J K
) N; s2 f% S# W# ^2 g2 r. L* @;Data tables for returned row bits* M3 c7 j! D9 @; B$ Z) ?7 w1 q
keycodes:
7 l7 C" Y: {0 q5 \$ w db '7','8','9', '/'
# v" d. z( C; e$ v db '4','5','6', '*'
* h# b3 |* Q* R, T db '1','2','3', '-'
! ~- D% D1 J! P6 E7 w* H db 'C','0','=', '+'7 e# z( W2 D( z7 f0 B
t: Z* q( {7 U: G2 F
0 a: k# }. |! ], H# H! a5 q$ x3 o END( I! x4 }, J- a% Y2 e9 g3 r. m
' y0 M% g+ l/ M% v+ u7 g. n完整源码和仿真工程文件下载:
8 p; e2 O- Z0 E Q% P1 @; C% N- ~/ r$ Q* S4 K) I
3 `( ^0 U0 G6 T* L- D- [7 v |
|