找回密码
 注册
关于网站域名变更的通知
查看: 178|回复: 2
打印 上一主题 下一主题

简易加减法计算器 单片机代码

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2022-6-29 10:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
参考了宋雪松老师的教学例程 ,源程序只能计算加法 ,本程序稍作修改后 可进行加法和减法计算7 h/ }3 b$ j0 n" o6 n$ f* C. R
#include <reg52.h>
& n! l6 g9 y6 t6 a#include <intrins.h>
7 U3 U2 G* M/ {+ d$ G#define  uchar unsigned char
- W6 ^2 i0 y7 I9 Q& v. o! H#define   uint unsigned int
3 A& m' a, V% ouchar code table[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};           //共阴字形码& p! M: g# b$ z! U
uchar code keycodemap[4][4]={. _' h! W8 b9 d+ `9 J4 M) f
    { 0x31, 0x32, 0x33, 0x26 }, //数字键1、数字键2、数字键3、向上键
/ q& I3 B# O! W( L4 p; y    { 0x34, 0x35, 0x36, 0x25 }, //数字键4、数字键5、数字键6、向左键
8 ]& [# ]3 P0 _% p, L( K/ A8 @    { 0x37, 0x38, 0x39, 0x28 }, //数字键7、数字键8、数字键9、向下键
% ?* D  X8 l: s! T5 J$ }1 Y    { 0x30, 0x1B, 0x0D, 0x27 }}; //数字键0、ESC键、  回车键、 向右键};
+ p; v4 H4 i2 H' h( L) B$ Auchar keysta[4][4]={{1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1}};           //全局变量 记录四个键的状态 0按下 1弹起 当keysta反正变化时 说有按键动作 1变0 按下 0变1 弹起4 o2 x) ~- v5 R2 \) o9 z
uchar Ledbuf[6]={0X3F,0X00,0X00,0X00,0X00,0X00};                         //数码管显示缓冲区,第0位为最低位(个位) ,第5位为符号位
2 I/ @; a* g$ Z1 Q4 Flong result=0;% t# _& D+ u1 Q) O* N; o, c
long adden=0;) n, K- T8 a; N! y
sbit keyin0=P1^0;
( g8 |) ?* h. osbit keyin1=P1^1;
9 x$ m6 m( h# M! g; t) _sbit keyin2=P1^2;) ?2 I( U! ~0 t+ x) c/ `
sbit keyin3=P1^3;4 ?" U. P) _) G# c

3 N; Z2 n* Q8 |0 b; t2 Usbit keyout0=P1^4;
; e( c( R1 Z6 h& {0 e8 fsbit keyout1=P1^5;) |3 A4 q* `0 y: ~
sbit keyout2=P1^6;8 C. }) U# G4 W
sbit keyout3=P1^7;
8 ^* Z0 F! q* \' u1 I" o" Q2 h+ o) s9 W& y/ w/ G
void InitTimer1(void)        //定时1ms  F( W: [) s4 q9 |" E# o1 T
{
! e( D9 S1 F+ l2 v2 Y4 q+ N; i    TMOD = 0x10;' p5 ?9 L' A- ?5 _" ]# V, {2 g
    TH1 = 0xFC;  ~9 N8 Q+ t2 M3 R0 ]; ?% p
    TL1 = 0x18;1 B9 u  Z5 A$ a, I
    EA = 1;/ J# E8 U3 E) `: l- D' D9 f0 e
    ET1 = 1;- C+ ]1 _, D& z
    TR1 = 1;
3 J3 h/ A) ^: |3 c) Y; X5 l3 ~3 j9 H% C}
4 V  O8 ^* p$ }3 q) g; Q2 \  v; A/ f! \& b3 _. L+ j9 ~" `: R
  void shownumber(long num)
5 \3 ?% u4 n$ G# _4 T; R' `  {5 d6 Y/ d* ?9 E" L
     static uchar buf[5]={0,0,0,0,0};
