|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
51单片机仿真计算器 lcd1602液晶显示$ z! h# d6 v3 d7 C3 X7 ]
8 Y t) f* E$ E* ]; S) `; D! `+ r
: u1 N; i, s: f8 ~51单片机仿真计算器是用lcd1602液晶来显示的. l7 C" Z' F$ } O" o$ ~
6 C; o! p' M! Y- o7 F- d8 e
1 @$ }& }' ^* B- O5 g) c$ Z0 \单片机源程序:3 q- z: w; W$ ~: M& D
#include <reg51.h>5 B# l( l! `5 H$ r2 u1 g% k
#include <stdio.h>) ^5 }! h5 M: l
#include <stdlib.h>
9 ~' D: l& J+ O- S& `#include <string.h>
, x$ D, p: B, y1 I. d5 c6 B#include <math.h>
+ m# d# X7 h$ ~ I) N& x t6 X' f#define uint unsigned int 0 _4 F8 ?, g1 O. y. v6 d6 Q
#define uchar unsigned char/ {/ z/ ]% K J2 `3 F3 y& |
sbit pinRS=P2^0;9 A3 h# @+ ]' G9 T( L
sbit pinRW=P2^1;
1 p: R$ J& ]% I6 usbit pinE=P2^2;7 `0 w, ?6 \. G$ R+ R/ R9 c( B
#define pindata P00 A4 ]8 E! I+ o& w- R
#define clearscreen() writeinstruc(0x01)
8 i+ G; j0 R3 ?+ C- r#define cursorreturn() writeinstruc(0x02)1 f6 g0 [- s% v V8 ]
#define inputmode(temp) writeinstruc(temp)
' L4 d, \2 [! `' U//temp取值如下:. Y4 F D" B) K# D( l
//0x04:减量方式,不移位
1 ]5 m& h, B* t1 c; v( s//0x05:减量方式,移位- m) C/ e! P" _
//0x06:增量方式,不移位
* U- M/ [+ n5 ?//0x07:增量方式,移位3 P$ n2 M$ @8 i) v: `8 \1 k
#define dispcontrol(temp) writeinstruc(temp)
' S- } _0 K: t4 @1 b j//temp取值如下:: s/ Z3 h6 Z( t5 g7 O3 j" R
//0x08:显示关,光标关,闪烁关* ~9 P2 {3 |, N1 N! T) [
//0x0c:显示关,光标关,闪烁关
+ C2 B: E# }8 u* ?2 k. v//0x0d:显示开,光标关,闪烁开4 I" p6 E6 x- W7 k
//0x0e:显示开,光标开,闪烁关$ \( s. z' {; Q. I b) O' C
//0x0f:显示开,光标开,闪烁开
% g$ G" c( \5 e8 W7 U! r! G8 o#define dispshift(temp) writeinstruc(temp), R+ x! P- H' o6 _- V5 D- E
//temp取值如下:
! I( P [% M& ^6 N//0x10:光标左移
; ~$ h8 v' ^1 R/ N//0x14:光标右移
( T4 B' L: R: Q2 p//0x18:显示整体左移
& `& {) W( d e Y) \//0x1c:显示整体右移7 U5 ^, |) d: k7 y$ Z2 C
#define functionset(temp) writeinstruc(temp)6 u, ]# r' S% r4 u# |) a" V
//temp取值如下:
* A$ P( _' A) o1 Z! o* Z% G//0x20:4位,1行,5*7
1 x: ` U, a$ c; a//0x24:4位,1行,5*107 q P' Q1 P, h7 z1 _
//0x28:4位,2行,5*7" X% \$ S/ ~4 z+ A) F- h d# ]
//0x2c:4位,2行,5*10
; ?, I v& Z% Z s6 Y9 \//0x30:8位,1行,5*7. r$ L0 R# k# @# C% }1 I& F$ A/ I
//0x34:8位,1行,5*10
7 H( T7 f' c- Z; k//0x38:8位,2行,5*7
; k% j0 W$ X6 r//0x3c:8位,2行,5*10
g& ]6 Y# C6 j+ h5 l+ z#define setCGRAM_Add(address) writeinstruc(0x40|address)
0 v, x, b# }; V" k#define setDDRAM_Add(address) writeinstruc(0x80|address)//短延时7 L/ ^# C2 f2 u3 p8 a! E
//void shortdelay(uchar i); C- D3 C0 w, P+ ], [ T
//长延时
. Q& L/ x+ l) c" X, ^//void longdelay(uint i);
0 C: ]. P m/ ~- N( j0 i//P2口初始化
# D- V, H8 \: Q& v ^4 X+ Y9 O1 v//void initP2(bit i);+ S6 _/ [' w3 x8 Y! L3 s
//寄存器选择信号5 ~0 P3 t3 {. Z! g
//void setRS(bit i);
9 ?/ P u; a6 x$ n0 B6 F//读写操作控制
9 [. G) q& ]( p; a1 ?' u//void setRW(bit i);
6 l5 f! l) g1 [//使能信号% Q0 [9 Z/ T7 a% ^
//void setE(bit i);
% g5 `4 {8 |; b1 a Q. G//读BF以及AC的值/ l; x$ o9 Q2 {$ T- e
//uint read_BF_AC();
9 e* P- }' d. Y6 J8 h a6 a//判忙) s3 N9 U5 j2 P) k
//bit statuscheck();) r# }+ [8 a. `8 t- _
//写指令函数
- J5 T" _" j6 m//void writeinstruc(uint instruc);
4 l" u3 v# v+ E# T& y//写数据到RAM0 e; b/ H& _5 i6 U: W
//void writedata(uint data1);& p. r$ T$ [# Q% o, U& M
//从RAM中读数据函数# k# q4 V6 p1 W, N( e0 h0 V4 k9 l
//uint readdata(void);( a0 ~0 N* g f, o3 X# _: |9 V u7 o8 ?
//显示程序 X为行号,Y为列号,date为要显示的数据" ~6 h( i8 f. c" H3 J5 H2 K
//void dispcharacter(int x,uint y,uint data1);3 ]& J! T+ X: Q7 {- b0 h8 F
//LCD复位函数, T4 f) w0 o+ e( Y8 ?4 ?
//void LCDreset();
4 j- U: P0 A1 n4 C' j#define uchar unsigned char) x& _7 Q5 W( @2 T) q# t. L+ S
uchar k=0,result1;
2 C+ h4 V e9 a5 i! cvoid shortdelay(uchar i)//短延时
# J9 w7 n$ o% h9 Z. y{
$ ]- K0 P% Q+ X0 o) M1 p/ h2 |for(;i>0;i--); f5 E. ?( I x
}
4 ~0 `# u) {/ k6 |3 U1 R//长延时
/ {# X1 h V7 e1 D+ R' \void longdelay(uint i)
+ m7 v y' `' f5 s2 l& C{- h# q6 I& i. F6 `
uint j;
2 E$ m- U/ @9 k) [for(;i>0;i--)+ s8 Q. j/ A# R2 x$ r; M
{for(j=100;j>0;j--);}
" u5 h/ \- K" v}- d% I: f1 A+ D1 |8 N
//延时程序2 A1 ^) _3 D& p2 w8 k
void delay(int i)# f. S6 L' _7 [7 B
{int j;
/ ~- `4 d( r$ N* Sfor(;i>0;i--)% E+ f$ P: e7 R$ x4 V5 }: K! v& e$ O9 }
for(j=0;j<100;j++);* U4 ^: W9 l( Z; E; W
}
" p( [" N0 { P3 R( m& {//初试状态
( |$ }) H+ {# U% W/ U9 z* B1 R' nvoid io_init()
) d3 J9 ^8 p. X! i' g{P1=0xff;, u" y% w! J. ?
}
7 {6 L$ G; P( P) ? \//?---------------------------键盘扫描部分-----------------------------//0 ], ~6 R4 @, ]( y
unsigned char key_scan()
: ^, W6 E7 r$ {. a3 K) N6 w2 T{ unsigned char key;( {0 R( y- t! h/ C5 L; l+ F
unsigned char temp;
' `. e) u0 i! x& d( B. |# | uint flag;3 Y7 x9 h& R& P4 n2 }5 a
io_init();
% x/ M0 ?5 ]& c8 k$ p4 u1 z3 b7 V P1=0xf0;7 u1 M6 h. |1 ] U; S* ]+ R: y! V
flag=0;
3 @7 y4 r0 t" `6 q. e! W3 L2 aloop: temp=P1^0xf0;. K6 o3 C9 `- k' Z: ^; g. S3 v* k
while(temp)
- a. ? F: F" @ {7 Y5 F5 j$ z! V8 R2 [" J- x
P1=0xfe;
- e) p7 e) P. q1 A9 [- H$ B: F" l delay(1);- J0 H X0 c" m
if((P1&0xfe)!=0xfe)
1 S- Z- H% v7 I1 G1 V: x switch(P1)( v# D7 m! w0 ?6 g- q
{& C% @: i( f3 W& _
case 0xee: key=0x11;flag=1;break;//读7键和值! r- i, E) d3 o( v }+ r
case 0xde: key=0x12;flag=1;break;2 j8 j3 i& n3 s3 c2 \# [" l- B4 i
case 0xbe: key=0x13;flag=1;break;$ d0 ?" W _; N& s7 L4 L, l
case 0x7e: key=0x14;flag=1;break;//读除键的值5 y8 W, g/ {, l7 ^
}! `* U; D/ M% ~5 z. z
if(flag)
& z9 v% b3 G; B( }6 ]) f goto exit;, {$ h" Y2 h! @+ X2 t. M
else
- N; Y, ?) U+ g5 ^, d P1=0xfd;
, J* l5 z( X' T' r: M( H* h- p delay(1);
* \6 f c8 q# c# a. p2 L* U% t if((P1&0xfd)!=0xfd)
4 G2 B: Y$ B1 Y) M; P switch(P1)! u7 c8 t9 N8 u
{6 A, A+ D( V: R6 n5 D k: J
case 0xed: key=0x21;flag=1;break;
( x) b8 ?4 i$ Z case 0xdd: key=0x22;flag=1;break;
# [- {4 V) Z% ?/ E$ p' [" G/ i case 0xbd: key=0x23;flag=1;break;
8 H7 ]! B- K' b3 {* ]; M) I3 A/ J case 0x7d: key=0x24;flag=1;break; //读4到乘的键值( D! d. d/ o" [; J- r3 k
}* A6 v) V9 j/ s4 w
if(flag)( t2 d5 o& k* |: J( [/ A
goto exit;$ V: {( u3 D( J- Q
else5 d! G/ s- r3 `. B# j+ S
P1=0xfb;
( G8 o# _4 V% ~) w) i: D delay(1);. u! b( k0 _4 w" N- i
if((P1&0xfb)!=0xfb)
8 X+ s6 v5 x5 T R switch(P1)! a" G/ _1 e5 M1 {2 \
{
; Q5 Z# v& {! Y# Z+ [ case 0xeb: key=0x31;flag=1;break;5 f& s* C0 t' [7 \: T6 C
case 0xdb: key=0x32;flag=1;break;1 ^. T) ?! ]3 B; j
case 0xbb: key=0x33;flag=1;break;
7 F0 L7 W: P# s4 g case 0x7b: key=0x34;flag=1;break;//读1到减的键值1 S+ b3 A, |/ B# W
} G: \0 p/ g1 _' ~; N
if(flag)& f9 `1 O4 T J
goto exit;
" B1 U* G8 ^% D: P) y, w1 S# P( v else# x2 K; L! H3 Z0 D) k% _. U
P1=0xf7;" m" z9 I: r2 ^$ u5 ?6 W- x! B/ Y
delay(1);
3 s4 v& u% }& |+ W- m/ X {' ~8 u if((P1&0xf7)!=0xf7)$ m) I9 r( B% w8 }" ^* r+ c
switch(P1)2 D( p& K) l, T T; d$ u
{) B3 g# D; A7 i( m- N
case 0xe7: key=0x41;flag=1;break;//后退- g0 M" S2 r6 J
case 0xd7: key=0x42;flag=1;break;//0
; T$ s8 u8 u. K/ g6 C0 r/ Q5 O case 0xb7: key=0x43;flag=1;break;//等于
$ V3 H6 b% t. d$ E case 0x77: key=0x44;flag=1;break;//加
9 h( |* U# ^( _; T0 A8 a3 p: P }
$ c9 d6 R& _# W* Z" u+ l: O- U
6 Z: P% l5 I1 L. h+ \exit: return key;
& Q c4 C% w# w8 @ }# }. c9 x4 Y, T
if(temp==0)4 w+ N I q5 _$ M& |9 M; K
goto loop;5 \8 R7 b" Z+ L0 S
}
9 d( H o3 }4 T" }3 ]! k, t//---------------------------------键盘扫描完--------------------------------------------// V* h' W2 R" E: T
//---------------------------------显示初始化?----------------------------------------//
7 n o( m- U& j//P0口初始化
- o, t3 I& D" X$ s9 [$ _void initpindata(bit i)2 S2 G( k2 c8 K0 F& @$ Z) {
{
& E3 H3 f8 P6 b2 A2 }- wif(i==1) pindata=0xff;
% K" I u, w5 W' U! d Y+ f/ celse pindata=0X00;
) S: g3 i- L- M( H* s' j}$ H. g V$ {' ?4 T4 i$ I: J! y
//寄存器选择信号9 C3 Y; e! }" Z. M: i* M+ E( u$ @
void setRS(bit i): u! k3 B T! D9 N7 V
{! {" C" r$ m' g+ B) x7 \. `
if(i==1) pinRS=1;
' I4 F9 V# X, {1 Q; O4 l, e7 ~else pinRS=0;, ^) x1 J6 F! A! t" B+ g* o @. T
}
; x+ x* a6 V5 t//读写操作控制
7 Q* W, z) v* w* }. B s/ A, Lvoid setRW(bit i)- p5 N! V/ ~6 Z) H
{. r6 W1 p9 Z$ E% K- w( k8 P2 f
if(i==1) pinRW=1;: w, s' j6 X9 M8 |9 S% g
else pinRW=0;
# v# R" r8 ]4 O7 }- T: y' n}
& o; R W. u: k//使能信号- \5 i5 ^% g6 S2 i5 R
void setE(bit i)
" |3 `! b a* c5 B2 k5 k1 }- e+ ?{
, u6 m" ~ |# I4 R1 Wif(i==1) pinE=1;& U1 b4 h1 w: u1 k$ x7 X/ `
else pinE=0;
2 |6 Z0 z2 j! q& l. h4 [}8 `% F) i2 @" c) Z! `
//读BF以及AC的值# B3 ?) {# k" n5 R: X
uint read_BF_AC()
% Y$ y8 i0 N% Y% Z{5 z! ^4 z+ D8 |1 S2 |( n% Y* t+ |& ~
uint temp;, t2 g* M8 f( H6 ^
initpindata(1);1 O% G T) @6 M+ g
setRS(0);6 l' @* @/ C6 [' V+ E3 f
setRW(1);2 l) i; z9 W2 c2 m
setE(1);
1 f# b/ A# j/ `' Bshortdelay(1);% D( E9 L9 ]6 X
temp=pindata;; w( f1 ^6 R! H5 F d% ?) ^
shortdelay(10);* L+ {' D0 z0 k
setE(0);
& ^& r0 _6 _1 I {: e. |5 e6 Dreturn(temp);
+ \1 ?3 [) m1 C5 z* g}9 I" G* v) H4 k" k, G% B& B0 Q ~2 ]
//判忙6 `9 C5 P/ y5 m
bit statuscheck()7 C; T' L1 E) y8 p
{9 u8 K$ L) F# W
return((bit)(read_BF_AC()&0x80));
8 S: ~. ]7 ]# ?, g4 q}8 v3 U J, f2 a( a$ }
//写指令函数
. P- @5 K7 G$ ]5 Z! q' _ d- ovoid writeinstruc(uint instruc)
1 R( t. K3 J7 ~' X# h9 r{
& i/ R. I$ w+ ~while(statuscheck());+ q g9 o' Q9 p. L5 ]
initpindata(0);( H/ C$ z2 G' h" F, q6 l# v
setRS(0);6 ~, I7 ?$ i; @( i+ F
setRW(0);) R- y3 ?# V; y: C& c% n
setE(0);7 k( D3 L4 D; G6 R; o3 h" \
pindata=instruc;
) Q8 D: W8 O% a8 T$ b//short delay(1);
; ~# q8 @+ @. \% `, VsetE(1);
# |5 d+ t# X/ S1 Q8 Z8 kshortdelay(10);
0 l+ F2 T* I" Z2 R) u* \& j, UsetE(0);
& h" U% K. U4 l, i}3 P9 C1 z" m' e, t- x0 P6 }
//写数据到RAM i3 h# z+ U; x+ D4 [7 I
void writedata(uint data1)# n/ I% p9 d. U. ^0 L
{' ?* J' l( A% ~- l% m/ y; F
initpindata(0);$ v! w: ~2 m& y
setRS(1);: B; P; e7 i$ E$ B
setRW(0);
0 C! h: S" d8 ?/ v0 lsetE(0);/ L6 S. m1 J2 {( P$ f
pindata=data1;
( k6 I3 I7 j( M8 \" E% bsetE(1);
% N1 {1 W$ N7 lshortdelay(10);$ H; ?0 I: l' d2 B6 p5 M5 A& N! S
setE(0);9 W2 I' ^& ]# n9 {( T0 t4 p
}% o* y0 |# i( v! k0 \5 i
//从RAM中读数据函数
5 _/ ]2 W1 U% e6 ?- o" r2 S) Guint readdata(void)
# A9 Z5 r5 r6 K8 C6 i{* t0 h3 \; W+ V6 ~ S. o
uint temp; z8 b% S6 f p, a) `/ `' \" \
initpindata(1);; u# ]# a$ c. X+ x+ p+ m
setRS(1);
1 X7 j5 C0 }- D9 A, Q) LsetRW(1);
4 s. q; L) r* p! P: |setE(1);
. C. ~- M* q/ e* xshortdelay(1);; ]% j6 R2 M* }8 [1 G
temp=pindata;
. O/ f2 T) p+ s6 c/ t) C& p2 Hshortdelay(10);* |& ?& r6 l) Q* W: X V* S' x
setE(0);
1 [1 t6 B+ e6 e8 X# Greturn(temp);* T% R, h0 Y: L _/ X! _. t- p4 j1 J
}
+ u7 U/ ]8 x- H. [" n$ P1 |$ P//显示程序 X为行号,Y为列号,date为要显示的数据
: G$ l/ _% k$ G: H0 r3 _void dispcharacter(int x,uint y,uint data1)/ m/ H1 x% B# P( @9 e
{
# Y8 @* M' W5 e2 L3 R( nuint temp;/ C' I) f. I P6 m
while(statuscheck());# S' K; [" D1 o. g
temp=y&0x0f;# ~& B$ i/ o" a3 I3 E8 i$ [
x&=0x01;
9 o: f( k- G6 Vif(x) temp|=0x40;
- z9 g0 ~" ^7 C A# E+ ^+ ]1 `- `9 RsetDDRAM_Add(temp);
: _/ B- ^+ |2 O' Pwritedata(data1);
% x0 L5 |, ^) d; p// writedata(data1);
# G$ t1 Q4 _- j& C6 r}) a( K/ r0 @/ _; @3 I
//LCD复位函数
+ n: p- D" L5 P5 w, Fvoid LCDreset()8 k- N# {8 A7 F
{4 ], j. t; Z- l% @; X% P
clearscreen();
, T* u) ^1 ?. h! Mcursorreturn();
% ~2 F* M) [( O, a6 J7 u}/ f' U5 `. L1 a4 N8 }
//LCD初始化
1 L0 l/ L% q6 q6 R. b" S! vvoid initLCD()
5 \7 z' C' S, t* g{! r x& o8 a2 V |' [4 I) R- s5 J
LCDreset();
2 {; t9 S$ R9 finputmode(0x06);//增量方式,不移位
, P Q6 g; q5 n0 n$ n. ydispcontrol(0x0c);//显示开,光标关,闪烁关4 L; |. w- k1 g3 _% r2 @$ j" W
functionset(0x38);//8位,2行,5*78 ?( r' i9 [% ]$ V" ]1 |
}
8 S" F, t2 h: r/ P2 |2 \! o8 d C) y//-----------------------------------准备工作完成-----------------------------------//) @( K" w, `8 \# B/ _3 X1 b7 g
//-----------------------------------计算器-----------------------------------------//6 r) y: J0 r5 C5 c0 }# J
compute(char key1,i): E7 G3 e% e! V7 g" j- G. U
{
: x! Z7 q: R$ b" Nsigned char m,n,c,act;# J+ m) t/ N8 A2 H- v) [
long int num1,num2,result;
3 |& H! e! M! `" N9 rsigned char str[4][4]={{'7','8','9','/'},
% m( h6 w4 d! ^6 ?! c2 [8 @2 I {'4','5','6','*'},
1 o+ O0 L6 H" H/ B' R {'1','2','3','-'},7 F+ Y. U: ~$ D1 X2 k
{'c','0','=','+'}}; R& J+ U$ e9 s8 M/ ]$ x" F5 U
signed char str1[11],string1[2];
# p/ ] u, ?1 [: ^9 U$ Nm=(key1&0xf0);
' h8 e9 `) k9 s7 Y' Y6 I5 am=m/16;
5 x$ x0 u1 k: [7 x6 _3 `m=m-1;
$ q, G( \( }, B( n" un=key1&0x0f;7 z# a- E) {, x+ [2 q" _
n=n-1;
5 m4 M: w6 v; g3 q$ ic=str[m][n];
@; B( R0 U, H& J4 c6 q: Nsprintf(string1,"%c",c);
- R' f$ o& S0 r$ `( vstrcat(str1,string1);, C% Q. a R; y Z6 l, K9 R/ F
if((c=='+')||(c=='-')||(c=='*')||(c=='/'))
* D6 b( H! Z' S) ^& g{/ D; s8 B3 I' m
act=c;5 U; G1 c: S2 z: _4 ~+ q. P
num1=atoi(str1);
' b0 W5 Q' E* }* H+ u9 p4 Q1 Imemset(str1,0,11);# h7 [3 I4 M& {4 k ]1 {2 s- N' h+ M, X' I
memset(string1,0,2);8 w, N& T* b1 b+ Z+ p( D) ~* S4 {
}
- l7 i* s2 t+ w2 r- rif(c=='=')
# _. e: B" n: p: w{2 J: Y3 ]8 u7 i4 K# @ e! _3 D
num2=atoi(str1);" X4 ~$ A. D" x9 I8 p# S
) t, X; Y% n6 @( J/ u# |+ H* f1 y4 J& ~
switch(act)
6 Z$ ^% J* U$ F7 R7 q0 f' m' i1 O{
- U) a* o9 K. S1 |0 j$ N/ Zcase'+':
' S: c. d: G3 x( ^+ D{ if(k==0)! E3 m x" W3 u- c7 b. }
{result=num1+num2;k++;break;}2 s0 Q3 _& k5 w/ l9 @! ~
else
) {& Z1 Z! O6 O4 S8 b {result+=num2;k++;break;}( O" w; ] q3 z+ E( t
}
, @: z0 H8 g. l% ncase'-':
0 @ }' v$ k" ]8 ?4 J& L# A7 h {if(k==0)
- v- _2 D4 D, I+ d {result=num1-num2;k++;break;}* b; N5 m2 e* M1 ?2 ~/ R8 T4 d
else% x1 H) A: k; V4 e% X! g
{result-=num2;k++;break;}7 d7 l% M6 N6 c
}3 R7 n1 r5 Y7 K, q& q+ n
case'*':
: S7 z! [- o$ Q% U( q! X4 h{if(k==0)
7 c2 K2 r2 v2 w$ t {result=num1*num2;k++;break;}) W% K: a* s4 Q$ C+ U3 v0 \. r1 x
else6 z9 S1 d( A5 Z* ]" |9 O
{result*=num2;k++;break;}
" }1 ~2 j+ G3 Q3 Q, h }
1 @/ A9 K* d2 F" G+ [- Dcase'/':' z' n/ E! L( Q/ u" T" A
{if(k==0)
, Y; K! T' G& u e U+ B/ u, l {result=num1/num2;k++;break;}
( }9 E# }* _. I9 Q/ V! [1 G, O else
# g. h. E: i* n! {; |0 b { result/=num2;k++;break;}% v2 E1 \) U. J1 b% J2 P
}2 E% l+ q4 u7 Z3 i( Q
}
2 P) H. j. D6 Q. E, P9 V}
: U2 R6 l& L2 ^6 m, N# k/ rif(c=='c')
& r" d+ l6 e+ s{! ?; r3 i6 k* ^: G* J
act=0;
- ^; s* m, E0 n; C/ q3 F- cnum1=str1[0];
' ^& a9 Y( s* N d. x9 jnum1=str1[8];. j+ T: z6 o, `; p$ \5 f
memset(str1,0,11);
9 \, k0 I' V, w. m; Mmemset(string1,0,2);
) p- F+ m: f% J# i3 U# o, e3 bnum1=str1[0];& l! q3 l: \& _7 |/ l$ h% }0 U
num1=str1[8];4 ?* c" f4 v9 k+ f2 l# ]
k=0;
; P( S# H* s: E( M$ E7 c" R9 i}% Y2 N8 m8 A/ t4 r' N0 U7 h
longdelay(350);* V( l1 M$ z) U
switch(key1) //显示部分, L) o T* e: H* Z% r
{case 0x11: dispcharacter(0,i,'7');i++;break;+ l+ X7 d/ K8 h+ \/ e" T) |
case 0x12: dispcharacter(0,i,'8');i++; break;4 G# |) l- b! `% P) ]& G
case 0x13: dispcharacter(0,i,'9');i++; break;
8 ^2 u2 b! _+ t3 a4 {2 ocase 0x14: dispcharacter(0,i,'/');i++;break;2 C" o9 T( a: ` J, g
case 0x21: dispcharacter(0,i,'4');i++;break;
2 z- r8 c2 O3 V5 h" G. e( Bcase 0x22: dispcharacter(0,i,'5');i++;break;
- ?2 i7 N1 F+ X& q1 w$ l( d& v' Ocase 0x23: dispcharacter(0,i,'6');i++;break;# ^- g% x1 X3 a6 z+ J% _+ J6 w& v" O
case 0x24: dispcharacter(0,i,'*');i++;break;
4 ]" ~& [& R8 W# }8 K5 Mcase 0x31: dispcharacter(0,i,'1');i++;break;
4 M& O: M; }( i9 u$ z' }' Lcase 0x32: dispcharacter(0,i,'2');i++;break;2 p' ~; d/ X& A2 Z
case 0x33: dispcharacter(0,i,'3');i++;break;
7 ?& I" ~' s5 ^' O% n' Jcase 0x34: dispcharacter(0,i,'-');i++;break;& O, e# Z7 n/ {
case 0x41: clearscreen(); break;
) r; z) f- d: q1 Xcase 0x42: dispcharacter(0,i,'0');i++;break;
+ Q8 W/ Z# T! q4 R5 Z* ]! ]+ qcase 0x43: dispcharacter(0,i,'=');i++;
- _. t3 b7 s; \4 V: V m=result/10000;- @# P l+ U2 S- Y3 t% _
result1=result%10000;
. Q1 h# x Y* i# d2 ? if(m!=0||result==0); W5 b" j* ?; c6 f- z/ {
{& R, p. T& u4 j
n=0;
7 |3 R- g5 ]; N- K# P m=m+'0';
7 T0 i- |8 K5 [' @( y dispcharacter(0,i,m);i++;" c4 h# g# q$ Q3 O
}
5 u$ j3 D7 Y5 i0 [' e m=result1/1000;
/ T( m7 Y+ N! w1 [1 d( I result1=result1%1000;
+ [: v/ @- {1 p. m' F3 Y: B if(m!=0||n==0)
, r* }- \9 g% K" F/ W4 V {
7 U* ` p0 h5 N9 S0 d W" t9 | m=m+'0';
9 w) J& a2 R' H6 Z6 r5 B n=0;, x5 D! {% S: ^! k$ b8 i5 S4 ^. M
dispcharacter(0,i,m);i++;
6 O( N- N# b8 V" O/ E# Q }
8 Y2 s4 P4 }* V8 G+ H5 ? m=result1/100;
; d6 @ V: B+ P$ `4 J result1=result1%100;
2 y0 Z5 s5 _! C U; p2 W if(m!=0||n==0)
; t, g/ l4 r7 l) |- b- b {4 B& A) L0 r1 I% }8 a5 Y
m=m+'0';
" X% G G- w. _* h3 r n=0;
# ], ^1 E+ Q' _$ @6 K4 J dispcharacter(0,i,m);i++;
+ s- p% y) ^: H9 s }
f% v" j% i: j m=result1/10;
; |* j8 q0 _, p& R! }3 E result1=result1%10;) A7 f: g( p; ?- m( W# r
if(m!=0||n==0)
Z! Z0 |# x1 f0 H9 x3 q {, D8 c( O# [" P: u/ s1 I. R/ |9 \
m=m+'0';
6 X0 c- j/ p. s! l& t/ r4 [) p n=0;5 X, n- S8 U) Z! N9 j) W
dispcharacter(0,i,m);i++;
) k1 W+ {9 [" c }
# k: U: P) M. q3 s m=result1;
" Q! m( K& v. F: D if(m!=0||n==0)/ D$ V( B; ` J6 J0 v2 h
m=m+'0';
" L( W+ m% f+ M1 i dispcharacter(0,i,m);i++;break;1 b6 j# ~# f1 J9 b) W6 s: W
case 0x44: dispcharacter(0,i,'+');i++;break;- Z0 V) C: s- g8 `* \* b& X
}0 f7 H s- N+ z
return(i);
8 O& @1 H& ~+ v z! L}
7 e! ]# I+ L" n# F5 v9 W z0 A0 q//---------------------------------------------------------------------------------//
: u6 m6 b, Z+ I( @//-------------------------------------主函数---------------------------------------//
$ B1 q5 Y# W- ~, Rvoid main()+ n$ C% c* u9 X! G) k
{
; }4 k j3 Z! D6 k; |char key1,i;
, }2 E# p0 [" |1 W$ @ Ystart:initpindata(0);. g o! h: G" u. R3 _, R
P2=0X00;5 X2 M8 t$ C4 n9 S
initLCD();+ x8 y) o" }: J) p( T
i=0;
( H2 l' e: ^) d E" Kscan:key1=key_scan();* F \2 a0 L# m3 o& K6 I" V
i=compute(key1,i);
( M% s5 E6 ~# o& c# h; Y- M0 n' k1 |" Xif(key1==0x41)
9 f' x, Y1 _5 Vgoto start;
( V. x* `* \0 i0 h9 Z5 ielse % U& r1 ]/ M" c) p4 y
goto scan;. w; i9 d2 M' D5 }4 [; ^+ i8 p
}
% X: q& \2 V5 p5 [+ B+ O4 l! O5 g* \% V& H' d! m/ L; [
单片机计算器仿真工程文件及其源程序下载:
- c# G5 }* F/ f( b
51单片机仿真计算器.rar
(202.58 KB, 下载次数: 2)
7 x: v4 G8 M$ g$ y( \% `7 @
4 O& j/ l2 k( O' V& ` |
|