你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

如何在while(1)里面得到两个按键返回值

[复制链接]
w小菜才 发布时间:2015-3-9 22:10
程序骨架如下
3 m% S# W1 N( u  H6 @+ @1 Vwhile(1)
3 x( E6 B! E$ y9 B{
, c. P( p8 F& gkeyscan()     //第一个按键返回值
2 Y% I/ ~  Y/ v+ W" Z/ G+ A7 kdelay()+ M  e; h3 x, x& ?
keyscan()    //第二个按键返回值
4 ~/ ~  y2 u2 \2 Z- R$ D}
! c0 B3 O: V2 p: i2 H% H* ~现在遇到的问题是按下第一个键后,第二个按键返回值不能够按下,求大神给个解决办法
赞 收藏 评论28 发布时间:2015-3-9 22:10

举报

28个回答
w小菜才 回答时间:2015-3-10 18:49:07
Eagleson 发表于 2015-3-10 08:421 y) [7 `2 h9 b$ X; b+ U
一个函数扫描不同的按键吗?
0 h; S) y; {- a: u6 v5 I9 X
#include<reg51.h>
! Z6 S$ `; B% d9 c8 Z: T8 d" L/ k8 U* Q# r" N" u3 k
#define GPIO_DIG P0
5 M1 R- p0 U1 }7 c#define GPIO_DIG2 P23 b- M9 B- X) @6 K! O1 u3 Z
#define GPIO_KEY P1
* Z0 |5 p1 g5 v2 F! u
2 u( C) i4 X" s/ L) U" _7 }unsigned char code DIG_CODE[17]={3 Z, V& _) `: g: P
0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01,//È·¶¨ÐÐ% q# D# b$ x# W
0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};  //È·¶¨ÁÐ( h. v7 T2 I- v, X% W( o

' L% D6 d( t1 ^0 W# i9 K. X% h$ Zunsigned char KeyValue;//ÓÃÀ´´æ·Å¶ÁÈ¡µ½µÄ¼ü
1 `2 R( N' D9 D. `/ o" Funsigned char KeyValue1;  //ÓÃÀ´¶ÁÈ¡°´¼üµÄÖµ
# \! T; U) S1 r. [void Delay10ms();   //ÑÓʱ10ms/ E7 k# K, ]2 N- o, o* l- N" y( f- J
void KeyDown();                 //¼ì²â°´¼üº¯Êý
' K  P6 y4 H9 i0 l: mvoid KeyDown1();
! R7 t: I5 x+ b( \) i7 s3 t 3 c- f3 m8 n+ v$ |9 N6 g
/*******************************************************************************# @6 J" Q& T1 k# |2 D" K0 {  L
* º¯ Êý Ãû         : main3 Z2 g8 Q/ L- t2 o9 n
* º¯Êý¹¦ÄÜ                   : Ö÷º¯Êý0 ]4 t( c5 D& u
* Êä    Èë         : ÎÞ
6 O4 Z) L# \/ f* J. N* Êä    ³ö         : ÎÞ
+ O; d/ C  W( w*******************************************************************************/
: R- W7 n# Q4 C5 }  b4 v& g8 @" xvoid main(void)/ T3 p# {% {* y6 Z# X
{, D! I7 |" n; ^4 H% G& B+ F- i) O
        int i=1;1 m; b! e- j) R' {
        while(1)
5 h+ l- v0 ]! D+ M6 g* R        {        0 t. Q) Y4 p* |0 a- [0 G
                if(i==1)
% z, l# o5 E/ z* X                {: Q; M% l! F" e
                        KeyDown();) {6 N- w2 d: O3 z7 W
//  if(KeyValuv<9)% B( ~3 E; }2 d, f5 l. x
                  GPIO_DIG=DIG_CODE[KeyValue];( _9 B( N! ^6 j
                   Delay10ms();$ }3 {, P$ W7 {# Q" a/ E0 J* S
                }
$ }9 Y* Z  k8 W" f6 N( ^8 {* e$ n: F                else
* s, f6 v- h: R& ^5 [# V, P                {       
: N! y2 v' e! G5 F" I            KeyDown();
5 B1 _, z# J0 k% |            GPIO_DIG2=DIG_CODE[KeyValue];
8 q/ G1 f; Y; \8 m                        Delay10ms();" s) U" ^# i2 Y) r# N; z4 a1 c$ n
                }
0 i9 j! C( l# Z* q+ N+ k4 D                  i=i+1;6 X4 C9 A( S) e& M% o( ?4 q
        }                               
$ u( u: J1 r/ }}" ?, c3 |5 d7 x$ `( H
/*******************************************************************************
& x& u9 u& ~& d5 M* º¯ Êý Ãû         : KeyDown$ s- H' u' F  Y& O0 A
* º¯Êý¹¦ÄÜ                   : ¼ì²âÓа´¼ü°´Ï²¢¶ÁÈ¡¼üÖµ9 v6 @, a) ?- Y+ A' U4 v3 Q
* Êä    Èë         : ÎÞ4 C8 b( m2 ?, `2 l0 b- I) M
* Êä    ³ö         : ÎÞ7 o3 X4 n9 e7 Z* {) {" h
*******************************************************************************/" c1 P' k6 P" j" M" r- ?
void KeyDown(void)
6 c* k0 u# l9 J0 m8 F! L{
5 Y; e1 d7 s$ |        char a=0;2 B, j! U% W: Y
        GPIO_KEY=0x0f;
% \4 b9 j/ T7 J( s        if(GPIO_KEY!=0x0f)//¶ÁÈ¡°´¼üÊÇ·ñ°´ÏÂ" R  `# \; ]0 k) O- L+ H% K* Z$ n
        {
/ {3 }9 G' X2 {& F# U                Delay10ms();//ÑÓʱ10ms½øÐÐÏû¶¶% F# Z* n2 i3 X4 a
                if(GPIO_KEY!=0x0f)//Ôٴμì²â¼üÅÌÊÇ·ñ°´ÏÂ7 p# u+ A9 X# z1 D5 n7 A
                {
- @9 e' ~8 e! T. P" B. P! t                        , z2 Z7 y+ r1 N. m1 D, {
                        //²âÊÔÁÐ
; A& W  I# f3 W" r                        GPIO_KEY=0X0F;. ?1 e# z5 G  g8 z6 f
                        switch(GPIO_KEY). V* t0 ^" V- o8 x
                        {
% X: e1 F' D$ M9 G  z2 I4 |& z. D' D                                case(0X07):        KeyValue=0;break;
( P# L% Z# ]  F/ X                                case(0X0b):        KeyValue=1;break;
& M3 k* k- W' _4 S! k                                case(0X0d): KeyValue=2;break;
2 O1 t" n5 t# E7 z* F% E                                case(0X0e):        KeyValue=3;break;( `& W, }  J. Z) v6 C0 D( L9 z
                        }
2 m! x0 i: _* P$ m                        //²âÊÔÐÐ
, C* A! T: x- Z& x                        GPIO_KEY=0XF0;( M* @# T* R5 ]  w* }9 K% l
                        switch(GPIO_KEY)6 h' {" Z5 a( p
                        {
" w1 Y/ Z' n6 z, Q/ a6 d" {                                case(0X70):        KeyValue=KeyValue;break;
3 }- ]' J. ?, F9 }* U# M' g( y) [! ?                                case(0Xb0):        KeyValue=KeyValue+4;break;# X1 \: K. N; E* N! D* S, {0 p
                                case(0Xd0): KeyValue=KeyValue+8;break;/ K; G' }! ?3 T6 N
                                case(0Xe0):        KeyValue=KeyValue+12;break;
$ g9 R% H0 Y/ M9 p& [% |0 ]5 ~                        }
, s' H3 Q9 b. F+ {                        while((a<50)&&(GPIO_KEY!=0xf0))         //¼ì²â°´¼üËÉÊÖ¼ì²â* r7 G0 L$ M- l0 X; ]2 p0 E
                        {
4 V4 Z5 f1 T7 c: l; ?                                Delay10ms();
5 k/ Y% S8 K& S+ f4 n* S0 ~                                a++;! t4 V( u0 [# ~$ P; x! u9 D
                        }
; |2 H0 y* l  F) y) X                }, Z1 l" y6 r7 s6 t% Y4 H
        }
0 Y5 q8 k, E' N# x}
; P' m4 @4 Z* B! J4 u/*******************************************************************************
2 s3 J- N- e7 r3 n4 m* º¯ Êý Ãû         : Delay10ms
/ O; ?3 c5 ?+ q; \* º¯Êý¹¦ÄÜ                   : ÑÓʱº¯Êý£¬ÑÓʱ10ms) a9 C6 f3 B& q
* Êä    Èë         : ÎÞ4 u* l) G+ o9 b% S8 I+ f- B
* Êä    ³ö         : ÎÞ
. ^: F8 A+ e: I' }*******************************************************************************/
" d* m0 h+ e' ?- L* t% G. nvoid Delay10ms(void)   //Îó²î 0us4 r4 Q0 F. X! K) g5 p% s2 U
{* d0 I' ^4 D3 C# P
    unsigned char a,b,c;* l! s0 F6 l) i- Z
    for(c=10;c>0;c--)% r5 k( O; X; A8 p) l" R
        for(b=380;b>0;b--)
4 H$ C0 L' _7 H! b, a. G' R" D0 T6 G# \            for(a=1300;a>0;a--);
: P) j$ G6 r6 }; L3 x* T}% D! g9 e& Q5 [& i" h* f
8 k( e6 n# J7 ~4 W) c# m; F( I) s. g8 h
- m% M5 K4 Z9 W8 h2 Z
这是程序,就是想让程序识别两次按键后再输出,求解答
w小菜才 回答时间:2015-3-10 18:49:25
_ilikerome_ 发表于 2015-3-10 07:38
6 j3 H4 Y# m6 ?" `6 z& i# _把keyscan() 的代码传上来
8 O2 L* K7 F, |7 w3 X; k
#include<reg51.h>
  h0 e1 w& z) ^* q6 G' \/ T5 d7 e  P
4 P$ J5 L3 r8 g( a6 W) x, X#define GPIO_DIG P0: r1 Q  p) a( C+ N9 g$ c
#define GPIO_DIG2 P2+ r" I, ~0 Y  F4 c
#define GPIO_KEY P1
8 t7 w7 T5 N* z+ S; v" P- w& a
: ~  t# x. s* o8 Vunsigned char code DIG_CODE[17]={
* H4 _: z% s3 w( r$ {% W) F+ }! Z0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01,//È·¶¨ÐÐ
3 B9 T& d1 U% R! L0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};  //È·¶¨ÁÐ9 [  ?* X* T) _- w; u6 P