4 p, F$ d. q  s% X( P; y         char i;. q4 {7 V$ k+ A1 T5 a% }
         if(num<0)                  //负数为补码 取反加1得到原码% ~8 j; H0 W6 Z
         {   num=~num;' |; Q$ S( z8 Z- u& e" |
                 num++;
: V2 T* [& r- e, M7 f                 Ledbuf[5]=0x40;+ g/ W8 Y5 G; n! y- y0 B3 Y, a
         }
4 T6 D( Z, D$ u6 C          else8 u" m* x, a5 Y* m6 X* K
          {- d2 w0 P8 {: N, D3 c
           Ledbuf[5]=0x00;6 K) @  M1 _$ l! q5 o; i+ n
          }7 \& @$ B/ `7 V1 O( @" R* M
         for(i=0;i<5;i++)
; P$ e" c* C/ S, \7 \$ a, a         {buf[ i]=num%10;
" E" ?/ \. O9 |  X  d$ g7 N         num=num/10; }# ~  `( C& a4 m& W4 ?( F: M5 L
  _4 _& G3 Q0 o0 \5 y' q5 L6 J
            for (i=4; i>=1; i--)  //从最高位起,遇到0转换为空格,遇到非0则退出循环
; }" W: O7 B3 l& v$ ~9 B    {
/ z7 L% J+ z, Y4 k" I+ ?5 \        if (buf[ i] == 0)( Y! d; x0 A5 u& [5 j5 J
            Ledbuf[ i] = 0x00;
, a5 U, j" {. V. f; t6 |! ^& A7 F        else9 u9 ~& x$ {9 e( l; ~' ~! Y
            break;* ~8 q( s* Z7 b9 v, G
    }
) U: d) ~; A* ]% ?; |. v
3 w1 q  s3 A- a0 G        for( ;i>=0;i--)* W" O% m" \, _4 y7 ]) a; K
        {Ledbuf[ i]=table[buf[ i]];}1 y* I5 s- S* v+ x( z  D/ i

, \; Q9 A* G6 j+ h2 ^: @9 o5 w  }* A; A; r/ l: g8 B  T
  void keyaction(uchar keycode)
( R% H" h7 n0 r3 U9 J1 _  {
$ ~. O* V. |0 `1 D; f     long temp;( ^2 b" `. q8 E  N1 X; U
         static uchar yunsuanfuhao=0;
( y, ^: |3 d. x! Z! \     if((keycode>=0x30)&&(keycode<=0x39))                  //按下数字键! ]* r! u5 l: E7 S
         {
5 n/ A% ]9 s' \- |                temp=adden;
9 M% Q, h9 K" _# x: I/ z! s4 R4 p            adden=(adden<<3)+(adden<<1)+keycode-0x30;
' H3 q; c% K' k- `                if(adden>99999) adden=temp;2 D5 z( ^3 J  G
                 shownumber(adden);( C5 a0 l+ P# K2 e3 d2 v0 l
         }
1 b/ I% L) P- C! Z2 C$ {3 M* I: A) U8 h) L/ Y8 |
         else if(keycode==0x26) //加号键 0 W# k' o, B0 p  e
         {& V  @. `: u' `, D5 _& n
            yunsuanfuhao=1;
  V& a; Y# o# O& @. G0 \( I' E            result=result+adden;$ [- R, l" T- D* h7 W4 l
                adden=0;. a. A2 y. E% u# B; M0 Q* r% C
                shownumber(adden);: v. M. U  v9 b6 Z. L  Q  ?
         }
7 N; x  \( `) q% N8 q0 a! ?7 H         else if(keycode==0x25) //减号键
( O4 I# G& m! Y7 T- R8 Z& k3 t; ]         {/ y: k- |5 o/ f( C3 z. Y" n
            yunsuanfuhao=2;' J3 z; u% f- y. z8 z0 s
            result=result+adden;( a- M# T- [7 C2 i7 Q
                adden=0;
4 ]9 N; t" Y( V8 j% x9 z& e, S                shownumber(adden);2 Y$ g- N& S  i; a$ Y' R
         }
- m" d( c& t! b* A) r         else if(keycode==0x0d) // 等号键" [. E9 K, I1 q$ H* v+ o4 F! [! ~  J9 C* k
         {& A# [' |5 [, h
            if(yunsuanfuhao==1)           //加法
* ]0 U) g$ C! t9 d& d2 k. y. G           {        result=result+adden;
! |7 O3 I0 S& r# ?" U$ B                    adden=0;1 W6 q, A- j5 K! N2 U3 z/ `
           }1 v: k8 h9 M% g3 E0 o/ z
            else if(yunsuanfuhao==2) //减法; z1 `6 a+ K5 Y1 J
           {        result=result-adden;  b$ j; I6 {/ z# e  P
                    adden=0;% V- \+ L: \9 N- d6 |# h: _
           }
* `* E% e' @8 P) F5 H
1 Z2 I5 h  O) X; W: N                shownumber(result);
: K0 X1 G1 @6 L3 x; O) C& U1 g4 N        //        result=0;
' r+ E$ ~: V- w4 O4 z& U1 d) W  l         }
! ]3 A* S: X4 d4 S7 }( F  G$ I8 t( ^( Z
        else if (keycode==0x1b)                         //清零键
6 j& I0 S& ?3 M. O; W$ Q        {- b( ^; @) T4 A$ q: c( M
           result=0;
2 _) G( O8 t- s3 U4 F           adden=0;1 ?0 _  C  u3 L& S# k1 m
           shownumber(result);        
0 r( [- q7 ^& ?8 J        }
. D5 i' `, v0 C6 E) n
' v! t4 M" P! S- K  }
( ~. M/ r& i. @; F' e0 f4 H$ J" |; a; o  f

6 A1 s* E% \8 w2 ~0 g
; h, ~& Q+ d) \: e0 j  e) Y3 s! @+ m/ K, S. ?
7 Y9 j$ y- ^1 o2 j0 U
! Q$ k; b  q, X) q" c/ j' o5 f7 N4 ~2 {
  void keydriver()
