找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5063|回复: 12
打印 上一主题 下一主题
收起左侧

求大大们给改下程序 改的简短些 本人刚学单片机知道的不多

[复制链接]
跳转到指定楼层
楼主
如题 感觉太杂乱了 想让它简短一些

#include<reg52.h>
sbit P20=P2^0;
sbit P21=P2^1;
sbit P22=P2^2;
sbit P23=P2^3;
sbit P24=P2^4;
sbit P25=P2^5;
sbit P26=P2^6;
sbit P27=P2^7;
sbit K1=P1^0;
sbit K2=P1^1;
sbit K3=P1^2;
sbit K4=P1^3;
sbit K5=P1^4;
sbit K6=P1^5;
sbit K7=P1^6;
sbit K8=P1^7;
void delay(int n)
{
     int i,j;
  for(i=0;i<n;i++)
     for(j=0;j<120;j++);
}
void main()
{
     while(1)
  {
       if(K1==0)
    {      
     delay(100);
     if(K1==1)
     {
         P20=~P20;
      delay(100);
     }     
    }
    if(K2==0)
    {      
     delay(100);
     if(K2==1)
     {
         P21=~P21;
      delay(100);
     }     
    }
    if(K3==0)
    {      
     delay(100);
     if(K3==1)
     {
         P22=~P22;
      delay(100);
     }     
    }
    if(K4==0)
    {      
     delay(100);
     if(K4==1)
     {
         P23=~P23;
      delay(100);
     }     
    }
    if(K5==0)
    {      
     delay(100);
     if(K5==1)
     {
         P24=~P24;
      delay(100);
     }     
    }
    if(K6==0)
    {      
     delay(100);
     if(K6==1)
     {
         P25=~P25;
      delay(100);
     }     
    }
    if(K7==0)
    {      
     delay(100);
     if(K7==1)
     {
         P26=~P26;
      delay(100);
     }     
    }
    if(K8==0)
    {      
     delay(100);
     if(K8==1)
     {
         P27=~P27;
      delay(100);
     }     
    }
  }
}
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1 发表于 2014-11-30 17:54 | 只看该作者
这个程序确实很不好 重复的代码 太多  他要实现的大致功能能说一下吗
回复

使用道具 举报

板凳
ID:65675 发表于 2014-11-30 18:09 | 只看该作者
admin 发表于 2014-11-30 17:54
这个程序确实很不好 重复的代码 太多  他要实现的大致功能能说一下吗

8个独立按键控制8个继电器 每个按键控制1个继电器的开合 按键按下放开后继电器吸合或者开放(按键按下松手后才有动作)
回复

使用道具 举报

地板
ID:66032 发表于 2014-12-1 08:51 | 只看该作者
我试写了一个, 没有51这样的板,也没办法调试, 你试一下看有问题没?
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int

const uchar table[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};

void delay(uint ms)
{
  uint m,n;
  for(m=0;m<ms;m++)
   for(n=0;n<1140;n++);
}

void Key_scan(void)
{
   uchar temp;
   temp=P1;
   temp=temp&0xff;
   if (temp!=0xff);
    {
      delay(10);
      temp=P1;
      temp=temp&0xff;
      if (temp!=0xff)
       {
         temp=P1;
         switch (temp)
          {
                     case 0xfe: P2=table[0]; break;
                 case 0xfd: P2=table[1]; break;
                case 0xfb: P2=table[2]; break;
                 case 0xf7: P2=table[3]; break;
                 case 0xef: P2=table[4]; break;
                 case 0xdf: P2=table[5]; break;
                 case 0xbf: P2=table[6]; break;
                 case 0x7f: P2=table[7]; break;
                 default: break;
               }
          while(temp!=0xff)
             {
               temp=P1;
               temp=temp&0x0f;
             }
       }
     }
}

void main()
{  
    P1=0xff;
    P2=0xff;
    while(1)
    {
      Key_scan();
      delay(10);
    }
}
回复

使用道具 举报

5#
ID:66032 发表于 2014-12-1 08:53 | 只看该作者
有一句错了, 改了一下
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int

const uchar table[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};

void delay(uint ms)
{
  uint m,n;
  for(m=0;m<ms;m++)
   for(n=0;n<1140;n++);
}

void Key_scan(void)
{
   uchar temp;
   temp=P1;
   temp=temp&0xff;
   if (temp!=0xff);
    {
      delay(10);
      temp=P1;
      temp=temp&0xff;
      if (temp!=0xff)
       {
         temp=P1;
         switch (temp)
          {
                     case 0xfe: P2=table[0]; break;
                 case 0xfd: P2=table[1]; break;
                case 0xfb: P2=table[2]; break;
                 case 0xf7: P2=table[3]; break;
                 case 0xef: P2=table[4]; break;
                 case 0xdf: P2=table[5]; break;
                 case 0xbf: P2=table[6]; break;
                 case 0x7f: P2=table[7]; break;
                 default: break;
               }
          while(temp!=0xff)
             {
               temp=P1;
               temp=temp&0xff;
             }
       }
     }
}

