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

单片机开发板附带键盘检测源程序

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-1-4 09:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

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

x
单片机开发板附带键盘检测源程序
! |$ t: B$ [& ~! C/ F5 N  u; ?: a: D! ~" }2 m1 ^3 _4 N1 K

+ w# ^( p& l# \% @% E: G8 {4 {4 F#include <reg51.h>' R6 l0 J0 H% I
#define uchar unsigned char
' W! J4 ^* s* m5 h6 b+ p& V+ V$ N#define uint unsigned int
$ z) F9 x2 t, E! k" T5 C8 b. N: a( Wuchar code table[] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07,
# n0 _5 U- ~& X7 P' _1 g                     0x7F, 0x6F, 0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71};
' b2 j6 l: f1 M$ b! xvoid delay1ms(uchar x)6 G$ ^# J. L  J5 }3 l
{
" h* H, |- |% F( }/ }  c4 P        uint i,j;; ~( ~8 [* [/ D4 E; s' z
        for(i = x;i > 0;i --)
: E, g/ x0 K! _$ V                for(j = 110;j > 0;j --);
; y+ X3 m4 u' o7 G8 t: o# E}: A3 @* I9 q3 N
void display(uchar num)
* |0 Y5 p3 B& z# {- N{
/ D+ f6 G( t" c        P0 = ~table[num];
* m* O+ X8 r% U6 e9 L}
8 X8 j. H1 k5 [: F: ^5 }/*  n1 \! i$ Y$ m/ O* E) |
*键盘扫描程序
$ M, z$ p' E: d' D3 t! }* }*/% X& J& O6 g! a, c& |
void keyscanf()6 N0 M: y; ~, j9 ^
{
8 d9 S: V* q9 G& x( O. x" {        uchar temp, key;8 @1 l8 A; {$ {4 \5 m# L
        P2 = 0Xef;
7 q# s$ x7 }# ~3 e3 ?        temp = P2;4 x' g% i" J/ O: Y1 X$ W
        temp = temp & 0x0f;) }1 }3 D# g. C, j7 H1 r- L  G
        if(temp != 0x0f)
+ ~, ~  I: ]) ]+ w) k0 k        {
: H% s# I' N/ f1 W, m. r! r  X& A! X                delay1ms(5);//去抖动
, x# {$ I6 K) c/ a$ G2 n                temp=P2;$ A& a+ t8 E' P, C: c) w. O. A3 G
                temp = temp & 0x0f;5 E8 w* h5 v- l8 B
                if(temp != 0x0f)0 M! V. n" d2 J9 C- [, }
                {( t: `+ q8 q+ S4 B* Q5 T9 F' |
                        temp = P2;# R- _1 j- i" ~; K0 T
                        switch(temp)//此时按键已经定位到第一行了
( p  A: m; v! q" ?  _( }7 y                        {- L/ ~' k* S7 z/ B
                                case 0xe7: key = 0; break;//此时代表第一行的第一个按键按下,即11101110
* Z. v& G; `0 t7 \                                case 0xeb: key = 1; break;$ \* Y( l$ Y4 ^4 A) ~$ e; p
                                case 0xed: key = 2; break;
  m( G% Y- Y7 m/ p                                case 0xee: key = 3; break;
; {# U2 `, s, d  H9 {                        }" g0 W5 U8 i  e( B" J
                        while(temp != 0x0f)//按键松开
# S- |+ i' u$ d1 l; G                        {0 _5 U( \& y! O  K  X+ [
                                temp = P2;' J2 |3 V" B" W( ?* p9 N; a; b) |
                                temp = temp & 0x0f;
, E9 m: \$ W$ ^6 \/ u8 K3 q                        }
& t3 t/ u7 h" G7 B; X                        display(key);: I6 D, V: ?3 r
                }
0 Z$ ~7 D0 l: C* U8 B+ p$ ~        }
& f$ J$ f8 ^( z        P2 = 0Xdf;
+ A6 L" V8 x/ o. m4 ]        temp = P2;
$ a5 c! ~: E. `) `0 y        temp = temp & 0x0f;- B3 x9 L& ?7 X/ f9 C
        if(temp != 0x0f). a! L) X6 `: Z) w) n, ]% o
        {
: |) U7 q) q* d                delay1ms(5);//去抖动5 ?; w- i8 P4 I7 |% B. Q
                temp = P2;0 E5 I' c8 V; V% o' k; V! j
                temp = temp & 0x0f;
: v( s6 t2 s' x# \                if(temp != 0x0f)
- c$ a+ B/ ]" j7 f( \                {! v3 N7 ]4 ]- \- }! F# t( Z: w* B/ G' r
                        temp = P2;
  i0 K% K# f+ Y( n( E( v2 r3 v                        switch(temp)//此时按键已经定位到第er行了9 `! `( d7 @/ J- z% y+ f- F3 q
                        {
1 c5 `  J7 H" n( T7 }2 q                                case 0xd7: key = 4; break;//此时代表第一行的第一个按键按下,即11011110
9 |! g- |4 O* F( F" _8 |' k! N/ X$ g% r                                case 0xdb: key = 5; break;7 P0 i' A0 X4 S5 i! }# a* w: I3 l
                                case 0xdd: key = 6; break;; |- ]. `. c7 g
                                case 0xde: key = 7; break;" r$ Z$ ?. r# O8 O
                        }1 G( z; @, ]( u( W3 a+ L
                        while(temp != 0x0f)//按键松开* ^6 E  u1 W& ^$ W# S$ \$ u4 L* Y
                        {% N# ?: [3 F4 d8 p, b
                                temp = P2;
1 j' l4 j. w$ r) S) D. }                                temp = temp & 0x0f;
5 f2 g7 N! Z$ Z7 E7 k1 @" o% Y                        }
! [. S) p+ C# Q% N                        display(key);. D% A) s* b' g1 G8 `9 X
                }% l- N% M5 H9 K' g- |
        }
