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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
参考了宋雪松老师的教学例程 ,源程序只能计算加法 ,本程序稍作修改后 可进行加法和减法计算
2 g! r7 O* L( g1 R- _#include <reg52.h>
# n1 e& \3 N4 i! N#include <intrins.h>
5 r1 v* x1 f; G4 ]9 X' S- L#define  uchar unsigned char. [8 k  x) b4 u7 G3 m* U
#define   uint unsigned int 8 i" s. ^2 O5 ?& g. A6 ~
uchar code table[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};           //共阴字形码; A( f* D6 L) S- c2 L- B. n* L# [! S
uchar code keycodemap[4][4]={
+ p: Z& ?: h' i5 S- \    { 0x31, 0x32, 0x33, 0x26 }, //数字键1、数字键2、数字键3、向上键
$ d, C4 g! ?% }$ L; k# w6 z$ ~    { 0x34, 0x35, 0x36, 0x25 }, //数字键4、数字键5、数字键6、向左键, M1 |3 O. _# Z9 n1 a
    { 0x37, 0x38, 0x39, 0x28 }, //数字键7、数字键8、数字键9、向下键# Z: v0 X% O/ o2 u. _% V$ T
    { 0x30, 0x1B, 0x0D, 0x27 }}; //数字键0、ESC键、  回车键、 向右键};
/ ~' s" O9 C$ L9 V4 }/ ]) ]$ G) t4 Uuchar 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 弹起
$ n+ n7 _  @2 U  [$ j6 Iuchar Ledbuf[6]={0X3F,0X00,0X00,0X00,0X00,0X00};                         //数码管显示缓冲区,第0位为最低位(个位) ,第5位为符号位& Z5 t% p1 C* r4 p: f" z! m/ i4 M
long result=0;4 f* \+ d* @2 Y8 y1 W
long adden=0;! e5 a) {& a% I5 i
sbit keyin0=P1^0;
: _) m; b5 X: |; ~: O. Msbit keyin1=P1^1;5 t! q. f* K; ~0 W( p, |9 H
sbit keyin2=P1^2;, A" u! [5 r7 W& S9 s8 y
sbit keyin3=P1^3;* i! ~: t0 O. u5 ?
! C' Y2 d3 @: \; J9 e" f3 \
sbit keyout0=P1^4;2 Y" F" ?6 J) C) D
sbit keyout1=P1^5;
- q- U% C9 y$ @  f& J' R/ O) c' Osbit keyout2=P1^6;# g( I$ E2 @8 ]( B' a# m) L8 X
sbit keyout3=P1^7;
4 U5 z% w: G$ q  s
7 n9 I0 b8 i1 d! U7 ? void InitTimer1(void)        //定时1ms
; @. D7 p6 C4 s4 W{7 Y" A6 M6 M) ^1 r8 l' L
    TMOD = 0x10;
9 R7 Q5 K. M3 o  p# Y+ X& y    TH1 = 0xFC;
0 G. U* y# c8 U    TL1 = 0x18;/ E! g& t3 B- K7 a' D
    EA = 1;
  a2 b" z- {$ ^" q2 u    ET1 = 1;& m& i& v. ?4 e
    TR1 = 1;
+ x- P2 g( C3 M, S) m6 y}. F2 {' T! G& ~7 ]# i- `
. u4 B8 I. S9 K4 V6 \& O1 x
  void shownumber(long num)
4 P. P7 I- b& u( e- x5 v% c: l+ f  {
( Y  V9 l  V3 C, ^% [& Z     static uchar buf[5]={0,0,0,0,0};
& @- d7 I6 H9 ]" p3 _         char i;
1 f# p: C2 Z/ w8 [! ]" P7 z         if(num<0)                  //负数为补码 取反加1得到原码
' p; d5 B2 ^5 l         {   num=~num;5 g( t* m& R! ^# \4 Q" T6 w
                 num++;
  Y0 S7 h0 E* z* ]4 k' E$ x1 g% L                 Ledbuf[5]=0x40;9 L, ?! Q- J6 r9 _+ |
         }
& k9 g- D3 c5 t2 e3 |! G( G8 Q  U          else
7 i: R* F0 z+ ~$ B          {
/ i1 Y$ c' @; }* t           Ledbuf[5]=0x00;
' G2 q" M0 `( w          }1 d9 O- P3 b: E. B/ U& B8 X/ B- d
         for(i=0;i<5;i++)) O. K' q& U$ i' |6 ]" A
         {buf[ i]=num%10;8 h$ I$ Q/ }- U3 i% {1 \, F
         num=num/10; }1 B2 M2 I7 H. b6 W
) s# f( b5 ~  m- R  J+ P
            for (i=4; i>=1; i--)  //从最高位起,遇到0转换为空格,遇到非0则退出循环! z0 b4 p2 M$ N7 V4 ]' K" T9 E
    {) Z2 g- _' F' [8 p5 j8 x' j
        if (buf[ i] == 0)
5 o7 a" Q3 q. H7 g8 M' O+ H            Ledbuf[ i] = 0x00;
7 Y7 P) ^! P. R+ \* a        else, ^! |/ I1 Y) g6 G: c
            break;# L2 S. M' ~5 r) x' j5 t3 \, E
    }