void main()
{  
    P1=0xff;
    P2=0xff;
    while(1)
    {
      Key_scan();
      delay(10);
    }
}

评分

参与人数 1黑币 +50 收起 理由
admin + 50 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

6#
ID:66840 发表于 2014-12-1 09:26 | 只看该作者
#include<reg52.h>
#define key P1
#define relay P2

bit num = 1; //定义一个标志位,用来判断按键

void Delay(unsigned char xms) //延时函数,延时X毫秒
{
        unsigned char j,n;
        for(j=xms; j>0; j--)
        {
                for(n=110; n>0; n--);
        }
}

void main()
{
        unsigned char temp, temp1, temp2; //定义3个临时变量
       

        while(1)
        {       
               
       
                        if(num==1) //用来记录两次按键,按下的动作标志        
                        {
                                temp = key & 0xff; //用来检测按键是否按下
                                if(~temp != 0) //判断按键是否按下
                                {
                                        Delay(40);
                                        temp1 = temp;
                                        relay = temp1; //把按键按下的值给继电器,使继电器有动作
                                        num = 0;
                                }
                        }
                   if (num==0)
                        {
                                temp = key & 0xff;
                                if(~temp != 0)
                                {
                                        Delay(40);
                                        temp2 = temp;                               
                                        num = 1;                               
                                         if  (temp2 != temp1) //用来判断继电器的动作与上次是不是一样
                                        {
                                                relay = temp2; //不一样,继电器器开始新的动作
                                        }
                               else
                                        {
                                                relay = 0xff; //再次一样,继电器关闭
                                        }
                                }
                        }                       
                }               
}
回复

使用道具 举报

7#
ID:66840 发表于 2014-12-1 10:13 | 只看该作者
#include<reg52.h>

sbit key1 = P1^0;
sbit key2 = P1^1;
sbit key3 = P1^2;
sbit key4 = P1^3;
sbit key5 = P1^4;
sbit key6 = P1^5;
sbit key7 = P1^6;
sbit key8 = P1^7;

sbit relay1 = P2^0;
sbit relay2 = P2^1;
sbit relay3 = P2^2;
sbit relay4 = P2^3;
sbit relay5 = P2^4;
sbit relay6 = P2^5;
sbit relay7 = P2^6;
sbit relay8 = P2^7;

void Delay(unsigned char xms) //延时函数,延时X毫秒
{
        unsigned char j,n;
        for(j=xms; j>0; j--)
        {
                for(n=110; n>0; n--);
        }
}

void main()
{
        unsigned char i = 0;
        while(1)
        {
                i++;
                switch(i-1)
                {
                        case 0 : if(key1==0) {Delay(40);  relay1 = ~relay1;} break;
                        case 1 : if(key2==0) {Delay(40);  relay2 = ~relay2;} break;
                        case 2 : if(key3==0) {Delay(40);  relay3 = ~relay3;} break;
                        case 3 : if(key4==0) {Delay(40);  relay4 = ~relay4;} break;
                        case 4 : if(key5==0) {Delay(40);  relay5 = ~relay5;} break;
                        case 5 : if(key6==0) {Delay(40);  relay6 = ~relay6;} break;
                        case 6 : if(key7==0) {Delay(40);  relay7 = ~relay7;} break;
                        case 7 : if(key8==0) {Delay(40);  relay8 = ~relay8;} break;                       
                }
                if(i>8)
                i=0;               
        }       
}
回复

使用道具 举报

8#
ID:65675 发表于 2014-12-1 10:28 | 只看该作者
楼上二位的程序都不符合要求,但是还是谢谢你们
回复

使用道具 举报

9#
ID:48897 发表于 2014-12-1 11:05 | 只看该作者
回复

使用道具 举报

10#
ID:66840 发表于 2014-12-1 12:16 | 只看该作者
#include<reg52.h>

sbit key1 = P1^0;
sbit key2 = P1^1;
sbit key3 = P1^2;
sbit key4 = P1^3;
sbit key5 = P1^4;
sbit key6 = P1^5;
sbit key7 = P1^6;
sbit key8 = P1^7;

sbit led1 = P2^0;
sbit led2 = P2^1;
sbit led3 = P2^2;
sbit led4 = P2^3;
sbit led5 = P2^4;
sbit led6 = P2^5;
sbit led7 = P2^6;
sbit led8 = P2^7;

void Delay(unsigned char xms) //延时函数,延时X毫秒
{
        unsigned char j,n;
        for(j=xms; j>0; j--)
        {
                for(n=110; n>0; n--);
        }
}

