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

求程序解釋

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2012-5-17 11:56 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

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

x

: _2 p8 F) {  Y* M6 j/ v- A/* 名称:K1-K4 分组控制LED- M$ \( `( Q, f$ Z% P# @
说明:每次按下 K1 时递增点亮一只LED,全亮时再次按下则再次循环开始,
; C# J+ f- I; |3 Q- [K2按下后点亮上面4 只LED,K3 按下后点亮下面4 只LED,K4 按下后关闭所有LED6 V8 M, T3 D* D7 D4 v7 b# d
*/+ d  k$ {% p. }
#include<reg51.h>
0 @: k9 X3 W3 b* B! \3 g/ c" j#define uchar unsigned char7 p) ^4 t* G8 N7 Y8 S/ k; o+ i9 E/ I
#define uint unsigned int$ I, m4 l+ @1 ~) i0 _% F! a7 b
//延时- z% s# c4 r. V( G& a8 I" B
void DelayMS(uint x)
) M9 j* L) \5 z9 x$ i8 T- Y$ O* G{5 R! }! [$ C$ X, v5 A! Z
uchar i;2 k/ t+ W0 a$ K* D) r+ R2 k
while(x--) for(i=0;i<120;i++);
" |" o2 |, }# |/ D8 A- k3 ^: ]}
6 x* B7 \+ h* w8 H, F8 ?! N//主程序
6 e2 O0 @( u& Q! S( evoid main()
3 L: i' c) `' b+ F0 [{) V: S5 z- [% t) o
uchar k,t,Key_State;" s  ]) ~: B3 K% o. Z6 S
P0=0xff;
( v8 K9 U8 e2 T3 H2 E: D3 i0 w" NP1=0xff;1 s1 _+ L! e1 b! w# P4 J5 m
while(1). |" V' q# f  b0 Y. P$ n
{
* B( r, }$ W+ p. c" O( Vt=P1;4 n5 R) K. f3 {& Q3 u  w
if(t!=0xff)$ b  F; d2 g9 W9 N
{
9 r; B+ K7 D! `4 W+ l8 H# PDelayMS(10);
3 q" f9 K$ j' H3 jif(t!=P1) continue;" N) W" M( X/ v6 n$ r, ]
//取得4 位按键值,由模式XXXX1111(X 中有一位为0,其他均为1), g8 h7 e. v+ J$ r# ]" o* R
//变为模式0000XXXX(X 中有一位为1,其他均为0)+ x4 N% L* Y* L7 K8 }
Key_State=~t>>4;# C- s6 C0 r- i$ i4 ]: {
k=0;2 e( e4 k1 z2 u6 r
//检查1 所在位置,累加获取按键号k6 |. u4 H4 _/ ~& Y' k; L
while(Key_State!=0)! n. f1 O$ W7 ^0 Z6 p
{
! u5 j2 h3 E5 E: pk++;
1 L4 J( O, I! v9 a; p  [6 u9 VKey_State>>=1;. m: _& `/ n- O+ U  F
}- y  _( |0 I6 W8 O! A, h
//根据按键号k 进行4 种处理/ L6 @# c" {2 U4 P/ ^
switch(k)* x/ F6 _& {- }2 D3 A( ]9 k
{& s9 t( [6 ^9 P/ i# [+ J! Y! x
case 1: if(P0==0x00) P0=0xff;
5 a; q8 S5 f, `( ^- }P0<<=1;
* Z' E! _9 s& S& C6 c2 DDelayMS(200);% a' o) C- o: G0 A; x  ^! u' a
break;$ N( y, V0 u6 R& ~9 `3 O
case 2: P0=0xf0;break;
  ?$ y. A* l, o; P4 ycase 3: P0=0x0f;break;# W; ~% U" P: @' g5 ]; s6 _
case 4: P0=0xff;5 R  B% |. |, n/ ^
}) ~, e. A& }6 g2 m( H
}" `/ D6 C" e* o6 {; X- j
}
3 B  B. c9 \3 U}1 n7 k) i" }- W" `; ^1 r; X0 q8 s( m

% K) c3 W, Y* z5 h+ U& P8 g小弟初學單片機   當switch k = 1或2或3或4 會自動執行case
* b2 Y* V5 Y' a3 w6 A8 |但是看不懂k++何時變成1或2或3或4- E! M  F+ y3 W0 Z; [2 V$ l
請問各位先進們 可否解釋一下這程序
& |) q, q( {  w; t( m
/ P2 o/ W9 {6 ?/ x

该用户从未签到

2#
发表于 2012-6-5 10:26 | 只看该作者
偶也是初学者~偶的理解是这样的:
6 |+ z% o4 |6 h$ ~6 f  @7 d 以Key_State=~t>>4后=00001000为例:! I4 n7 ?' I& D5 q
  此时,Key_State!=0为真,执行while语句内容,即K=1,并将Key_State右移一位;2 t5 v+ I1 T! b' x& F% ^
再判断Key_State!=0仍为真,则继续执行while语句内容,直至Key_State==00000000,则跳出while语句。此时K也加至相应数值~

评分

参与人数 1贡献 +5 收起 理由
Apple0988 + 5

查看全部评分

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-11-23 14:05 , Processed in 0.156250 second(s), 30 queries , Gzip On.

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

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

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