2 I8 I2 D! A  c' o1 q" M8 H
- ]& S# x# }5 m/ L3 [/ P. p6 J  M        for( ;i>=0;i--)
3 u. E- w& p6 `. w2 o        {Ledbuf[ i]=table[buf[ i]];}1 B0 i( U- U' t
5 w# c. R7 b& ]" ~
  }5 d" J+ q, y, P, k2 [: O
  void keyaction(uchar keycode); f" p% k. e3 i2 O0 D* t( r1 e/ V
  {
7 h. S4 x$ r% L& G: S/ K4 r3 o     long temp;( `5 \( A7 D5 O, X9 G8 }
         static uchar yunsuanfuhao=0;
- ]8 ]- n# u  R- n5 w" e- Q9 Y& @2 E     if((keycode>=0x30)&&(keycode<=0x39))                  //按下数字键* V* L" [4 U8 f8 g4 o& q
         {5 l4 O  _& L( s! N: N" r8 V8 h
                temp=adden;' K# n# X1 p; \4 K* c  p% f
            adden=(adden<<3)+(adden<<1)+keycode-0x30;
$ l0 q) N3 F' g                if(adden>99999) adden=temp;
+ Y( a8 r4 D7 G5 R9 c- O                 shownumber(adden);
0 X5 N" J* x  g/ T1 Z. C         }
( ^% O5 O5 u2 a0 t, S6 Y9 l/ D
- N* Q* M) X. e* R# V3 @* e7 P( \         else if(keycode==0x26) //加号键
2 Q% @0 A( L- }4 f2 O         {
" C/ ?; q5 w2 U2 ]            yunsuanfuhao=1;0 Z! ~" o% a* v3 r
            result=result+adden;) _1 A4 V  b+ ^# E5 X7 X
                adden=0;
3 [' i& `, L+ R, d                shownumber(adden);
+ E5 b+ ~* @0 j9 b         }0 R% H. M4 S* ]. B
         else if(keycode==0x25) //减号键 ( Z$ a, w& Q9 r- F
         {) d8 m( ?" E) V2 V' N
            yunsuanfuhao=2;
' J8 s* z) P0 j4 e8 f            result=result+adden;) f7 y; Z4 [. U# v
                adden=0;
/ O2 A0 T6 K. |9 O! s0 A  y: L                shownumber(adden);
- k8 j! C* t* ^- `: M+ G/ n         }
% f. _+ T) j/ P! }" r1 P& i         else if(keycode==0x0d) // 等号键# ~* I* g1 g: ]6 c! P3 Y' Y9 D
         {; _9 k* T, |! [
            if(yunsuanfuhao==1)           //加法
5 q$ P3 ^6 _- n$ l, m( e           {        result=result+adden;
6 t! \; E  m  T! q8 d: @" U9 d; b                    adden=0;
" Q1 D. S# l5 ]           }
; ]2 }# f( x, i5 {! E5 D% |% R            else if(yunsuanfuhao==2) //减法
) N* q4 ?1 v4 Z8 _" m& p           {        result=result-adden;2 H" }# Q) W& {3 L- t! O( C/ b
                    adden=0;4 ~* ^5 k5 U8 |0 Q$ [" g5 F8 f, l9 o. \
           }
; f; A) u3 b( E2 P7 g& `5 Q. J1 k
                shownumber(result);
% h1 j' T+ M4 {        //        result=0;
" H. U2 z( a. \9 w5 e: \         }0 ]5 J+ q) X% C" K' g+ y) Z

3 V" w# g6 v* V7 r) Q+ ]4 A        else if (keycode==0x1b)                         //清零键
2 j2 @7 w5 \3 i$ H        {1 P6 R  H+ z( `: o3 Z
           result=0;  p4 r2 n( |! E6 v' C- e+ X+ b7 n
           adden=0;& P3 Y9 q2 Y+ K
           shownumber(result);        
& m2 L. F6 Q/ c2 _3 w+ C        }
3 H' [  Y0 s  z
0 U" J/ l% r' S1 ?, X  }
- V$ Y( A+ p7 _/ s
* Q+ f1 o! X2 ^- T1 x
4 d7 B1 Y7 k: R1 a' G
5 D8 c3 ~7 \8 l; B' J5 Y: Q+ A
( ^" U+ J0 c  c# B
& z/ s0 B3 ~9 |1 E; Y9 ~
$ P, {1 Q9 F/ a! l2 r/ g  void keydriver()
* t/ X# Y% G' B; g( p$ o. H# s& f  {  g. w& l0 K6 h) R1 ]2 }. [
                    uchar i,j;          //i行 j列6 H# [" k2 n4 ?; [" _
                  static uchar backup[4][4]={{1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1}};
5 q8 Y. g. k* {( e7 M% g2 d" z- D7 _                    for(i=0;i<4;i++)
$ k* |4 _+ ?  T8 v7 l           {5 v& T" y: r8 ~: `
              for(j=0;j<4;j++)4 a7 {& a! Q" z: N
                  {
/ Z1 H8 s' `( [! A" \6 k                     if((backup[ i][j])!=(keysta[ i][j]))
  w: O7 ^( g& ^4 s, s" ^. H3 Z                         {7 r2 j# F( [' g
                         # C! C# r, u6 [& G# k
                                   backup[ i][j]=keysta[ i][j]         ;
$ a9 V! ]9 S, ~( V7 G                                  if(keysta[ i][j]==1)
# E; h' y' F& |! C* H                                  {
1 g3 ]& Q$ W; e4 B$ |" n/ u2 y7 f                                    keyaction(keycodemap[ i][j]);. w* T6 `! h& B% h
                                  }
3 ~, s6 }/ w9 ^                         }
7 \* k. `0 d; s; ^, v2 ?                  }
% f2 w7 Z+ }9 m" @           }
1 w6 Q) U: r( \. {! a: l, n6 O  }' ]4 @2 W/ A! X- e8 e
. a: i0 s+ x: b! ~8 e! G

; Z" X5 u, [3 }$ s5 _ void keyscan()3 ^6 V: G+ C1 [* z5 \* v4 `( x
{8 D: n% C. I7 x8 W+ Q) ~
    static uchar buf[4][4]={{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff}};   O/ ]7 T3 h/ S+ B
        static uchar hang=0;$ ^3 s- e) F) h2 r
        uchar i;2 s' }0 A2 L* s9 W" m
         buf[hang][0]=((buf[hang][0])<<1)|((uchar) keyin0);        //按行进行按键值的读取        读该行共4个键的键值 进入buf[hang][0-3]
2 @  R, j3 ?1 F" R1 D' T) z        buf[hang][1]=((buf[hang][1])<<1)|((uchar) keyin1);: p- J4 u, v, Y% D3 P& b
        buf[hang][2]=((buf[hang][2])<<1)|((uchar) keyin2);
6 O+ k. ?5 x; m- q/ `8 x        buf[hang][3]=((buf[hang][3])<<1)|((uchar) keyin3);
  K5 ?# J5 c5 X: P1 j* |" k" c; @% y! t( G* z
        for(i=0;i<4;i++)                                                                                                   //判断该按键是否按下 即keysta是否为0 经16ms后读取buf[hang][0-3]的低4位值 观察是否为0X0F 或0X00+ k$ ~! S( A  i; o$ F. Z$ v1 J
        {- ]3 ]" S2 e8 y3 H4 M( W
          if         (((buf[hang][ i])&0x0f )== 0x0f)   keysta[hang][ i]=1;0 k9 N) u  o0 t3 h7 \9 x
          else if         (((buf[hang][ i])&0x0f )== 0x00)   keysta[hang][ i]=0;
& m' i+ o1 r4 p, S* y- S         }0 {, U7 g5 x6 e$ Q6 ]
! S( }/ B9 G6 j5 q/ C; k
        hang++;
8 S! h6 n7 e& X  y# F6 ]! J        if(hang>=4) hang=0;! [( c# M2 W$ y) N# _) ?( T) X
) @: X) }1 m& s6 ?+ T! [& {& Z
        switch(hang)                        //按行扫描,选取第i行,该行线输出低电平0 e% s; a' t' ]* O2 ~7 m% T
        {
- E# A" C; y0 i2 X6 ]: T          case 0:keyout3=1;keyout0=0;break; // P1=0B1110 1111;$ I, V  _5 z7 y
          case 1:keyout0=1;keyout1=0;break; // P1=0b1101 1111;
9 `  M6 s5 j+ K7 J4 W' ?3 B. p4 M          case 2:keyout1=1;keyout2=0;break;//P1=0b1011 1111;
- Q6 e# T8 k/ n! I9 S          case 3:keyout2=1;keyout3=0;break;//P1=0b0111 1111;+ \  F" {3 y' S0 u4 y
          default: break;& g# Q4 @' z2 s) c: l$ @: z
        }7 M8 F4 n1 v' F2 K. Q
        / e( P$ ~% L$ q6 n4 _! U

5 r8 |+ a8 p" N+ q8 Q( u }3 J6 R% \8 G$ w! z, D6 L$ w
void ledscan()/ o" [7 b# n  s" ]
{
/ U# f3 O0 L5 k1 @! k) I     static uchar i=0;, y! ~5 V4 m% p' O1 a7 ?0 G" G* O
         P2=~(0X01<<i);/ s* Y, m" |+ V
         P0=Ledbuf[5-i];
- i% R( Z+ C- z          i++;: u. h# f2 W& Z" A  }$ H' p6 X8 \) a% f
         if(i>=6) i=0;
' Y( }5 `( ~! `2 t" X0 O( a/ U, r6 ?. O3 P- |/ k
}2 c# F, E0 `& _3 j/ g* a/ A
  void main()
# [6 U! l# S' d' } {# O) E' `+ o, l
        InitTimer1();% X3 d+ C$ S9 Y/ l$ p4 x  j
        while(1)
" A: ?9 d( ]$ z8 ?9 b9 R        {+ G1 N1 e1 o8 r# F  E# ]
          keydriver();; M& ^* \9 E5 c' T) o9 I
        }
% ]1 ?2 A+ N) X }; p# ]: i9 h. `; Z5 R% M7 e
void timer1(void) interrupt 3$ d+ f0 \0 X( n" `& X
{) |( o4 o( U1 Y  |4 |0 \
    TH1 = 0xFC;+ O# w1 ~$ X) t$ Y' C
    TL1 = 0x18;                                       
# Z- e! j/ I) z7 l! {+ U, x5 t    keyscan();9 P! k' Y( D* L8 X1 l' \7 J9 D% q
    ledscan();% m3 G1 f- a" x/ m# B  w! L% \0 |# \
}: \+ v* y! p: q3 A1 {" u

该用户从未签到

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

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-7-18 13:38 , Processed in 0.125000 second(s), 23 queries , Gzip On.

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

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

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