智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 2226|回复: 4
打印 上一主题 下一主题

关于stc89c52的问题

[复制链接]

2

主题

10

帖子

0

精华

注册会员

Rank: 2

积分
199
威望
154
贡献
41
兑换币
0
注册时间
2011-11-19
在线时间
2 小时
跳转到指定楼层
1#
发表于 2011-12-2 22:05:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我是新手,刚从单片机起步,然后我想理由独立按键来模拟一下密码输入的过程,比如按对四个键才能使所有的灯亮,但老出问题。请问应该如何写呢?
以下是我的程序,密码是1,2,3,4就是依次按下K1,K2,K3,K4,然后使所有按对后才能使所有灯亮。但是只有在K1-4中随便按4个键就能使全部灯亮,我有怎么办?
  1. #include <reg51.h>
  2. #include <intrins.h>
  3. unsigned char scan_key();
  4. //unsigned int proc_key(unsigned char key_v);
  5. void delayms(unsigned char ms);
  6. sbit        K1 = P0^0;        //对应按钮K1
  7. sbit        K2 = P0^1;        //对应按钮K2
  8. sbit        K3 = P0^2;        //对应按钮K3
  9. sbit        K4 = P0^3;        //对应按钮K4
  10. sbit    K8 = P0^7;
  11. main()
  12. {
  13.         unsigned char key_s;
  14.         unsigned int i=0,j=0;
  15.         unsigned char code key_v[]={0x07,0x0b,0x0d,0x0e};
  16.         unsigned char code key_v1[]={0xf7,0xfb,0xfd,0xfe};
  17.         P2 = 0xff;
  18.         while(1)
  19.         {
  20.                 for(i=0;i<4;i+=1)
  21.                 {
  22.             key_s = scan_key();
  23.                         if(key_s == key_v[i])
  24.             {
  25.                                 delayms(10);
  26.                                 key_s = scan_key();
  27.                                 if(key_s == key_v[i])
  28.                                 P2=key_v1[i];
  29.                                 delayms(20);
  30.                                 key_s = scan_key();
  31.                                 if(key_s != key_v[i]) j+=1;
  32.                         }
  33.                                        
  34.                 }
  35.                 if(j==4) P2=0x00;
  36.                 if(K8==0)                    //复位
  37.                 {
  38.                         delayms(10);
  39.                         if(K8==0) P2=0xef;
  40.                         delayms(20);
  41.                         if(K8!=0) {j=0;i=0;}
  42.                 }
  43.         }       
  44. }
  45. unsigned char scan_key()
  46. {
  47.         unsigned char key_s;
  48.         key_s = 0x00;
  49.         key_s |= K1;
  50.         key_s <<= 1;
  51.         key_s |= K2;
  52.         key_s <<= 1;
  53.         key_s |= K3;
  54.         key_s <<= 1;
  55.         key_s |= K4;
  56.         return key_s;               
  57. }


  58. void delayms(unsigned char ms)                // 延时子程序
  59. {                                               
  60.         unsigned char i;
  61.         while(ms--)
  62.         {
  63.                 for(i = 0; i < 120; i++);
  64.         }
  65. }
复制代码

2

主题

10

帖子

0

精华

注册会员

Rank: 2

积分
199
威望
154
贡献
41
兑换币
0
注册时间
2011-11-19
在线时间
2 小时
2#
 楼主| 发表于 2011-12-3 19:55:10 | 只看该作者
求回复啊!
回复 支持 反对

使用道具 举报

49

主题

3751

帖子

1

精华

顶级版主

Rank: 11Rank: 11Rank: 11Rank: 11

积分
27953

资源大师奖章论坛骨干奖章推广达人奖章优秀版主奖章热心会员奖章论坛元老奖章在线王奖章活跃会员奖章优秀会员奖章技术大牛奖章

威望
10635
贡献
10966
兑换币
4566
注册时间
2010-11-23
在线时间
3176 小时
3#
发表于 2011-12-3 21:09:15 | 只看该作者
最好自己单步一下,很少有人愿意耐心地给别人看代码
回复 支持 反对

使用道具 举报

44

主题

1485

帖子

0

精华

版主

早川队队长

Rank: 9Rank: 9Rank: 9

积分
20210

资源大师奖章论坛骨干奖章推广达人奖章论坛元老奖章活跃会员奖章优秀会员奖章在线王奖章优秀版主奖章

QQ
威望
5864
贡献
12698
兑换币
630
注册时间
2009-8-18
在线时间
824 小时
4#
发表于 2011-12-3 22:04:28 | 只看该作者
用状态机,四个状态,有先后动作顺序~
回复 支持 反对

使用道具 举报

2

主题

10

帖子

0

精华

注册会员

Rank: 2

积分
199
威望
154
贡献
41
兑换币
0
注册时间
2011-11-19
在线时间
2 小时
5#
 楼主| 发表于 2011-12-6 22:23:56 | 只看该作者
嗯,已经搞定了!
回复 支持 反对

使用道具 举报

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

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-12-25 14:58 , Processed in 0.083518 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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