|
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 {
|
|