8 i  o; A5 K& e" j$ Q  {# o3 T) [* a% g) T  K( H# g- x
                    uchar i,j;          //i行 j列- F' U+ R* l( i) ?
                  static uchar backup[4][4]={{1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1}};
4 `0 V2 P$ O4 ~  N3 G& ]. D                    for(i=0;i<4;i++)
1 d9 ~1 s, K# o9 x4 Z. {7 ~           {
$ E7 r) [  {) X              for(j=0;j<4;j++)/ G/ W& ]* i# @$ y2 w2 p
                  {0 s( _0 J- f. p5 S2 X8 M
                     if((backup[ i][j])!=(keysta[ i][j]))
. P! G/ h4 ^$ H  I8 l6 j+ }- x                         {) a& b8 E9 N. [" A$ ]
                         ; f% n* |+ O3 e9 L+ D/ {& O
                                   backup[ i][j]=keysta[ i][j]         ;7 o$ B( h5 k' V) m: N4 |, @
                                  if(keysta[ i][j]==1), v% s' _5 {2 [9 V4 Z) m9 p
                                  {
+ _5 Y6 K) }4 F' ]                                    keyaction(keycodemap[ i][j]);' D/ ]) z, A- a5 B1 k- ~1 E
                                  }9 W4 {1 s1 u9 o
                         }4 p; m: w4 d; c
                  }
# X, j9 R9 i" b; g4 f           }9 D( s5 u; L* b, \2 O
  }
( @$ @7 v1 m4 I! X2 g  V8 U9 L0 |: E

$ j9 N' [( g' r0 g$ O* \  x, h. v4 h void keyscan()) e2 T. ?1 Q0 Y, E  }
{
' k# u2 C* g/ ?3 Q9 h    static uchar buf[4][4]={{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff}}; 4 U. K$ c8 A: a# w* ?
        static uchar hang=0;
9 A  a( d% p) G% t5 L" F        uchar i;+ e3 x5 k- w' @# g1 _4 h, j+ c
         buf[hang][0]=((buf[hang][0])<<1)|((uchar) keyin0);        //按行进行按键值的读取        读该行共4个键的键值 进入buf[hang][0-3]' g# q7 z% f+ q
        buf[hang][1]=((buf[hang][1])<<1)|((uchar) keyin1);- ], \( b. {- j( u5 N
        buf[hang][2]=((buf[hang][2])<<1)|((uchar) keyin2);
+ I8 r$ g  q; W# D1 ?# g0 [- X        buf[hang][3]=((buf[hang][3])<<1)|((uchar) keyin3);' d6 q4 a, b' z) F5 V9 T% {& l

$ ^& [7 o, T* q' k1 k3 b0 ~        for(i=0;i<4;i++)                                                                                                   //判断该按键是否按下 即keysta是否为0 经16ms后读取buf[hang][0-3]的低4位值 观察是否为0X0F 或0X009 ?) N3 b. W2 \; {
        {
) M2 E* X+ }: _  f- u' e9 h- `  Y          if         (((buf[hang][ i])&0x0f )== 0x0f)   keysta[hang][ i]=1;' S7 _( l1 W# ~2 H$ p. g
          else if         (((buf[hang][ i])&0x0f )== 0x00)   keysta[hang][ i]=0;
