智能车制作

标题: 关于stc89c52的问题 [打印本页]

作者: 清风明月asy    时间: 2011-12-2 22:05
标题: 关于stc89c52的问题
我是新手,刚从单片机起步,然后我想理由独立按键来模拟一下密码输入的过程,比如按对四个键才能使所有的灯亮,但老出问题。请问应该如何写呢?
以下是我的程序,密码是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. }
复制代码

作者: 清风明月asy    时间: 2011-12-3 19:55
求回复啊!
作者: turf456    时间: 2011-12-3 21:09
最好自己单步一下,很少有人愿意耐心地给别人看代码
作者: sonwendi    时间: 2011-12-3 22:04
用状态机,四个状态,有先后动作顺序~
作者: 清风明月asy    时间: 2011-12-6 22:23
嗯,已经搞定了!




欢迎光临 智能车制作 (http://dns.znczz.com/) Powered by Discuz! X3.2