% ?- A' T/ {3 I2 W        P2 = 0Xbf;
8 K0 l# q8 \' O0 P! l        temp = P2;4 L4 l, h! D( H" u" t8 |  X
        temp = temp & 0x0f;
, r6 O* f6 s' y1 o  k        if(temp != 0x0f)
  n  C( ?7 `0 T        {5 q4 N+ K0 C! |7 s
                delay1ms(5);//去抖动. Y8 n* A& s& o
                temp=P2;6 A0 v" L! |* ?4 j
                temp = temp & 0x0f;, Q% @& O5 G1 I
                if(temp != 0x0f)
0 |7 a3 Y6 \4 Z2 m0 C                {" S, @$ s5 I! p* i' `# U
                        temp = P2;* `2 J. }/ u6 f5 w6 i! m1 K* l
                        switch(temp)//此时按键已经定位到第san行了
) R" I7 K- M8 s7 q* I- T3 y3 c  R                        {
, P; g2 r0 f8 a7 H- R) K% }                                case 0xb7: key = 8; break;//此时代表第一行的第一个按键按下,即10111110
1 \+ t0 F) Q3 T- `8 P0 u- f                                case 0xbb: key = 9; break;6 Q  m$ v, P- ^* a
                                case 0xbd: key = 10; break;3 S/ u- c! }9 v! U
                                case 0xbe: key = 11; break;) i* s( P2 O$ ^/ A: U( L  n0 Y2 T% Z8 P
                        }
8 d/ D9 E4 N: ?% a( [% @1 J+ e                        while(temp != 0x0f)//按键松开
, X, F9 f# Y& |2 {% K, O                        {7 F0 Q( ]; J) t( |" I: }; r2 P
                                temp = P2;
, l$ Q/ c% @, j3 o5 X4 L, l# @                                temp = temp & 0x0f;3 v" o! C, U0 ~. i. Y
                        }8 H& T2 d: Z% z7 b% `
                        display(key);
& ~+ v6 }6 ]6 O  T                }
* ~; }+ s: W2 S( Q" R/ g7 n        }. r  m/ e/ R, E- ~6 i
        P2 = 0X7f;1 z) U9 M: H& Z: X( n5 ~" K
        temp = P2;1 B+ ~- G' Z) E
        temp = temp & 0x0f;- W# s% z/ e6 I
        if(temp != 0x0f)
( A/ A( Z& n# e7 v; _+ L        {
) \* {) j+ K" x- ~                delay1ms(5);//去抖动& u% F9 F& S. S* g% v( d
                temp=P2;
' f* ^# e% m% ]9 D                temp = temp & 0x0f;
8 f& T" x; H# W5 m7 G+ x5 K+ T                if(temp != 0x0f)
! ~. y/ C1 b3 h& U5 [5 g                {
! Q& N% ~: I! w' C5 Q6 v: h                        temp = P2;! X: ^- s3 f. y: a2 A
                        switch(temp)//
% M# ?& \8 [: t# _" x( ~                        {
# L, J' ]( c* r1 E9 O4 g                                case 0x77: key = 12; break;//此时代表第一行的第一个按键按下,即01111110
0 _* |5 P$ }% _/ n  h                                case 0x7b: key = 13; break;
1 }7 H, q/ l7 w, J# a                                case 0x7d: key = 14; break;: i+ t, H& ?4 ]; z6 y( X. w2 D
                                case 0x7f: key = 15; break;- w% V# g7 R0 _( S) X" d' V
                        }
: F, _) ~3 o/ p! e                        while(temp != 0x0f)//按键松开6 C2 w( Y) M* {
                        {
) e$ Z: ~/ ?" h$ A/ t7 }, o                                temp = P2;2 a' [0 q9 \; T
                                temp = temp & 0x0f;
0 O+ J4 E& H# ?3 H5 y* I$ [2 D                        }  @7 T- d$ _$ N- p+ |
                        display(key);4 v/ ]$ w5 v3 A* B
                }3 Y% F# l( N1 f) z
        }9 o; p4 ~$ w; e& C
}! k+ n4 ]$ ]. M+ h
void main()+ E" n4 \0 p5 u- |) w3 [8 j
{; d0 U( o3 j- G2 C& V# q" o
        P0 = 0xff;: }& G* A) E6 ]1 [
        while(1)
) K' \0 B1 @& R        {  Z& s: ^+ `6 [
                keyscanf();8 h- h) _+ W6 Z; W
        }
/ ]3 s  @  \+ t1 t; I}
/ X# V+ h$ d/ K+ j
游客,如果您要查看本帖隐藏内容请回复
3 d# P4 u- L/ Z7 ~$ d) A) I3 a7 H% a
( Y4 s  ~3 i) ^/ R6 {) q7 k

该用户从未签到

2#
发表于 2019-1-4 18:15 | 只看该作者
好东东,谢谢楼主分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-8-3 15:59 , Processed in 0.125000 second(s), 26 queries , Gzip On.

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

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

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