9 Q8 y" a- ], x% r7 L. U         }( }/ i$ [7 l  z1 [" G
- r9 ], S9 L0 G7 Q' z3 C1 ?* s
        hang++;# a5 n, G% `5 P/ {( b- N
        if(hang>=4) hang=0;9 \: ?9 B; K/ a9 Y* h9 |+ x
9 j' ~3 \* z7 s- \8 H4 K4 w/ O
        switch(hang)                        //按行扫描,选取第i行,该行线输出低电平
: J- p0 h/ w1 _9 `( ^5 E: J        {
0 ^# z# v# x1 R: P2 e2 v          case 0:keyout3=1;keyout0=0;break; // P1=0B1110 1111;
* R* J4 m; \) B5 n! M9 P/ l' Q3 U6 t          case 1:keyout0=1;keyout1=0;break; // P1=0b1101 1111;
- F- c  T' W0 |# B          case 2:keyout1=1;keyout2=0;break;//P1=0b1011 1111;
5 o' e1 L$ T4 q; t: j: C' ?          case 3:keyout2=1;keyout3=0;break;//P1=0b0111 1111;
8 u! O1 v) [6 D. G          default: break;
) a% Z5 Y6 A% t0 X        }9 ^0 l; @) \& G/ k- k/ W
        
7 G* I2 g* Y( H2 }
2 M9 L, \  ^# I( [) I }8 B$ u9 m" A2 b  ^8 F! T
void ledscan()1 u& P7 E' E( R: |- r. V' ]: i
{
' v  n. s/ x5 Y+ L; c' Y     static uchar i=0;% S6 D5 w- |  {# l2 L5 @. L
         P2=~(0X01<<i);
) ?8 t* B" d. h         P0=Ledbuf[5-i];
4 z6 d* z. |- u& W/ E          i++;
  R# o$ y- I6 T2 d, x+ \3 @& B& h         if(i>=6) i=0;
5 o4 q% H. n9 _4 A+ o* ?
, q9 D% U; i. N0 J6 q& y }
" C+ O. x4 [/ t* S: \  void main()
( X  B3 l, G, d) r" O {) U. V  _# L* ?$ `- ]& @
        InitTimer1();
0 r  r, q* O( ?7 N4 r9 d        while(1)1 D  b5 V+ ~$ @. y7 H7 K  K
        {
5 m! Y: g5 w& @# ^9 P. Y9 k          keydriver();
. q6 F: J6 L5 Q4 g4 D        }
! ~3 \% d1 A8 P2 Z! _ }
7 c+ p$ O8 }/ P# r void timer1(void) interrupt 3
4 @$ b+ f. z! Z4 ]. k {
: |/ P+ n) }) \" R+ R    TH1 = 0xFC;/ z! Y) C' r+ m
    TL1 = 0x18;                                       
  c8 \' k' f1 M* V0 e5 w    keyscan();* z/ a2 Q& h2 H9 H( m% ~6 s2 b% w+ I' p
    ledscan();/ m  @) S( C: s/ u: p  U9 C8 \
}8 M& ~" x3 S9 {

该用户从未签到

2#
发表于 2022-6-29 11:18 | 只看该作者
看看,学习||ヽ(* ̄▽ ̄*)ノミ|Ю

该用户从未签到

3#
发表于 2022-6-29 15:54 | 只看该作者
学习||ヽ(* ̄▽ ̄*)ノミ|Ю
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-8-11 12:49 , Processed in 0.109375 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表