. |, S! W9 u1 x0 N3 Z- k8 F. x* E8 p3 Uunsigned char KeyValue;//ÓÃÀ´´æ·Å¶ÁÈ¡µ½µÄ¼ü
; M4 E% {, p( R+ ^4 Eunsigned char KeyValue1;  //ÓÃÀ´¶ÁÈ¡°´¼üµÄÖµ
0 A3 E( \' {7 y6 l) B) b0 tvoid Delay10ms();   //ÑÓʱ10ms
9 d' {/ }( H- X, `- o5 `void KeyDown();                 //¼ì²â°´¼üº¯Êý8 b2 _, [$ {! S+ s
void KeyDown1();1 ^, W2 u* Q& k+ L8 n' J+ h  n

& d7 R0 W, T( B  p/*******************************************************************************
  y) o) ?( l' S$ u9 [" B* º¯ Êý Ãû         : main
* c$ C' o; Z- O3 f/ D0 J- {" G2 @% ^* º¯Êý¹¦ÄÜ                   : Ö÷º¯Êý- ^. N% x. s& l$ f
* Êä    Èë         : ÎÞ
! J3 f9 E3 g) O2 [* Êä    ³ö         : ÎÞ
7 F* T$ C# \6 q3 h3 w5 E- X! e*******************************************************************************/
; d3 V- h, f9 U& f7 Ivoid main(void)4 K* r+ v1 Y9 k# z! {
{2 L9 Y1 I# Y# D  f& F
        int i=1;$ Z8 E9 v$ u- I. d* n
        while(1)6 n( S- N$ @8 T0 p3 t
        {       
2 j0 W' S0 u: ?                if(i==1)
4 v  b3 M* s9 w                {4 h  Y" d0 X  D7 R* K8 L8 X( [' O
                        KeyDown();* n" S2 D) F/ M1 ~/ R
//  if(KeyValuv<9)4 C! ]' f- g% h3 X+ B5 r- S
                  GPIO_DIG=DIG_CODE[KeyValue];2 X! M% Q0 |9 b- D
                   Delay10ms();5 a9 V# Z# e' }: k1 E/ p/ f7 W
                }
: z# Z* q0 Q7 {, I6 z                else
  i# U" t' }7 I0 Q0 d! q+ q                {       
" l- Y% U* a6 k            KeyDown();5 y* U1 U( u; ^/ ]
            GPIO_DIG2=DIG_CODE[KeyValue];4 A7 ?9 L1 W. \/ ~" ~
                        Delay10ms();: H: Q. D+ n% a0 }
                }
  M) M+ x* Z% ?$ {& M6 U8 ^1 ^                  i=i+1;
0 {& A7 _6 T3 e) S        }                               
) |( ^5 N, U: L- t0 V# |; i, g}
5 P) T$ ~& |" i2 O$ e) {/*******************************************************************************
2 l  P# {) \  H+ z$ }* º¯ Êý Ãû         : KeyDown0 Y7 `7 c) E' Z
* º¯Êý¹¦ÄÜ                   : ¼ì²âÓа´¼ü°´Ï²¢¶ÁÈ¡¼üÖµ6 z0 I4 I' I$ s* P4 e+ k. n  d3 ^
* Êä    Èë         : ÎÞ
- J" [" ~  U, ^% K3 R& a* Êä    ³ö         : ÎÞ
; l7 W8 \) y# ?# t( J0 T+ ^*******************************************************************************/' z9 m. K  u. K
void KeyDown(void)
: N* b/ ?  I8 ?8 s# B{
1 F: ?+ d; C" F4 d  |, S2 V        char a=0;! f/ r5 G6 N6 Y0 b1 r
        GPIO_KEY=0x0f;
1 {( g, P: i0 V9 s) r5 e        if(GPIO_KEY!=0x0f)//¶ÁÈ¡°´¼üÊÇ·ñ°´ÏÂ
$ D; }5 g( ?' r. K' R" j        {' Z  t7 I) V' t. Y* a* z# d: w: T
                Delay10ms();//ÑÓʱ10ms½øÐÐÏû¶¶# v/ n+ _. c/ O$ [$ ~9 r
                if(GPIO_KEY!=0x0f)//Ôٴμì²â¼üÅÌÊÇ·ñ°´ÏÂ
5 z! a9 }' j6 t( w3 ^2 x& t: @; Q4 [& f                {' e7 m" a' A6 R" z) G2 l" u1 J
                       
+ X, c) g7 J6 I+ s; I) L% f                        //²âÊÔÁÐ
( L" R+ x9 ^% W0 ]                        GPIO_KEY=0X0F;/ b+ I: [$ w, ]9 T2 M1 u
                        switch(GPIO_KEY)
' u0 S' u7 C: J2 P                        {& }0 L& M0 }5 X/ H# M& [
                                case(0X07):        KeyValue=0;break;- A: V2 O* [) z
                                case(0X0b):        KeyValue=1;break;$ q& E8 W+ I0 {  N7 r
                                case(0X0d): KeyValue=2;break;( h4 N! \6 k0 W4 A9 v; y: @4 J2 A
                                case(0X0e):        KeyValue=3;break;& u8 {& Z% f8 l8 A
                        }
+ P7 c# \! n) `# N                        //²âÊÔÐÐ
9 b# d/ J! z/ F8 s% L0 p                        GPIO_KEY=0XF0;
' X7 n- w: \9 c3 w8 m                        switch(GPIO_KEY)0 T) t/ |( Q2 d) ^
                        {% u7 f9 m/ H, i2 [! k6 I
                                case(0X70):        KeyValue=KeyValue;break;; U& c% @6 \, g& m/ N
                                case(0Xb0):        KeyValue=KeyValue+4;break;+ m& c9 N  N- `  L6 p
                                case(0Xd0): KeyValue=KeyValue+8;break;
5 C3 y# T* K. z  X. U7 z                                case(0Xe0):        KeyValue=KeyValue+12;break;
# G) b9 U$ a6 Z! c/ Y7 z$ `% _                        }/ ]- h) [4 ~' P% \8 X# J
                        while((a<50)&&(GPIO_KEY!=0xf0))         //¼ì²â°´¼üËÉÊÖ¼ì²â& n- z& R: B5 z0 ~* M: l7 _  l' r
                        {2 s4 ^, n& G5 `8 t# e
                                Delay10ms();7 H: N* A& Y9 v1 m8 [- O. c  }# [
                                a++;
/ Q' r( K  a4 U8 G                        }
) W: E/ `6 `' y$ r6 M& Q                }) Z* k) K3 K+ c" i' m- n
        }
( j; \* R! [7 b/ Q3 W8 f1 x}5 a# r: O0 }  R2 ~- M( b8 p* L
/*******************************************************************************; N8 p- {" u4 u( \: N! @4 E+ |' g
* º¯ Êý Ãû         : Delay10ms- Z6 v) ~5 k/ O) y
* º¯Êý¹¦ÄÜ                   : ÑÓʱº¯Êý£¬ÑÓʱ10ms
" R6 V: j4 a# S# T$ k* Êä    Èë         : ÎÞ
$ q* |4 Y  s( @8 c9 W' H* Êä    ³ö         : ÎÞ* V8 D0 r" i* o1 a  r. y
*******************************************************************************/: ?' s' }1 ~  u' V
void Delay10ms(void)   //Îó²î 0us9 c8 Y, y5 y+ y
{
. n3 Z0 T1 z+ M' G$ O" s! W4 d    unsigned char a,b,c;5 M7 l, g5 H! U* h
    for(c=10;c>0;c--): p/ |# J& b+ F3 e8 l' ?3 [" v
        for(b=380;b>0;b--)! }& ^, E; h( v2 q1 q* z
            for(a=1300;a>0;a--);
) q. b6 ?, z- h+ c  P; E& R}
) H7 ~! {3 G% \5 z, |/ I
& M$ P4 m8 Z, Z. f+ A1 y* P: v, M* m) T- g% O( @& I9 \
这是源代码
khadgar 回答时间:2015-3-10 10:38:46
你keyscan()函数没有返回值啊,在第一个按键后是不是执行其他任务了,所以程序没有运行到第二个按键。这个要看你具体实现的代码了。可以的话吧keyscan()的代码发上来,或者私信我都行。
_ilikerome_ 回答时间:2015-3-10 07:38:07
把keyscan() 的代码传上来
Eagleson 回答时间:2015-3-10 08:42:57
一个函数扫描不同的按键吗?
bit 回答时间:2015-3-10 09:30:18
动动脑  帮顶
kqh1120 回答时间:2015-3-10 09:37:12
一次性识别两个按键? 0.gif
zhangdaijin 回答时间:2015-3-10 09:37:44
stary666 回答时间:2015-3-10 09:45:09
stary666 回答时间:2015-3-10 09:47:07
stary666 回答时间:2015-3-10 09:48:16
stary666 回答时间:2015-3-10 09:56:07
stary666 回答时间:2015-3-10 09:58:09
党国特派员 回答时间:2015-3-10 10:20:17
看下。keyscan()代码。
stary666 回答时间:2015-3-10 10:24:36
stary666 回答时间:2015-3-10 10:27:54
12下一页
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版