|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
51单片机仿真计算器 lcd1602液晶显示
# p$ o6 l+ A% @ e) W+ F& ?% x" j* R2 g4 l
@+ }2 p: a! |; a51单片机仿真计算器是用lcd1602液晶来显示的+ _8 p" W5 u9 [7 }5 k4 M' R: k
; b7 M( d2 F) ^8 D
; o, o4 w1 E$ ]' G/ |8 j; k/ L单片机源程序: W5 N7 O3 e0 C" Y% |
#include <reg51.h>. o. Z* U8 i6 f- O: k
#include <stdio.h>
* y- T! N4 m g+ C#include <stdlib.h>
: _( t* k) l; [' ?#include <string.h>- X0 K' m9 ?) ]& H/ W6 R) u1 l, R2 V. N
#include <math.h>% s& z+ [# A% b
#define uint unsigned int
$ N- {0 D5 y# \#define uchar unsigned char& w( B5 {3 _, i$ p
sbit pinRS=P2^0;5 p! p6 T5 M+ K0 [2 ? y
sbit pinRW=P2^1;3 s2 C% d3 j5 i) t9 O
sbit pinE=P2^2;
{$ e8 P3 E @# C' z#define pindata P03 n i5 @: u* u( k( }: c% J7 K
#define clearscreen() writeinstruc(0x01)1 I, F0 k4 g- H" O" Y; s
#define cursorreturn() writeinstruc(0x02)
1 C7 H* ~* r" m6 y#define inputmode(temp) writeinstruc(temp)
" l' _! ^' [( b2 j$ s9 O//temp取值如下:" R* e- D! s c' q- c1 P9 p) G/ Y
//0x04:减量方式,不移位* T8 f/ [1 q& F) Z
//0x05:减量方式,移位
2 W2 L, f H, ?" ]& a2 t% _' ]//0x06:增量方式,不移位9 c, r2 p! c$ G
//0x07:增量方式,移位8 m% W5 ]3 ]. Z! V! }' F
#define dispcontrol(temp) writeinstruc(temp)/ h1 l' z. \' U1 D" g( Y
//temp取值如下:5 F/ _( e/ ], B" n# O: S
//0x08:显示关,光标关,闪烁关
% p3 p( \. o" a% ?//0x0c:显示关,光标关,闪烁关
* L% u7 Z# R0 N5 j) i& n//0x0d:显示开,光标关,闪烁开9 x0 C" i: }, W1 v/ H% v5 O
//0x0e:显示开,光标开,闪烁关
" l- W8 X6 A' Y4 H) j$ A/ W//0x0f:显示开,光标开,闪烁开, c8 k+ K: {7 H
#define dispshift(temp) writeinstruc(temp)
0 |! m4 a# n9 y+ \! l6 w//temp取值如下:
7 B8 S. y- J, u* _* e: L1 S//0x10:光标左移
* u4 @ P6 P' u. A V' T//0x14:光标右移9 ^% d. z8 y* Y% I- c9 d
//0x18:显示整体左移
# Z5 K y' ?+ B9 J//0x1c:显示整体右移& q3 i% U7 A ~8 l. ]
#define functionset(temp) writeinstruc(temp)7 R: W O8 e* Z; [5 M! w
//temp取值如下:
6 y/ J0 B4 A' T& t//0x20:4位,1行,5*7
" z3 L) T# g2 U$ k' I( Q" ?//0x24:4位,1行,5*10
" C# X& K4 a5 B" |4 m0 N//0x28:4位,2行,5*7
: E" t+ e1 i2 m* k5 ]//0x2c:4位,2行,5*10
4 T- X6 l8 C1 P8 K6 U) y//0x30:8位,1行,5*74 w6 ^4 M' M! `. f6 b8 o! p
//0x34:8位,1行,5*10
5 R4 H$ m X3 w9 f& ^, d//0x38:8位,2行,5*7. x0 b1 ~1 {, V3 k% R
//0x3c:8位,2行,5*104 s3 s! h/ r" y. ~5 u0 o
#define setCGRAM_Add(address) writeinstruc(0x40|address)" ?+ j8 |. L8 \. Q/ u
#define setDDRAM_Add(address) writeinstruc(0x80|address)//短延时
$ O3 k2 ?+ B: ?& d//void shortdelay(uchar i);% x! s. }# m" H4 `
//长延时
/ h( H5 ~8 X: K: p3 U8 o//void longdelay(uint i);' I: G# C( g: j& U& ?1 Y& `
//P2口初始化- c! R3 G' `: E3 V; s
//void initP2(bit i);
2 ^4 z$ A" p5 h# s6 `6 ?2 Q% h6 ?//寄存器选择信号
: p) ^. T9 I4 t+ g//void setRS(bit i);# y$ }5 V: g3 d( p
//读写操作控制( L; ^" P3 m9 {/ F8 V5 U8 J
//void setRW(bit i);
1 e( M% S7 u4 a0 Q Q% H//使能信号
) ~! {6 m: H2 Z; ^6 k) u; h7 z//void setE(bit i);: A3 s5 i. g5 g5 i% \* u6 K* p2 u
//读BF以及AC的值2 n, H5 C& Y7 s) {
//uint read_BF_AC();! c; w; V. X+ q5 p! w
//判忙
; G& [6 ~+ R" `0 i$ y" J//bit statuscheck();5 z! `# R) B' ]
//写指令函数
! H3 k/ b9 [! l9 N//void writeinstruc(uint instruc);6 f4 }2 Y$ y9 k' T0 r
//写数据到RAM
5 q, D& X# S$ Z4 `//void writedata(uint data1);
0 c" ~7 ~& u2 M) |) P0 F% [* m! N8 ^//从RAM中读数据函数0 x2 R9 `% w; p E/ \
//uint readdata(void);
+ L& h: d, R/ m% v) c//显示程序 X为行号,Y为列号,date为要显示的数据
9 o8 k5 c- @, A! }//void dispcharacter(int x,uint y,uint data1);& ~1 b/ M( L- {/ s
//LCD复位函数
8 a: t+ {3 n$ f: ^9 O//void LCDreset();
& b: h; I0 V' R#define uchar unsigned char
+ F' T r& L ]9 [( v4 x7 kuchar k=0,result1;' ^; a3 K9 C* n6 C+ R
void shortdelay(uchar i)//短延时
( z- h( k6 d) _{
* q% Y" A+ L3 `8 m% Y) bfor(;i>0;i--);
; M* d8 k" V1 `8 h8 l& R: H! J; }}' N- w+ P0 y5 l Y$ h
//长延时
/ L' K* j$ r+ ~+ e; u2 L* }void longdelay(uint i)* u2 m. n, {& v5 [* m" W" W
{
, q. Q4 r6 e+ e: H0 Quint j;! z; m1 y1 y/ `( c5 Z4 F
for(;i>0;i--)0 T+ {7 w" A1 C" }( W" P% |
{for(j=100;j>0;j--);}
6 U f- H2 M& m$ s( ?2 h& k7 \}: w- f. d- U5 N) o4 S
//延时程序
% F" t3 B+ d2 b3 ?0 | Zvoid delay(int i)
0 z% b, [. f! o4 O. N- i% g{int j;9 Q5 U7 r1 Y; w, H9 T7 J
for(;i>0;i--)
2 @9 N, V5 y/ y: _$ O& }: y for(j=0;j<100;j++);
) \6 N2 H% e. D}
3 a3 B/ S0 ^# R5 `//初试状态+ ]& J) Q. m" p1 @$ A
void io_init()! m. i9 R$ h+ \. Z
{P1=0xff;
$ o+ N2 J$ I' ?. ?# f}
' v8 R' M+ s! n, m( L+ E- h/ h//?---------------------------键盘扫描部分-----------------------------/// d2 @! \) e7 b' s
unsigned char key_scan()# e# E1 y* Y1 W$ s$ X k
{ unsigned char key;
( g" X* M" a; w3 p unsigned char temp;/ F4 N. T$ R' |/ }1 p, g
uint flag;
, u3 [. M; F) {8 |1 F% G io_init();0 I, U3 p" N5 P
P1=0xf0; `* P7 J* {+ B! E' t0 R, \
flag=0;
* O) \9 k& n* u: p2 y: |loop: temp=P1^0xf0;9 }1 A# \; f9 { C7 T
while(temp)
l9 g$ o, g9 @$ R( u {
( r4 U& W1 T7 T# [ P1=0xfe;. p( c' h7 g3 n3 ^. R
delay(1);) y# H( ?$ J! ?
if((P1&0xfe)!=0xfe)6 b$ h& b# M! w6 Q8 F' ?
switch(P1)
# s: B3 A( p4 l7 D7 V: { {! {. e8 u V2 E! Z o( e. e9 }4 \0 m8 x
case 0xee: key=0x11;flag=1;break;//读7键和值
4 U% }1 p" J; ^3 [7 m0 E8 \4 E- f case 0xde: key=0x12;flag=1;break;9 \; L! [4 A# l
case 0xbe: key=0x13;flag=1;break;
# C% z, V) f& @ case 0x7e: key=0x14;flag=1;break;//读除键的值/ Q& G0 `, K) P7 M
}/ Y4 G3 _: C/ e3 ]/ T, L1 F" M$ D0 X: E
if(flag)& U8 p" w% P3 ]6 j% Q
goto exit;
s0 C* \; Z9 C2 B: G2 H& j else
2 X) h8 p" x( A6 e& @) ?* b P1=0xfd;
! }8 Z- n% I, a* Z/ { Y( i delay(1);
' X3 f6 g( r7 h, }! u/ x' E if((P1&0xfd)!=0xfd)
) H3 _: ^, W& C switch(P1)
, j4 c8 m- ?0 K; S, c {
7 q; F0 {7 e, O8 Y4 N" ^8 S9 Y case 0xed: key=0x21;flag=1;break;; O" v/ q# T& g' R- i' Y2 { D, C
case 0xdd: key=0x22;flag=1;break;' b7 }( E% |5 s8 h: g/ Q" p
case 0xbd: key=0x23;flag=1;break; b v+ S8 ^: O* a8 d
case 0x7d: key=0x24;flag=1;break; //读4到乘的键值
( {* |" l c+ C: n }& Y, q- f1 }( B+ n
if(flag)- Y; `+ `- q: J* ]) W: m; I
goto exit;
, D' x- D! t* Q8 @4 T else- F( `9 X4 X' o
P1=0xfb;
! R% ^3 Y9 X, J" ]9 x$ h: x delay(1);" N: f/ t- m* \4 {8 |
if((P1&0xfb)!=0xfb)
( h/ w# c% h2 m/ @+ ^ switch(P1)
6 D2 L) J& F! B1 } {
|, O; P! {) y9 Q% P5 |* `1 m case 0xeb: key=0x31;flag=1;break;
7 N; A1 G f- Z: ]( E) I0 N5 ~: j case 0xdb: key=0x32;flag=1;break;
, B# x6 Z$ v. _) E5 M4 l( o case 0xbb: key=0x33;flag=1;break;
0 a# |% ^! ~1 v% t& _* D case 0x7b: key=0x34;flag=1;break;//读1到减的键值
: T$ ?% g$ p8 Q$ S4 d) D2 t/ c+ C }. m/ h; k6 F* q! E. e9 i; S
if(flag)
; C( j* v& r4 B goto exit;! }8 E% |6 v7 q: n7 p
else3 u2 X: M8 U% e& G' D/ g$ F; W
P1=0xf7;# y/ E. Y5 _7 U2 J$ D6 }5 J
delay(1);: ^, k: Z# O2 M* V: {7 B. u
if((P1&0xf7)!=0xf7)
) m1 H' D' p I! ~ ] switch(P1)
* c+ m0 j* |2 t) v7 S' V7 { {! J7 x1 G! \4 J H9 L
case 0xe7: key=0x41;flag=1;break;//后退1 Q1 r5 R' Q1 y7 ^0 S% d
case 0xd7: key=0x42;flag=1;break;//0% e. y e) G9 h, H- f- K% G" V
case 0xb7: key=0x43;flag=1;break;//等于! I0 o6 l: p% t r: X
case 0x77: key=0x44;flag=1;break;//加2 }, I! U' r+ f! {4 E! V$ Y! b- I
}
; Z1 {5 T* r3 s' r% g$ S4 l/ [
exit: return key;
& @- ]- Z6 E' u) \, _9 M& j }
4 J9 ]+ N# N6 b if(temp==0)! T3 D6 S; Z! o/ ~7 W
goto loop;
5 j' P2 d. B% ]' q: @ }
4 E' {* ^9 j7 l& `1 t7 z//---------------------------------键盘扫描完--------------------------------------------//
. Y9 W' W6 }4 k//---------------------------------显示初始化?----------------------------------------//
: A' G! |5 M. \" q* H//P0口初始化
6 `) C* D6 O6 r/ V0 e6 v/ cvoid initpindata(bit i)
! G' v. D4 u8 C, f6 w7 d+ N{% n) C( R& C$ `% @: w5 I
if(i==1) pindata=0xff;
/ o! {) n, X0 h7 s- Kelse pindata=0X00;5 y( g- M% n _* r2 Q
}
/ t }1 _+ ~2 J. b/ m//寄存器选择信号, I6 D' T8 x$ B5 X# ]8 Q
void setRS(bit i)
4 d a2 ]1 j ]$ X% Z0 m{3 k# @ F2 n: `+ i4 V9 f. V
if(i==1) pinRS=1;) B; q# n t7 K0 y( B8 f
else pinRS=0;3 L y) ~( p6 ^6 z" m
}
5 W4 Q+ X2 i/ Z, x3 C3 \//读写操作控制- c4 x2 g/ r2 B# x& x' @
void setRW(bit i)
0 l, Y5 p4 o: Q& u{5 F+ T" F* c# m5 R# y
if(i==1) pinRW=1;
- u, w7 i& @- d: X* I1 Gelse pinRW=0;0 } r3 o5 q& [1 v) N9 ]2 J
}
1 I3 c+ g, G5 i2 J$ u1 F//使能信号' Q/ c# q- t Z% t. a
void setE(bit i). t0 C" P1 e1 S* `: g8 \9 t4 j+ N
{9 |# c! H, x1 C: N: h, f& z
if(i==1) pinE=1;
! q Q% Q! \5 b7 d) A" l5 {else pinE=0;3 [8 J3 _1 h4 L: q7 s+ {
}
2 H5 q( ?) P5 Z6 I" d/ \//读BF以及AC的值
4 C6 M3 Z# q) n9 @% z/ Auint read_BF_AC()
. h4 S8 b' ^9 z{; g' n/ ?$ m% T j' M" x/ N
uint temp;
/ q. p) Y* R! a/ n4 Iinitpindata(1);
+ U5 R2 E7 _8 _+ T/ ?4 TsetRS(0);. u4 Q7 {6 ~ d c* U* G! X% d! D
setRW(1);0 c. L3 U5 H; ~, |9 G
setE(1);5 F' G7 A0 V* J3 d+ j* x6 j- A1 z/ R, r) z
shortdelay(1);% w: Q0 G& A }" X$ U1 B5 R" N
temp=pindata;& a0 ^' G, K7 r/ p8 i R
shortdelay(10);' H3 u6 K1 B" ?$ f2 E. Y
setE(0);
$ B! z4 Q1 A0 m0 z2 z0 sreturn(temp);
, }/ q6 E" l, ]) Q/ P0 U7 q}) y B/ E0 y* b7 B
//判忙
( {0 D h9 f' N% I* Kbit statuscheck(): D( z! K" x% K
{( _& _! Y; ?) K! j P/ R. |
return((bit)(read_BF_AC()&0x80));' A( l7 z% h# a
}7 f1 |9 I3 U- R2 }8 a9 S! [5 O
//写指令函数1 X# V# x1 h2 I+ E/ B t- n; D& w
void writeinstruc(uint instruc)
/ R8 S0 k% [& j2 \: g{
: P5 G% J2 `( U% Awhile(statuscheck());
7 d6 w# s: z! t6 K- C& G/ ninitpindata(0);- p" n# C" c1 y+ F& t
setRS(0);- F; i9 P! P: u$ o9 L5 k0 \
setRW(0);
" f8 r( N6 T1 j6 asetE(0);) f) }* D: @& _. H
pindata=instruc;
2 I5 D2 K) V( q. K, T//short delay(1);
3 h3 _% J3 P" R6 m0 h3 ?1 P1 Q EsetE(1);
8 `! y: N6 p1 ?0 b8 ` q7 Yshortdelay(10);" w! I( T" D8 J2 p/ k M( g
setE(0);- u1 b+ q" p. U- h2 D; G5 c) j) J
}/ H% ~6 k! H8 w) ?
//写数据到RAM
; q/ n, c3 E# cvoid writedata(uint data1)
4 y4 A+ t, M% I% e{8 y5 B) E* _7 z* u/ O7 [3 d0 x
initpindata(0);
. d9 H' @1 t6 ?* esetRS(1);3 S+ S6 Y; w9 ?+ X" C: [
setRW(0);
0 l- @6 Z, x3 a* QsetE(0);
8 o8 `! S% I1 }" L) ?. jpindata=data1;" J& i2 w y/ ^, }
setE(1);
`2 Q5 o2 X t( w4 Y7 Dshortdelay(10);
. u$ b6 [ [: YsetE(0);
: v) i2 U# a% @}
* P0 @6 H7 u% T//从RAM中读数据函数 `# H7 Q+ ?& g6 }& a# S; T' m) w6 u
uint readdata(void)0 r4 ^* |( T3 w# G8 j5 U
{
2 D# R- \7 C. N; K8 [uint temp;. |; S2 b4 |4 i: U
initpindata(1);, I W3 m+ y1 l& g# S
setRS(1);
j L( c! e6 R& Y2 j! ksetRW(1);
5 Z$ e# W9 k( _setE(1);
1 O* B8 k p, f9 S. N" Ishortdelay(1);
! k3 V. e D3 k9 J) ttemp=pindata;
| g) S- D7 P j b/ g; Ashortdelay(10); A. K/ S! u% }4 g
setE(0);
/ U! |; n- n, \5 N9 G$ H4 areturn(temp);
, p: p& |# l3 L( H2 Z1 \}6 k4 E+ B; g8 P3 \, k* B
//显示程序 X为行号,Y为列号,date为要显示的数据
5 b9 x$ ]2 C. A4 l$ u9 r5 Svoid dispcharacter(int x,uint y,uint data1); t5 x! g) r- Z( k1 Q
{5 A3 j9 ?7 |' y; G5 C3 S
uint temp;
1 W$ M4 d& A( l/ s \5 s+ uwhile(statuscheck());) b! C3 g* a' B( t8 S
temp=y&0x0f;
- ~: K4 Y% r& S) y0 px&=0x01;" A! e: f7 C; T* Q" Y0 t8 O% }
if(x) temp|=0x40;
/ L* [+ b" M9 WsetDDRAM_Add(temp);
0 F4 F0 o) K5 u/ `1 M* hwritedata(data1);
1 u _/ H" A- z) X// writedata(data1);8 N/ N' Z' v5 r; N1 Q8 m6 G8 m8 _9 W
}3 @ h8 @8 F9 o# I
//LCD复位函数
! Y3 e: w' B1 c1 a& Pvoid LCDreset()
/ a- J4 d! h% G6 }9 q' |{
! K6 _ _8 S/ O" _* Q8 Qclearscreen();- s7 O s) ?- u/ A+ C$ U
cursorreturn();
0 E+ }/ w/ H& E# v: |# a( M}
6 C, A2 [9 Q6 p$ ?& ?- i2 v//LCD初始化1 x8 `1 [$ U9 J) A
void initLCD()6 i& ^9 J; |6 U3 A& E9 _$ l7 I
{) w; c# V0 f% k( ] M: I1 l
LCDreset();+ a4 C' a5 ]& w) t; z* P) j
inputmode(0x06);//增量方式,不移位
3 S2 Y3 M, z! e: Q2 a7 bdispcontrol(0x0c);//显示开,光标关,闪烁关4 L$ U9 f1 C: I. @2 C! u- [
functionset(0x38);//8位,2行,5*7$ j$ c7 a8 V; E7 ^' ]
}& t% \4 T$ T) g, F
//-----------------------------------准备工作完成-----------------------------------//1 y0 y. |1 b7 Z) T0 G
//-----------------------------------计算器-----------------------------------------//7 l' ?3 Q+ o* X. [& G, c
compute(char key1,i)4 [' y% B0 |$ P( b) j
{' e. M0 ^! z# Z$ ?2 W
signed char m,n,c,act;3 K3 I7 c& l4 N, s |: @
long int num1,num2,result;' \, N7 o/ A5 c9 q" G: C
signed char str[4][4]={{'7','8','9','/'},! P3 L% C% a4 ?0 T9 N. z
{'4','5','6','*'},: c4 k4 @% M1 L1 u b
{'1','2','3','-'},
6 C" J6 h) M) N {'c','0','=','+'}};
6 j4 A6 Y4 C7 F" s( esigned char str1[11],string1[2];) L( `# J9 n- Z3 _
m=(key1&0xf0);' r0 R. {- l+ l6 w; g' X
m=m/16;
! E0 Y. K+ O* I. B1 E, Im=m-1;
1 _0 M- \8 [5 `/ n; {0 ~n=key1&0x0f;
+ _8 X' H! h4 Q- O3 F7 g1 p& o. Mn=n-1;7 c; g. Y& N% B; l1 w% g
c=str[m][n];
( a" x: I/ g4 r6 v$ {7 J# v) x& _sprintf(string1,"%c",c);5 T: q' Z7 _5 }1 ]
strcat(str1,string1);
1 z4 L9 `9 @- ^- A. W/ s# oif((c=='+')||(c=='-')||(c=='*')||(c=='/'))9 o; Y+ X7 D" w
{# O" M5 `+ m2 E' W d }1 q/ d
act=c;
" I$ P. W4 ~5 Pnum1=atoi(str1);& K8 x: R- j4 V" i" ^
memset(str1,0,11);
7 s! U4 J8 F- ]& }, b- c6 g# N9 Lmemset(string1,0,2);( H9 Y9 Q( U+ O6 U9 W9 W
}# m f; U4 b s* R
if(c=='=')* |' |( D2 [) I' {% O$ q& @
{
2 S* p! U U8 X3 s2 Qnum2=atoi(str1);' a5 `6 P1 ~/ Z3 z- l5 O8 ^+ w
! B& b6 o# O. q/ {6 }8 \! N. mswitch(act)
3 t9 _6 Q# o1 [# @{& [' P$ K; u8 n
case'+':
0 |6 V# F; A& {; }0 k0 ~{ if(k==0)
u. K3 K0 Z0 ^% M" O9 [ {result=num1+num2;k++;break;}
4 m t& M7 z' l2 Z else- [' y8 m; w- {: P7 w$ C4 |5 M
{result+=num2;k++;break;}; E. m @1 G: k; c" }- q
}# c/ O& c# D3 c4 n; i
case'-':. T c7 t1 ^4 @! ? B$ L+ G
{if(k==0)$ ?: J. X/ ?3 J4 z/ x
{result=num1-num2;k++;break;}
) W3 k6 N: U9 i' } else! ^" o2 \2 p3 N+ y- @' u
{result-=num2;k++;break;}
1 k g( ^4 a' x- c# O& }5 L2 I: | }$ E; q X( c% y* |3 s. k
case'*':
2 l1 e( H2 x3 R{if(k==0)/ c0 v2 S/ N! U* ?1 C Q. @
{result=num1*num2;k++;break;}5 I* w' ]9 k' @' L
else" C7 H: F" p- b
{result*=num2;k++;break;}$ O, k; ]4 J \
}
" v- @ j$ s' M. acase'/':/ M6 F) ]* O1 ]9 g7 o
{if(k==0)- {+ F, a7 ~3 ~) y- a/ S
{result=num1/num2;k++;break;}
, p+ Y' M0 ~# } else
* A5 D$ g* T6 v7 f! j { result/=num2;k++;break;}
5 { s* o* B) b, D7 y1 I$ r8 P }
' N* u$ l9 k' F* q& }) Y}. A5 c/ A6 x Q7 D3 s, c9 v
}$ e+ M5 w! w$ ]* s
if(c=='c')
, M* i5 D- } h& [, y! Y{; H% _" E& A+ _
act=0;3 [# W7 V) _3 c6 k3 ~
num1=str1[0];
& ?: }. a5 K- m) ]( D, |' W+ H' bnum1=str1[8];1 ?- J# Y& d9 M8 @8 D+ E% Q
memset(str1,0,11);, P7 w$ f: Y2 v. E
memset(string1,0,2);
( K2 `' P. n9 v& cnum1=str1[0];! U$ i7 X$ m6 U) B% M) v% y9 ?
num1=str1[8];1 k3 f2 M1 r6 T7 t: V; _6 t8 V
k=0;
! Z4 C% r- O5 \( M: b. [. d}
2 H/ N5 N- V, f. u/ @longdelay(350);
' m3 Z F* R$ l3 Aswitch(key1) //显示部分
+ |! ^) {) N' }# e! V$ h8 E; T4 Z{case 0x11: dispcharacter(0,i,'7');i++;break;9 t1 f; }1 ?; y. I2 W/ D. a
case 0x12: dispcharacter(0,i,'8');i++; break;( y* u# Z# ^4 J! R# M( J
case 0x13: dispcharacter(0,i,'9');i++; break;
, |/ ~2 e. r4 K7 I. ^5 Zcase 0x14: dispcharacter(0,i,'/');i++;break;. w6 \# @4 E0 x5 m4 j( r4 X
case 0x21: dispcharacter(0,i,'4');i++;break;: s5 {0 r3 n8 ~2 G1 V
case 0x22: dispcharacter(0,i,'5');i++;break;
( |7 Z! b% {) e2 [+ Kcase 0x23: dispcharacter(0,i,'6');i++;break;/ v/ U# C/ w; p# o+ Y3 D/ X
case 0x24: dispcharacter(0,i,'*');i++;break;: H7 r; P5 L% m+ o2 A* t
case 0x31: dispcharacter(0,i,'1');i++;break;0 t4 E: m+ o C9 D" p; Q2 o! y
case 0x32: dispcharacter(0,i,'2');i++;break;/ ?- V1 ]* M8 n2 I
case 0x33: dispcharacter(0,i,'3');i++;break;
" X1 P8 j" \; v g2 U8 y& _case 0x34: dispcharacter(0,i,'-');i++;break;
' o9 e% v5 {. s# Kcase 0x41: clearscreen(); break;1 P! c% K9 m6 i4 b
case 0x42: dispcharacter(0,i,'0');i++;break;' ~6 Y2 M- H$ ]# U* I( a! v! ?- i
case 0x43: dispcharacter(0,i,'=');i++;) t5 j# S% d6 p" E. u
m=result/10000;
$ A. M* | u% y result1=result%10000;
/ L& p' L9 |; z3 I( g, {; d5 M if(m!=0||result==0). h( @" L' }( R) o: a
{
1 E5 T' M5 t$ K n=0;: v' P5 g. I3 h. r* b
m=m+'0';
% Q! F% @% k0 O6 C$ ] dispcharacter(0,i,m);i++;
8 J0 A4 S L0 w2 a0 M4 y }
" }0 H: o2 `% Z# M* O0 a m=result1/1000;
) ^2 I" J4 ]- L result1=result1%1000;
9 C' g" _0 o3 Z# B; B if(m!=0||n==0)
5 U4 c0 Q" x% x {
6 \+ ^% h1 I; `& Z2 T m=m+'0';
) E8 @4 |" n! W v+ C1 Y' s9 W$ V n=0;& n; a. p! Z! @
dispcharacter(0,i,m);i++;* C. H, ~( [$ a7 m
}
9 R0 i/ F/ x$ K) S9 f; I m=result1/100;8 F* A9 T) Y& a: C; H0 J T* O9 z
result1=result1%100;
" L O5 z" a) m: |: } if(m!=0||n==0)
1 X% r7 F/ G, G4 \" B {; g" ~' P" |+ ~" k& t6 u, \: O
m=m+'0';
( N% ~& l* M5 H: R( [( J: @ n=0;
0 J* s- V5 D4 q d: m. h' C dispcharacter(0,i,m);i++;+ Y* G$ h' ?9 C( @3 R8 |
}
! V& m; O* e0 m m=result1/10;
8 P+ x1 r7 v* w' d result1=result1%10;' O" H3 T+ \9 l6 f
if(m!=0||n==0)
, s. L' I& K9 i: E3 x4 y B {
, `1 B) m6 z, t7 N# \; n m=m+'0';
. r- f9 N' t( K* N' p0 Q& i4 Z n=0;+ P- ^$ y/ x$ _ O8 I) o, D
dispcharacter(0,i,m);i++;: }; s' {/ J+ Z% `5 E% y* O
}3 H. F3 _5 ^8 d2 R
m=result1;
/ C+ y) [% G3 X$ [" M0 H5 d if(m!=0||n==0)
+ O o/ M" Q m9 _( Y& v9 }5 q m=m+'0';
$ H- U& \8 U: F& N6 e1 s6 k3 I dispcharacter(0,i,m);i++;break;# l7 ?; F" J! J" j/ Z8 ]9 ~" C
case 0x44: dispcharacter(0,i,'+');i++;break;/ ^' X4 i2 k$ e( F" ]
}
7 z6 Y- E" A% Z/ I1 C0 preturn(i);$ S4 L) t8 h' {: R2 t5 a8 L4 y
}) E2 ?. A. O: K0 d8 R: z R
//---------------------------------------------------------------------------------//- Q8 }4 b* I* V I
//-------------------------------------主函数---------------------------------------//
5 c4 }0 F, N+ J4 C2 \; Evoid main()/ t/ }5 b( z- n& l
{
$ E. a' i2 @% r* A/ O9 s* ^char key1,i;
$ D; ^7 p5 x) l' [+ ?8 Z* _start:initpindata(0);
0 P1 Q/ |& z! ` @: SP2=0X00;
, \3 G& ^% \8 _* _) kinitLCD();( I) }( R, b; J) Q) k
i=0;
\ H5 a: ?2 m1 q# b& Kscan:key1=key_scan();
; e4 y K. ~* m2 D+ c8 ti=compute(key1,i);
1 s/ @& _ j5 A& h7 c+ G/ q; aif(key1==0x41)
: k4 D+ M Y: V7 d. E0 N! Sgoto start;
+ f: j; A: S- ?0 q* |2 eelse " d9 A4 j ]" s/ R% q+ f
goto scan;& z- G* Z8 Q" d. p
}
- o z& `' F7 W% k3 F% o# E/ x" D( L# }2 d8 F* F
单片机计算器仿真工程文件及其源程序下载:
% m0 f; }3 _1 F' b1 z9 f
51单片机仿真计算器.rar
(202.58 KB, 下载次数: 2)
; `& U1 ?2 u# _- b
) f( u; Q2 K! W @: j |
|