void main()
{
        unsigned char i = 0;
        while(1)
        {
                i++;
                switch(i-1)
                {
                        case 0 : if(key1==0) {Delay(1); if(key1==1) {Delay(1); led1 = ~led1;}} break;
                        case 1 : if(key2==0) {Delay(1); if(key2==1) {Delay(1); led2 = ~led2;}} break;
                        case 2 : if(key3==0) {Delay(1); if(key3==1) {Delay(1); led3 = ~led3;}} break;
                        case 3 : if(key4==0) {Delay(1); if(key4==1) {Delay(1); led4 = ~led4;}} break;
                        case 4 : if(key5==0) {Delay(1); if(key5==1) {Delay(1); led5 = ~led5;}} break;
                        case 5 : if(key6==0) {Delay(1); if(key6==1) {Delay(1); led6 = ~led6;}} break;
                        case 6 : if(key7==0) {Delay(1); if(key7==1) {Delay(1); led7 = ~led7;}} break;
                        case 7 : if(key8==0) {Delay(1); if(key8==1) {Delay(1); led8 = ~led8;}} break;                       
                }
                if(i>8)
                i=0;               
        }
       
       
}
这个是按键松开后有动作

评分

参与人数 1黑币 +50 收起 理由
admin + 50 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

11#
ID:67992 发表于 2014-12-1 12:58 | 只看该作者
本帖最后由 dgahz 于 2014-12-1 13:25 编辑


回复

使用道具 举报

12#
ID:67992 发表于 2014-12-1 13:22 | 只看该作者
本帖最后由 dgahz 于 2014-12-1 13:28 编辑

#include<reg52.h>
sbit P20=P2^0;
sbit P21=P2^1;
sbit P22=P2^2;
sbit P23=P2^3;
sbit P24=P2^4;
sbit P25=P2^5;
sbit P26=P2^6;
sbit P27=P2^7;

void delay(int n)
{
     int i,j;
  for(i=0;i<n;i++)
     for(j=0;j<120;j++);
}
void main()
{
     while(1)
  {               
       if(P1!=0xff)
       {      
             delay(100);
             if(P1!=0xff);
             {        
                        
                 switch (P1)
                  {
                         case 0xfe:while(P1!=0xff); P20=~P20; break;
                         case 0xfd:while(P1!=0xff);P21=~P21;  break;
                         case 0xfb:while(P1!=0xff); P22=~P22; break;
                         case 0xf7:while(P1!=0xff); P23=~P23; break;
                         case 0xef:while(P1!=0xff); P24=~P24; break;
                         case 0xdf:while(P1!=0xff); P25=~P25; break;
                         case 0xbf:while(P1!=0xff); P26=~P26; break;
                         case 0x7f:while(P1!=0xff) P27=~P27;; break;
                         default: break;
                   }
                        
                 }
      }
  }
}

评分

参与人数 1黑币 +50 收起 理由
admin + 50 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

13#
ID:69862 发表于 2014-12-3 10:37 | 只看该作者
void KeyScan()
{
        static unsigned int ucKeyTimeCnt1;           //按键延时计数器
        static unsigned char ucKeyLock1 = 0;   //按键自锁标志位
        static unsigned char ucKeyFlag1 = 0;   //松手后触发标志位
        static unsigned char const_Key_Time1 = 500;        //按键去抖动的时间变量 ,改变这里的变量,可以改变按键去抖动的时间。

        if(Key_sr1 == 1)                                 //当没有按键按下时,
        {
            ucKeyTimeCnt1 = 0;                         //按键延时计数器清零
                ucKeyLock1 = 0;                                 //自锁标志清零
               
                if(ucKeyFlag1 == 1)                         //当有按键按下 ,并且松手后。触发继电器信号
                {
                    relay_dr = ~relay_dr;         //继电器信号取反
                        ucKeyFlag1 = 0;                         //松手后触发标志清零,避免一直触发。
                }                                                  

        }
        else if(ucKeyLock1 == 0)                 //自锁标志
        {
                ucKeyTimeCnt1++;                         //按键去抖动时间计数器自加

                if(ucKeyTimeCnt1 >= const_Key_Time1) //当去抖动延时时间到了后,按键依然按下 。
                {
                        ucKeyTimeCnt1 = 0;                                 //按键去抖动延时计数器清零,为下一次延时做准备
                        ucKeyFlag1 = 1;                                         //松手后触发标志置1,表示松手后可以触发了。
                        ucKeyLock1 = 1;                                         //自锁标志置1,避免一直触发

                }
        }

}
我只写了一个按键的程序,测试后可以满足你的要求,如需8个按键,就需要复制就可以了。我不在乎C程序的长与短,我只在乎一个清晰的思路,方便调试和以后的修改。。。。。。

评分

参与人数 1黑币 +50 收起 理由
admin + 50 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

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

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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