|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
参考了宋雪松老师的教学例程 ,源程序只能计算加法 ,本程序稍作修改后 可进行加法和减法计算
* ~& G: i: H6 o5 H& l4 N#include <reg52.h>
& ^5 F; e4 O8 l w2 C#include <intrins.h>3 H; L4 I' y! Q/ E" O, Y$ x
#define uchar unsigned char
) K/ k2 k2 w8 L4 R#define uint unsigned int - [$ E9 e$ t4 ]- Y. i5 F
uchar code table[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //共阴字形码& q. m. D% f- H% q7 e3 ~. i2 t7 R
uchar code keycodemap[4][4]={% x2 c: g( ?( v1 L+ l8 s$ d2 ?# ?
{ 0x31, 0x32, 0x33, 0x26 }, //数字键1、数字键2、数字键3、向上键
- N3 Y8 m T) ]2 k5 F5 h8 q { 0x34, 0x35, 0x36, 0x25 }, //数字键4、数字键5、数字键6、向左键1 P. I1 p2 T0 H) y' L+ L/ A+ x
{ 0x37, 0x38, 0x39, 0x28 }, //数字键7、数字键8、数字键9、向下键
# u; i. J$ e) f- w, h4 x { 0x30, 0x1B, 0x0D, 0x27 }}; //数字键0、ESC键、 回车键、 向右键};
6 J- N6 u1 s5 S' Quchar 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 弹起- W8 t) W" t: H0 Q
uchar Ledbuf[6]={0X3F,0X00,0X00,0X00,0X00,0X00}; //数码管显示缓冲区,第0位为最低位(个位) ,第5位为符号位1 A b: f8 R+ _* I, E9 J1 D
long result=0;. h$ X, n0 U+ \, m/ P
long adden=0;
/ c- r& O' a4 G5 a! u$ ?# V8 A8 fsbit keyin0=P1^0;
7 B4 O5 m9 X f# g- Bsbit keyin1=P1^1;4 O) o, [! O" j
sbit keyin2=P1^2;
8 B9 D2 ^/ w9 v4 j8 S2 A$ Gsbit keyin3=P1^3;
# x {4 e: Z. y; r% k6 D: |& S& a! H% a9 j' X' m. v8 i
sbit keyout0=P1^4;, X% R8 [: i) N, j
sbit keyout1=P1^5;0 T( B' a" |% d- u7 E1 y8 b
sbit keyout2=P1^6;4 e8 s+ u/ ` |" H! z9 E
sbit keyout3=P1^7;
/ z* ~( x3 L2 [1 R* P9 ^9 R2 _1 P" A1 I' A* _3 O
void InitTimer1(void) //定时1ms
8 h* |. L. U6 E; P{% V0 Q& U% m0 @! l
TMOD = 0x10;: j, M3 F- b1 n- ~& K7 Z
TH1 = 0xFC;0 `' w6 S& d" V; _
TL1 = 0x18;
# o1 w; H, C, G/ }% \) V: h+ k1 @ EA = 1;
9 w: {+ g8 H, j* T, Z4 r3 ~6 l ET1 = 1;0 m( S) f( X, M. y& ~
TR1 = 1;2 j- O/ z9 B& f# h- ?6 P
}& b% _+ m" ?/ y9 n; i
) W* D( v1 m% U6 D, `
void shownumber(long num)
8 H! I8 n7 h' `) Z {
, h1 U) }: Z0 Y0 U/ p- N3 {4 Z/ c static uchar buf[5]={0,0,0,0,0};
& Q! p3 z! A5 v; i# ?* m char i;
9 z4 Z+ q2 M) w& x, m1 n. n/ ]+ }2 y if(num<0) //负数为补码 取反加1得到原码/ \3 D. B0 C3 J/ O4 H
{ num=~num;
" }5 T: R i0 j* l2 V( C8 O num++;0 n5 B; n" i/ a/ q+ _
Ledbuf[5]=0x40;
5 {8 M1 a7 Z7 O% Y5 e }
0 _, ` Y, M( h g* T$ c, C. \ else8 E, E& R' W' g$ v; r! P3 l5 o
{6 v; H% R# m: A
Ledbuf[5]=0x00;5 q5 H8 {* t0 Y* c4 V+ G5 E s! G
}: c! [% I+ ]' ]/ P- Z
for(i=0;i<5;i++)
, _- g& M( p) |9 z0 E5 b3 `6 o {buf[ i]=num%10;3 y" b0 f( P' _, j! n/ w
num=num/10; } M1 R5 J4 v% r/ [1 X
2 A4 m# G1 @9 l$ ~1 Q! e E2 c0 A" v for (i=4; i>=1; i--) //从最高位起,遇到0转换为空格,遇到非0则退出循环, G1 k/ }! R5 ?7 {* B, I2 A; n
{8 ^ l) \0 F- f4 [5 s) T
if (buf[ i] == 0)6 _3 c- a/ S+ R: S
Ledbuf[ i] = 0x00;2 E H2 z) o; N2 y$ E
else
: W( E) [ k! E# }% q break;9 ]) \) g. o" H" v" o1 B2 n
}
$ |" _. a5 R/ x+ I
, r _, F) j" T" g( N for( ;i>=0;i--)2 c+ T/ F- J- X: M2 v' R
{Ledbuf[ i]=table[buf[ i]];}
. Z; K+ n$ n4 G8 x |. j1 o
4 L1 E4 M. p {/ P- w }
) ]7 q3 O* V T+ a void keyaction(uchar keycode)/ P0 g! F; ~9 k
{
- P: I$ h& U9 Y& M; X7 t0 }7 \ long temp;
* R U5 F# E; K! Q& u$ S0 E static uchar yunsuanfuhao=0;+ Q9 z+ b0 B; w9 p" S6 T" N
if((keycode>=0x30)&&(keycode<=0x39)) //按下数字键
% f% z& T% o# A' |4 |# a% G {
) F9 \. Y0 J- g% J& y) r/ w temp=adden;4 O( H7 f) j5 B- V0 I) [
adden=(adden<<3)+(adden<<1)+keycode-0x30;& d. m% \! R& x, D' T3 V
if(adden>99999) adden=temp;
( ~ H& g- s, W C/ O4 x. k8 f# m7 R shownumber(adden);, L( B$ q' {& ?5 }
}% o2 [+ s! |7 P. }# m
" r( p( d! x2 R* ^ else if(keycode==0x26) //加号键
5 q' Y% n w" z: }1 P {, z# U5 N; B- Q9 [
yunsuanfuhao=1;! B) |; [ u q0 p5 k
result=result+adden;! S( q m% \8 |: B
adden=0;
$ X$ r: u0 E4 a shownumber(adden);
/ U* N1 ~3 |) l8 R+ E l1 i* z+ v2 e }* M# ^ d, t4 Z3 h0 F* L
else if(keycode==0x25) //减号键
/ i6 Q; Z n! d6 m {
% R% _6 q' t/ g' [ yunsuanfuhao=2;
4 K' i/ } V c! } result=result+adden;' W8 T7 W6 p4 N; m+ `7 ^9 H8 r
adden=0;
, f8 F8 Q( ?: D" N shownumber(adden);: L2 u8 Y5 |2 T! J' b4 m8 u5 ]9 E
}, y4 S$ q T6 D. z! S; {
else if(keycode==0x0d) // 等号键
, Y L( W" g' i+ _ {, Z; I4 w7 }. V
if(yunsuanfuhao==1) //加法) m5 l8 h1 ]" k6 ]# t& F8 j
{ result=result+adden;
4 \; a3 M* m7 W7 T% H: ~ adden=0;1 e4 r8 w& X# E( |' R1 c
}5 o1 v) n+ V" X1 x0 E
else if(yunsuanfuhao==2) //减法
: p" _( R: P: z' ~ { result=result-adden;
! \2 C* i+ @; c+ a adden=0;
+ O7 l1 c3 @7 S s# V7 Z* R }. y q3 R# u' k
& ], N2 X, j1 J- O3 o4 g7 I
shownumber(result);+ G k! T8 I4 m f1 I3 ~
// result=0;
8 H8 `0 p& z6 _/ u% ]0 {# Y }! J; d. A ]. D
: T2 ?& _: P" x" ~- e6 f
else if (keycode==0x1b) //清零键
9 N. K7 ^) \$ t) ]. _* T {5 k) q6 f3 m' h# Q+ b" b
result=0;9 L: N a/ j( t. h
adden=0;6 ~. L0 H: V7 j, b0 o( H6 [
shownumber(result); 1 R; B: ^1 D. l" z
}
$ t* B7 W0 o5 z& _1 i' Q
1 W) e9 W4 \: k" k& }- R }7 \, r" y0 R: u5 |
; a! W, O' }0 t8 s5 [
4 h! k3 E8 z: c/ T- j
) }: a; r9 v$ b0 I2 Z% [" c
+ n2 j; j+ S! S# b
+ B t! V2 a9 G/ j; _4 b' d# L2 ?
0 E9 _0 J$ z8 f9 t void keydriver()
/ }* f4 X% L$ M/ \) m- B {
! k% c* k' o: h* g: Z/ f uchar i,j; //i行 j列! w( [6 L; N1 p. ^) k* o
static uchar backup[4][4]={{1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1}};
3 X0 u. M7 W' A! N for(i=0;i<4;i++)
- n. E2 y3 e) B) M {
& Y' @* x) G# |7 a: p for(j=0;j<4;j++)
% Z2 |" X7 w0 u! H: _ { u, x" C" i$ H6 A5 b4 l5 |7 X
if((backup[ i][j])!=(keysta[ i][j]))' \- t5 u! O- T. R, |1 Q
{
0 m) T( e7 h+ O% A $ d: z3 `3 ?$ Y7 a8 U3 Z
backup[ i][j]=keysta[ i][j] ;* H% @# c& {: ]* x! a
if(keysta[ i][j]==1)
" w7 H" O7 I r+ a {2 L3 T9 W" F# H* }' }" S
keyaction(keycodemap[ i][j]);
3 Q |" t1 D; T2 o }
5 Y$ |/ }$ I4 p }
4 {0 \7 H. l* \, v0 j! G, j }
" Y# A1 x& N" b7 g5 F }
; ~$ e+ W/ b; j/ ?% ]* K3 |5 ? }
) |+ n4 D, @2 a7 M+ E+ ?
) T5 P0 U- a" K9 n; n$ z" G: R
4 H2 i0 @) A( S6 n/ Y$ U) @" } void keyscan()9 q7 j: I9 T# I
{
$ D- {- Q1 R7 a3 Q static uchar buf[4][4]={{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff}}; , c1 {5 B. O8 Y
static uchar hang=0;& S$ w0 S9 A+ i
uchar i;- c( g2 B7 m5 _2 F: K! @
buf[hang][0]=((buf[hang][0])<<1)|((uchar) keyin0); //按行进行按键值的读取 读该行共4个键的键值 进入buf[hang][0-3]( E7 e0 e& Y; a/ ~& D" |/ b4 [
buf[hang][1]=((buf[hang][1])<<1)|((uchar) keyin1);' [5 A0 _! b& b I3 J- Z- ]- y
buf[hang][2]=((buf[hang][2])<<1)|((uchar) keyin2);
7 B. p( E* g, R" e) Q( O* m: k buf[hang][3]=((buf[hang][3])<<1)|((uchar) keyin3);
+ [$ B$ J6 G( c) R
2 A4 H/ a6 U: Y# g8 { for(i=0;i<4;i++) //判断该按键是否按下 即keysta是否为0 经16ms后读取buf[hang][0-3]的低4位值 观察是否为0X0F 或0X00
6 j! j" ], `( }( d {
V6 x/ V7 @4 d) a if (((buf[hang][ i])&0x0f )== 0x0f) keysta[hang][ i]=1;+ {, z, ]. N3 {& ^- l4 }
else if (((buf[hang][ i])&0x0f )== 0x00) keysta[hang][ i]=0;4 t( H) g/ _. a& ]/ X$ W9 _* @
}6 r. o+ o7 p; ~# S! L
1 @# Z Z+ ]5 @3 |
hang++;7 m& P5 [3 s, ]* P* l9 u- V( e
if(hang>=4) hang=0;
/ b+ _0 o! _+ y6 }% h, \' C' ~$ V. ?5 }% o1 O
switch(hang) //按行扫描,选取第i行,该行线输出低电平' _2 U* p+ ?* Z5 W* ? r7 F/ {/ }
{3 d: e4 N: {3 [; u) J7 S
case 0:keyout3=1;keyout0=0;break; // P1=0B1110 1111;1 _. P1 t9 z ^3 ]) Y, O
case 1:keyout0=1;keyout1=0;break; // P1=0b1101 1111;
& s2 N# [! _/ b, n' @( \ E- o3 _ case 2:keyout1=1;keyout2=0;break;//P1=0b1011 1111;/ b9 p& a2 _: Q0 ^# H2 _
case 3:keyout2=1;keyout3=0;break;//P1=0b0111 1111;
$ \% p8 b4 H) [7 [$ p0 H default: break;
! e8 w" U: c3 V, |6 E }
+ J1 x# ]" x2 p! ?
) k3 E: T" r: c- W; i+ {4 b X/ S. d: @) ^1 v; e
}! y- Y) L% S% }- B7 C
void ledscan()+ m/ M P& j, Q
{- e! u% C8 j6 J; _
static uchar i=0;
' a% \' |; K1 Z" f4 p P2=~(0X01<<i);/ v. K. `' x0 f* C3 O
P0=Ledbuf[5-i];
4 _0 D6 v# z: z I. Y. O k i++;! |8 Y: z0 r# S u
if(i>=6) i=0;% A( K1 H4 O1 Z
0 `% _! L1 M' e4 f/ ^, Q, b
}
9 O0 X. l- w4 I D$ L, U1 s8 a/ n void main()% D& i" l" k; W" g/ N/ ~9 K
{$ A; b% m O* v/ ^, I( Y6 |
InitTimer1();8 }; q. t n' _+ w- t4 ^
while(1)9 a( H; d. b( R! Z# j T2 [
{
' l+ S( X; q3 n3 q keydriver();" ~: @; V" m4 I* P1 E
}
4 i; Z; I( y; |" n E! h; J } x/ X) l1 q8 x4 @! b. L. c
void timer1(void) interrupt 3
4 J3 U; @0 _) ` {) }3 x$ W3 c2 e! G' A0 J
TH1 = 0xFC;4 r' N+ Z% t/ e- V! I+ X8 h9 p/ I8 u4 w+ v
TL1 = 0x18;
, t! k& e/ o4 g c6 e) L keyscan();6 A/ {* R7 _9 D- `# Z- q+ \# i
ledscan();
4 D0 V! _7 o4 q+ t: |/ S* C }
+ H8 ~: d, A2 r4 i |
|