|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
51单片机仿真计算器 lcd1602液晶显示
/ r% q* C. x3 v. s; k9 H, @3 }6 M; G
8 V% _1 W$ P- X7 l+ {51单片机仿真计算器是用lcd1602液晶来显示的' M3 O0 C& Y* l
* R, e" z6 ?' K
4 `: _4 L9 r' x* w! u% M
单片机源程序:0 I* f- M% P: d7 F6 o! T% B
#include <reg51.h>
& }- m* G+ e) M8 h r#include <stdio.h>9 t8 j, R6 x8 O9 g; I( n ^
#include <stdlib.h>3 b6 e2 j2 O' [
#include <string.h>" T, F5 r2 _( a/ y& \8 U9 |: M B
#include <math.h>
' x7 Q9 o$ V" [$ `7 F* }2 X#define uint unsigned int
, f$ {- G3 [- l' _& c/ U#define uchar unsigned char4 y m8 c4 x" R
sbit pinRS=P2^0;- E1 G& m4 {0 D- }. d2 a; O
sbit pinRW=P2^1;0 o' n. o4 O$ }* ~
sbit pinE=P2^2;
9 v' j) q& |/ n- ]7 N0 ?#define pindata P07 ]8 n4 e5 U8 o# H1 H
#define clearscreen() writeinstruc(0x01)' x3 E% N' p8 P0 C0 c9 q0 k
#define cursorreturn() writeinstruc(0x02)
5 P- f4 t+ A: @. F- c#define inputmode(temp) writeinstruc(temp)
, u* z2 o7 l2 O8 u$ n4 X# `# J! ~//temp取值如下:
3 a. J% p, j, J" X2 R9 _+ }7 d//0x04:减量方式,不移位
/ _( |. P; p4 L//0x05:减量方式,移位1 T" E1 F% ~2 Y; b) I$ f
//0x06:增量方式,不移位
% e; k& S8 b6 b. J9 l2 F//0x07:增量方式,移位9 R1 O- G& R2 |' G% Q/ @: a# Q
#define dispcontrol(temp) writeinstruc(temp)2 n- ^' G! h1 H: h& a
//temp取值如下:
% z3 b( o1 r o5 ^: V; W |( i. v+ J//0x08:显示关,光标关,闪烁关
- Y# E8 {- F; J. I5 @$ X& g" m//0x0c:显示关,光标关,闪烁关
~) C- D9 Q$ {$ K- }//0x0d:显示开,光标关,闪烁开
9 X4 k, F& Z) v: q X' |2 `6 Y//0x0e:显示开,光标开,闪烁关2 x) S7 u* M: m: H" H
//0x0f:显示开,光标开,闪烁开
* A- b2 ]# F a; Y, S* E. _4 y2 e#define dispshift(temp) writeinstruc(temp)
9 h1 _4 m* Y, J//temp取值如下:
" i+ Y f5 F8 M/ h' K//0x10:光标左移) H( d. h k" Z
//0x14:光标右移
: O3 A- b% X5 ?4 ]$ o! {1 G//0x18:显示整体左移* h4 |2 a! ?; i1 r/ I! \ I" i
//0x1c:显示整体右移
2 y" O6 m n* y2 o#define functionset(temp) writeinstruc(temp): @0 W# |* X; q; ~9 l1 b
//temp取值如下:
0 H8 {3 q# a* T) k# w0 S. Q//0x20:4位,1行,5*7' b" C. B2 x; Z; \5 P. ^
//0x24:4位,1行,5*10
7 l" M& t! D! K* f# G: n//0x28:4位,2行,5*7+ v# {2 n2 k% p! `4 l0 ]+ C1 @
//0x2c:4位,2行,5*10! o, C% F1 x5 M; _4 L9 n( }
//0x30:8位,1行,5*7
) d! n. N W+ g/ {/ j* b//0x34:8位,1行,5*10& R! P( l' B9 y& h! `5 V& `
//0x38:8位,2行,5*7
% {! u6 k2 E2 ]/ s//0x3c:8位,2行,5*10
0 f, Q& I% B- }9 F( ^/ v2 y! m; Z#define setCGRAM_Add(address) writeinstruc(0x40|address)
. d% e' p; v |7 V7 O#define setDDRAM_Add(address) writeinstruc(0x80|address)//短延时& B) g) ]) t# h: W1 Z* t3 H% U: h* ?
//void shortdelay(uchar i);
1 H/ [9 {" |& C//长延时0 ]$ T. Z$ P. q! P
//void longdelay(uint i);0 I: O9 D* X7 m1 j" h& U% |
//P2口初始化
4 F( a7 h5 v L$ Y; V/ F//void initP2(bit i);/ S2 N0 Q. r' H$ C( J- h; P
//寄存器选择信号
5 R: w' A; b* W) r! C6 }/ \7 r//void setRS(bit i);4 e- H+ l5 W8 o: T& }6 K
//读写操作控制. ?9 L7 C4 @& T. h
//void setRW(bit i);
, W' a. x' t* r$ g8 `! P2 `//使能信号
3 n8 O# X2 b% f0 F* G//void setE(bit i);
$ I: j% w5 F( d; L5 E//读BF以及AC的值# ] E! n, \+ |4 A# H9 ^
//uint read_BF_AC();
+ j- a, v, [8 m2 ^7 ^" |7 T7 q//判忙
9 f. a: g5 c A: M) D//bit statuscheck();
0 {' t& c* c' _( S- A//写指令函数# w, Y( g) x0 @4 ^" K
//void writeinstruc(uint instruc);
! V9 e8 Q$ t7 V; ]4 B% w6 k# l7 k//写数据到RAM
7 `/ m4 i; G. r, r; E//void writedata(uint data1);
& D4 C% o; N$ Q+ L3 m* s6 _8 y8 M! S//从RAM中读数据函数8 M0 L0 O* s# j8 \ V0 c
//uint readdata(void);
9 h: [) o+ ?7 E! U4 I2 p//显示程序 X为行号,Y为列号,date为要显示的数据
8 {, D% N+ }* |" W+ k% Z//void dispcharacter(int x,uint y,uint data1);
% W9 f$ d' Y: e//LCD复位函数
4 x2 |+ R, d" I* u7 C//void LCDreset();
( j/ q, O5 C k6 E J+ x/ q#define uchar unsigned char2 C- v) W2 Q8 ~$ Y
uchar k=0,result1;
2 j" g+ g6 ?8 j' a% Ivoid shortdelay(uchar i)//短延时. l# W& ]8 @: z9 Q( L1 E, m2 i
{! \0 _, G6 x4 y- T9 r
for(;i>0;i--);) j. L, j5 t7 i- ^- l$ Z* \
}; O5 ?6 f; D' z" M! c4 `& k
//长延时5 T2 f# c' P1 }
void longdelay(uint i)/ ~" N" k$ I( d3 |9 t
{
+ W B( y$ I, V0 P" A9 g- e/ Z4 C- xuint j;
0 u) M) ?0 e! L7 q4 y7 wfor(;i>0;i--)3 O4 p/ B( Q" M) m6 @
{for(j=100;j>0;j--);}7 c" [) T! ~4 O+ P% A9 z
}
8 [8 I$ O9 l" R1 P3 K* {$ d- ?//延时程序
3 \2 i! M! Z" @( L, B3 t# {void delay(int i)
. i" n7 E) a# d" l# I{int j;
( @+ _. Y2 V) y8 |7 |for(;i>0;i--)2 ]# M/ F& L% I& |) Z
for(j=0;j<100;j++);
H" _' G# r: c" y1 W0 c. D( [/ S}/ k% b4 Y6 p; L6 h! _) W# s
//初试状态" H* @5 k: Q: @2 u
void io_init()
" F" X+ @( Y5 z# U$ u+ O{P1=0xff;
9 m. v1 c0 e3 L" K" b/ ~}1 e2 I4 S. ~; M( d# ?
//?---------------------------键盘扫描部分-----------------------------/// C! I3 D/ D5 R! K' o
unsigned char key_scan(), w' x: G& y3 q1 R B: |
{ unsigned char key;$ T8 e9 T9 m2 @9 j, l$ y$ o
unsigned char temp;! \9 g8 C3 V3 r! @; l3 U
uint flag;9 z, w, J2 U# b% U g; P/ {
io_init();
/ L& m+ k3 k2 X: r P1=0xf0;9 C A9 V/ s% v: v5 o
flag=0;' j7 e' q4 K& P6 u; n1 Q+ }+ ^ e
loop: temp=P1^0xf0;8 E! z: E$ d+ W2 k/ m
while(temp)
. F+ U9 u) ?5 X/ b" i9 t' a {/ l# z$ @+ u! K0 x
P1=0xfe;
, f4 m; b. D' n delay(1);
0 d, Q& U. D2 X. Q4 i if((P1&0xfe)!=0xfe)! E; j) S) [. c2 y! o1 H
switch(P1)- y# B0 [( S* h, \' k7 R
{; j- i9 X) v0 e$ p! Y
case 0xee: key=0x11;flag=1;break;//读7键和值/ n6 I% b, @ {& f, k5 z
case 0xde: key=0x12;flag=1;break;
4 v8 d, g6 B4 C j( d case 0xbe: key=0x13;flag=1;break;
" C& `: c- P1 ?" p* d# z7 U( H/ k$ P case 0x7e: key=0x14;flag=1;break;//读除键的值; d+ m* R" O% s4 p
}4 a; e$ x, Y- O& a
if(flag)6 I$ ?0 H8 N. Z* R6 @0 O
goto exit;
+ f- ?2 U% D. ~7 Q6 r# d4 B else+ v+ W" J G4 V& Q/ c
P1=0xfd;0 h3 C+ ]( ^0 T( P
delay(1);
" X# P, M1 v- R: a if((P1&0xfd)!=0xfd)% y$ [7 b4 {+ q" M
switch(P1). k6 b: f1 Y/ x
{
& h$ o6 ~ G$ Y0 p; A' z case 0xed: key=0x21;flag=1;break;& v% A" Q0 [1 c; {" P( M5 t/ {
case 0xdd: key=0x22;flag=1;break;
6 M. r/ |" `0 D" V" Y9 L case 0xbd: key=0x23;flag=1;break;0 A; \2 m" P! T' J7 Y9 D# q8 I
case 0x7d: key=0x24;flag=1;break; //读4到乘的键值: z9 B5 T3 [1 `; C4 R2 @8 P4 b/ f
}! W( Y4 q* V0 t8 G3 t' \
if(flag)
2 y- \8 L- B! W9 I+ u goto exit;
7 g( F$ z3 k( J1 j else8 V m- D2 K. C) ~& a3 ]8 v! w( g" }+ k
P1=0xfb;
( A, x! G6 T" l$ @: t! A delay(1);
w6 v# y0 A' d3 C9 o9 ]& v* V if((P1&0xfb)!=0xfb)
1 M' ?3 ~) _8 q( I8 H6 d) F# l5 S switch(P1); T z* M& r, G5 M" y1 z
{( K# e& F/ s$ S2 l' u
case 0xeb: key=0x31;flag=1;break;
% h. O% f4 R1 e( M3 y$ r case 0xdb: key=0x32;flag=1;break;
+ K% T6 E& _' ~/ S, q1 w case 0xbb: key=0x33;flag=1;break;. w, R% ?- V' _- d) @
case 0x7b: key=0x34;flag=1;break;//读1到减的键值 }8 `0 R- I4 _0 {' ]0 A. e- @' E
}$ `+ ~& U1 ^$ y1 R7 t7 z5 A% L; Z. ?
if(flag)
5 `- J2 H7 B4 s! ?. F: y goto exit;
$ R) [3 E- u& T8 _' Y/ ^+ o else) Y! a p& Y& a+ ]2 Z: F
P1=0xf7;
+ P f; X7 [) O1 Y! u/ { delay(1);! N1 ~! Y1 s! \$ C1 O
if((P1&0xf7)!=0xf7)
8 i* {3 b$ }2 ~5 C% }0 A1 S3 b. a switch(P1)( O4 [$ I5 g g' h6 W
{) K" a8 j% h4 Q# j+ i) A; A+ e- Q
case 0xe7: key=0x41;flag=1;break;//后退
# {* u% F$ n3 X. w4 R& q( g$ @8 X case 0xd7: key=0x42;flag=1;break;//0
- ?4 R, N3 ^2 {& K( \5 {0 w case 0xb7: key=0x43;flag=1;break;//等于* X; | F; [/ T- b) ^; Q! o6 Y( d
case 0x77: key=0x44;flag=1;break;//加( ~" o& W i( l1 L
}- H _% K' V: ]! j! v B
# ?$ a/ q# s9 _0 d2 pexit: return key;8 g' P; \& K K7 W8 k9 I# d$ j
}
. s. U& I+ h# G3 }1 ^) j6 f9 f2 k if(temp==0)" ~: R' m" Q3 R4 J
goto loop;* q z9 |0 g y1 f
}
1 u7 _+ B0 J7 H" h- ~- e//---------------------------------键盘扫描完--------------------------------------------//7 j/ d7 G6 N6 m1 B) ~
//---------------------------------显示初始化?----------------------------------------//, R% }& I( z% @- ^1 ?( F8 E; N- Q
//P0口初始化, r3 ]: M- @5 \9 @" r
void initpindata(bit i)
9 ?: p( \6 V+ z# ]{
4 k' F- c5 S, w( q( N4 bif(i==1) pindata=0xff;
7 G, q6 m2 W, G/ Z+ Jelse pindata=0X00;" J& T' O+ |0 e; |/ E' L
}
- {6 h2 A d. o( O( o( I//寄存器选择信号
8 Y7 D) j2 \' Z2 e% ]: X* |3 dvoid setRS(bit i). o6 X, m4 S- k C. y, z6 \2 {$ X
{
* g8 g2 T, }- b. x) uif(i==1) pinRS=1;
`' ?3 a2 k3 R+ G, Welse pinRS=0;
# a( n6 j4 B1 A/ R C* ~8 d}
& u, h" K6 A; k$ x8 z: {: Y//读写操作控制5 }5 @8 y) b7 ]; z
void setRW(bit i)
" e$ W0 g) D# m) y4 q2 z$ L{
* X! |3 X! \7 Iif(i==1) pinRW=1;/ r, N& b: h4 j# \- s2 `2 i @( `
else pinRW=0;
/ Z+ G' X& R0 B9 l" h6 a}
- r" C( P0 [% ^3 g+ |. D//使能信号
7 K5 k! M! [6 M8 g/ gvoid setE(bit i)
1 g" i8 i& k) C+ [- {* M" d2 D{
& r2 J! h! i2 x) L' u/ Vif(i==1) pinE=1;
% V. a) o4 y* n! zelse pinE=0;
9 O1 e# g/ m, s9 G+ o; I}
7 X* k2 B2 }" q L. P//读BF以及AC的值 }/ ^% }. @" {2 I* t5 r
uint read_BF_AC()
: O! y; S# G' F3 x! C) }# ^: ^$ D; G{
' b3 i1 a: v7 C" U. quint temp;
2 \* R8 {2 Q0 r8 Binitpindata(1);: c5 t- ?, Y% V* f
setRS(0);
2 {* F2 j5 c+ z% }. l% usetRW(1);
" M2 ?# q9 l8 isetE(1);5 J- ]& p/ z5 v! m1 t; @5 T% T% }- N" y
shortdelay(1);- P& {. S2 t. D/ R
temp=pindata;# [ d* D, \" r1 v& c7 L) o
shortdelay(10);. j* Y& H g6 x5 o' h5 P7 m0 c* h W
setE(0);
, v* l& r: @) c& sreturn(temp);' Q$ W/ }4 k( [. [2 ]4 [: H
}/ M5 B2 _1 F: T6 \! ~$ d
//判忙
: h k7 J) y) o; p! d1 Ubit statuscheck()
7 H/ D# n, c- j2 z: Y% `/ n2 u{
& @* I: S0 B2 f$ s' g3 o* vreturn((bit)(read_BF_AC()&0x80));
8 |: ]; n1 C. B+ s& t$ ?$ s}
3 h) V, A! j7 Q6 K' D3 O7 R7 L; R1 R//写指令函数
) B/ \4 V; [3 l* e- m8 k0 I- T) N$ p/ Q; uvoid writeinstruc(uint instruc)
& {# z0 J6 V- D' T$ n# G{
/ }) H' d P# @0 Y( k) lwhile(statuscheck());
2 u% H9 Y' f/ H H0 vinitpindata(0);/ g3 b$ y6 H$ u6 ~( U
setRS(0);' z5 U( g6 ]* ^+ @ ]* M; k
setRW(0);+ o( s+ ` _* }1 J8 n0 O8 ~2 g
setE(0);
3 m( q! V+ f9 G* j/ Zpindata=instruc;
8 Q8 b u% j# U3 Q+ ^" W//short delay(1);
! x! V" L& }+ [8 A; @" f' jsetE(1);
8 \, Q( |1 \! i9 r$ {9 v* Y3 kshortdelay(10);
0 s5 \; F$ W% i7 T7 e# c& EsetE(0);6 K3 S+ Y9 E) L) C
}4 Y- @0 o/ t! w4 c& l) }+ [
//写数据到RAM
/ b3 h# l1 h9 I7 l* Z) y3 L3 y4 lvoid writedata(uint data1) u0 w1 t @$ n1 P p
{% F: c! s1 E) [! @! J
initpindata(0);
! L) M. W2 x- BsetRS(1);3 ?$ B5 F1 w8 a
setRW(0);
" A; b( z* A) m3 O0 B. @* R- EsetE(0);
9 |. O8 Q3 o' L; }pindata=data1;6 I k1 e' |! Q6 Q9 ?- H
setE(1);1 ^5 o0 R5 |9 j& w& \4 G L
shortdelay(10);
. u* }) Q" m" b0 m3 W2 R+ O5 wsetE(0);
* A4 n( P( x h) U}; H! j; m9 ^6 Q5 o3 a2 f- z
//从RAM中读数据函数 H4 @- V! W" l
uint readdata(void)
% E& }+ Q% L$ c0 x0 q{$ o; j4 `% n' z' G+ Z: n X
uint temp;" W' T# E: |+ T- }! ^( A9 r
initpindata(1);8 X# C5 x9 c1 V" J7 f: C3 Y
setRS(1);. h: r8 U$ W/ [$ p# r
setRW(1);7 n7 C5 c& a3 d
setE(1);' `" Y L0 K2 j+ z5 D7 a; ]
shortdelay(1);
( A! ?' Y R# jtemp=pindata;' W9 s; J/ b! j& ?3 i* o4 z9 @5 {
shortdelay(10);
! |2 w# y& ] l- PsetE(0);
' H! `) ]6 O3 g( F; `& O5 ^3 Zreturn(temp);5 y1 p6 j+ p7 ]' b! C" J3 m
}
\. B M, k: ~) ?6 t//显示程序 X为行号,Y为列号,date为要显示的数据2 ~8 X8 m8 Y l4 m; H4 U
void dispcharacter(int x,uint y,uint data1)
, R* x q3 [6 Y. p9 I7 V{
6 a+ @$ r5 I. |7 {1 guint temp;
8 I7 {0 T& b, y; F$ e; twhile(statuscheck());
0 q: U; j3 b, W5 N) ktemp=y&0x0f;3 p, y7 D g2 k2 t' m
x&=0x01;
, s l8 o' \+ [8 M- E0 m( `, i( Cif(x) temp|=0x40;
! J9 I) G$ L, {: w# w& ?# @7 UsetDDRAM_Add(temp);- @8 O8 A1 U4 P, h+ \) q
writedata(data1);) T! p, l6 A f6 p* [3 h
// writedata(data1);
- f: C- |; I1 I, _: H}* ~2 ` Y) p) `: j) v* l+ a
//LCD复位函数
) j5 R, M g/ b/ H3 h9 vvoid LCDreset()5 `2 b( c, a1 Z2 V
{! }) L$ o9 Q5 h! v$ P; n: H" G
clearscreen();
2 G8 m7 X3 M* i( acursorreturn();
5 J4 N4 R* ~1 i; k( r& w/ T% u}8 Y2 a% l0 X2 P
//LCD初始化% I6 V5 `7 W8 o% s- |/ ^. U' A
void initLCD()
. M% K: [& I$ m3 e% w{- x& \: ~ ^5 a
LCDreset();
+ Y$ Q- s# S8 N$ t- Winputmode(0x06);//增量方式,不移位
. j d8 { w, w' {9 R$ g& H Jdispcontrol(0x0c);//显示开,光标关,闪烁关 |& L' p& ?! n7 u/ ^9 _
functionset(0x38);//8位,2行,5*7; K, e1 X" Q* b3 L
}2 t/ O+ T x0 o! s
//-----------------------------------准备工作完成-----------------------------------//
- s/ J9 j# @# K3 E$ g! {7 R5 E//-----------------------------------计算器-----------------------------------------//. d1 Y- I5 I& j7 K. v- `$ `+ x
compute(char key1,i)& r8 J' r# w: l& Q( I$ S. f
{
0 i X5 w" ]3 X/ bsigned char m,n,c,act;) ]0 t' G i/ O0 m
long int num1,num2,result;
5 ?8 Q& h a Vsigned char str[4][4]={{'7','8','9','/'},' Z9 o+ y8 O1 z* F& K- F( a
{'4','5','6','*'},% A2 S/ O4 V' ^" ?4 Z
{'1','2','3','-'},$ n5 e' U! D+ p
{'c','0','=','+'}};$ _) l! L4 S2 w9 B- \, k: M7 C7 s
signed char str1[11],string1[2];4 s8 S2 t. I a# p$ y8 @0 X
m=(key1&0xf0);8 y& w) ~) ?2 _9 Q, M
m=m/16;6 P2 \/ Y# _ A+ G+ I! R; ?! q
m=m-1;
( D6 @! U; @. N* Nn=key1&0x0f;
) }. L( Q# Y, Y' d1 w+ Dn=n-1;
# M) w1 q8 Q k0 t5 ? t7 cc=str[m][n];# C3 ^1 _$ `5 D) D% s0 w/ T
sprintf(string1,"%c",c);
6 R' {( b) t$ M& E& a- gstrcat(str1,string1);
5 x9 d# Q4 b# u0 X$ Xif((c=='+')||(c=='-')||(c=='*')||(c=='/'))+ j+ t# k8 K/ D. i$ W- \
{. g7 @) n, z3 {0 q" F1 b
act=c;+ Y/ D* K2 _% C! t/ `
num1=atoi(str1);
4 `! P( y+ j/ D1 Vmemset(str1,0,11);
O$ ]. p8 a* R; Q- ~memset(string1,0,2);
0 u L+ T& W# X0 }' `}" @- e, c* @- ]% Q# U
if(c=='=')
& i! A+ q m6 g; c. p6 T{! J7 ]1 V; [9 T g& {/ ^5 u5 U( p' [4 @+ [
num2=atoi(str1);
6 B; e( ]- i- Z8 i7 c. C" ]& L( R4 q, G. A. I5 Q6 L
switch(act)7 s. Y6 m7 {! n. V! y) I# p
{. F6 H; L& K/ ~: O8 S
case'+':
. c( X- J: Z5 N* ]{ if(k==0)
o% ]& W7 I# B( a" x& @7 R {result=num1+num2;k++;break;}- t: ?6 ^* Z# Q8 E8 Z8 N
else; m0 m% r; W5 j9 y/ o( J' U) O+ W
{result+=num2;k++;break;}8 l/ |3 l6 F @+ i# c$ I! s
}
* e, r/ I& J' N. u$ Q* U, R2 ~case'-':: }/ k8 \+ {" b. p
{if(k==0)
5 h2 H# d, H# y2 J0 r$ ^ {result=num1-num2;k++;break;}
3 r$ l1 B2 K& w/ E; W- W$ j! S else
; p' p, z6 Y m. [5 N {result-=num2;k++;break;}
; E) ]$ Q! {6 B }
6 T3 @6 K+ |3 g9 Icase'*':1 T0 s$ n, z6 v4 Z& e- _. Y# U
{if(k==0)
7 x" H5 D# B1 v) `3 H {result=num1*num2;k++;break;}
) B8 k5 G2 R: f else
7 B% M0 z0 `1 A& B/ Z {result*=num2;k++;break;}' \& u% I0 c- R! c8 ?
}* ?# K/ a3 D% [6 o. D; r5 e g
case'/':
7 |( C+ x$ s! z3 z9 o, ]4 t{if(k==0)) F4 x7 K& ~1 I: {. a9 D4 o
{result=num1/num2;k++;break;}5 N' w1 y. R1 k6 N. H. P: m
else
' x$ e0 L) x) d* I- v/ H- E { result/=num2;k++;break;}
5 q- v6 W/ U6 {2 c- l& O! {1 r! | }/ g8 r: o! [7 P4 x/ c) y4 V
}, ^4 S2 m- a. b$ n- U2 {$ H
}& l2 S: R7 b- L) \+ o' R
if(c=='c')/ y4 o& c" h8 o* Z4 O8 C
{ A: ~+ o! h X4 X; p# `
act=0;
$ O& [) s5 K- v1 Inum1=str1[0];
3 G1 o5 ?- O; g" Anum1=str1[8];
* L1 O B6 }% Z% P- ~( }; kmemset(str1,0,11);& z4 ?. ~2 t' f' \* ]3 L t4 h
memset(string1,0,2);5 Y8 k8 y% b5 l
num1=str1[0];
m0 C5 }/ [' W! E5 znum1=str1[8];5 Q5 P( V" L# u3 Y' m5 x0 \
k=0;
+ ?- F# R' \- F8 r9 F9 d& E. @* Q}
; f, J- J, P! |5 Xlongdelay(350);# G' F& Q" Z5 ^2 A
switch(key1) //显示部分4 v l( F" }/ ^2 ]8 u9 }' D/ }
{case 0x11: dispcharacter(0,i,'7');i++;break;1 n; Q, I9 K- G* E- H
case 0x12: dispcharacter(0,i,'8');i++; break;4 f4 B9 N+ X) }7 H' w
case 0x13: dispcharacter(0,i,'9');i++; break;
+ W. q, u: r r& x6 u9 xcase 0x14: dispcharacter(0,i,'/');i++;break;
2 g% L# _1 Q! V7 x7 Y7 Z$ Zcase 0x21: dispcharacter(0,i,'4');i++;break;) X8 `$ q/ K$ S
case 0x22: dispcharacter(0,i,'5');i++;break;
% j3 T# _" a) k, K8 Scase 0x23: dispcharacter(0,i,'6');i++;break;
" @" k+ P p* i( L& ^1 P4 _case 0x24: dispcharacter(0,i,'*');i++;break;% ?5 W8 K( ]; G* I. r
case 0x31: dispcharacter(0,i,'1');i++;break;% A1 x {% J, P7 h$ P5 |" ?8 l" B
case 0x32: dispcharacter(0,i,'2');i++;break;# e9 E% ]5 U ~) k0 m( A9 R% m# ?
case 0x33: dispcharacter(0,i,'3');i++;break;' ~: I, d5 v, V$ }! o+ p, ^3 W" @
case 0x34: dispcharacter(0,i,'-');i++;break;
7 F# @/ h; d& L) a1 Gcase 0x41: clearscreen(); break;
- D; ^! C% `$ c: Icase 0x42: dispcharacter(0,i,'0');i++;break;* G o$ | [% q
case 0x43: dispcharacter(0,i,'=');i++;
2 C' i- u# }7 ?$ q m=result/10000;
; a! ~( w! e% P; E result1=result%10000;
; r& f8 u4 c6 d; H, F- \ if(m!=0||result==0)" Z; H" j d, X3 l$ G {
{5 y# I" i [; a& R
n=0;
. ]( q* F$ ]. n W* ] m=m+'0';7 F! a2 O. u9 R# \7 W5 m' v
dispcharacter(0,i,m);i++;
5 Y! z) m0 o! ?7 N7 ~8 o }
7 o$ ]8 q# F5 Y5 s% }: w2 m m=result1/1000;
z) ~$ _5 L% }; x% j result1=result1%1000;+ \, c# X: [5 x7 V" B. u
if(m!=0||n==0)
. q* V! q$ M _ {; S: v& u0 @( c2 y2 K% ~( |6 k
m=m+'0';
5 J! J4 y8 E2 S7 K n=0;/ e6 Q. ^# K. n/ W6 p1 C: |* q
dispcharacter(0,i,m);i++;
1 h& }! W- Y0 R$ p' H) d }
% J! n9 w2 J" N0 k# z3 d3 m m=result1/100;
% R2 J& h3 B1 L% [ result1=result1%100;
" ^# M6 F! K: a& D& [9 \9 N w if(m!=0||n==0)
5 g% L/ n. H1 \& q {
8 v3 A1 h+ d( ~# A" Q" } m=m+'0';4 L" p, m3 z8 E: v
n=0;. y6 T; R& \. e+ k( [0 S" W, P4 Z% ]9 @
dispcharacter(0,i,m);i++;
/ L" Q. f" t/ ^3 n, |( X. w1 y }3 \" c+ {8 B# U* [
m=result1/10;
5 q/ G0 W G# X; N) X5 C- c result1=result1%10;
4 c# ~8 J0 c+ J D0 d( y; @ if(m!=0||n==0)
( S6 l* ?" f# h& A. h {" X# \, q* K4 f( D" |
m=m+'0';! K4 s4 u5 {! u7 @3 s
n=0;3 Q% v- J9 L8 Q" ^1 D9 @: I7 B/ @
dispcharacter(0,i,m);i++;. ~; R7 i p! X& m! M2 i; x+ d' ]
}- Z2 s! B" x. s8 u8 M$ u2 D: j' b; j
m=result1;/ b' \) @2 @; K1 {' q( [ T
if(m!=0||n==0)6 x" n4 b2 y, H" u; F, Z: z
m=m+'0';
7 o2 s& D g" O; {5 K6 V- r9 ^ dispcharacter(0,i,m);i++;break;5 ~, m" v1 O( s, h7 a
case 0x44: dispcharacter(0,i,'+');i++;break;
3 D% j3 c7 R1 x}
( x( t4 [) u- _6 j' ureturn(i);& ?, M; h; p- x" O) c
}
" n5 ]7 ?( g- q. N7 ]8 [//---------------------------------------------------------------------------------//
5 r# m; I! N- Z( j- @/ a' G5 e2 N//-------------------------------------主函数---------------------------------------//! b1 q5 e# _8 o& h( p L; B, n
void main()
1 g6 T+ G8 C/ }+ N# T& A{! R, {% t& v, _
char key1,i;
, M- U! v* Q# y) _, Mstart:initpindata(0);' V( p) }; i! e) @
P2=0X00;7 V+ ^( J0 y5 S2 N% ? r
initLCD();$ a& T$ E* _) M- W
i=0;
$ K, E# I+ z# |) k: ~3 sscan:key1=key_scan();
! F" a! D$ F# I) Q$ U' }i=compute(key1,i);
$ s* T% N' U9 {& a' r: g: G5 eif(key1==0x41)
' X; p/ {0 e# X* xgoto start;* c1 V$ t7 n3 O, T
else $ {! ~6 [) F. A6 w& Z1 B) [
goto scan;& a$ J& K ?+ H: \* i) `
}& k# b k: W9 N" o. ?; H# {8 S
, J4 H& k$ E8 f
单片机计算器仿真工程文件及其源程序下载:$ m& U* Y$ R2 l4 G
51单片机仿真计算器.rar
(202.58 KB, 下载次数: 2)
+ m- S8 B6 }/ M( v
4 I+ k0 R: A/ n( e4 Q/ r |
|