找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机矩阵键盘设置完以后怎么等待两秒之后复位,大神帮我看看红色部分的

[复制链接]
跳转到指定楼层
楼主
ID:272089 发表于 2018-9-28 21:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
30黑币

#include<reg51.h>

#include<intrins.h>


#define uchar unsigned char

#define uint  unsigned int

#define on    0

#define off   1


void delay(uint i){while(i--);}


sbit f=P1^6;      sbit k=P1^5;           sbit ka=P1^4;

sbit cs1=P2^0;    sbit cs2=P2^1;   sbit wr=P2^2;

sbit DQ=P1^2;     sbit con=P1^3;

sbit LED0=P2^3;   sbit LED1=P2^4;  sbit LED2=P2^5;

sbit LED3=P2^6;   sbit LED4=P2^7;

sbit sw0=P3^0;          sbit sw1=P3^1;   sbit sw2=P3^2;    sbit sw3=P3^3;

sbit row0=P1^0;   sbit row1=P1^1;

sbit col0=P3^4;   sbit col1=P3^5;  sbit col2=P3^6;   sbit col3=P3^7;

                                                                                                                                       //10 o  11 n  12 -  13 灭 14 E  15 r

uchar code ledcode[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90, 0xa3, 0xab, 0xbf, 0xff, 0x86, 0x9f};

uchar buf[8];

uchar TCL,TCH,TC,szwd=25,sjwd=0;

uint c=0;

bit fflag=0,keydown=0,swsz=0,sws=0,sdss=0,sdjr=0;


uchar key()

{

    uchar k=25;

        row0=0;   k=col0==0?1:col1==0?2:col2==0?3:col3==0?4:k;    row0=1;

        row1=0;   k=col0==0?5:col1==0?6:col2==0?7:k;              row1=1;

        return k;

}


/*   数码管驱动   */

void dis()

{

     uchar i,j=0x7f;

         for(i=0;i<8;i++)

         {

              cs1=0;cs2=1;

                  P0=ledcode[buf[ i]];wr=1;wr=0;

                  cs1=1;cs2=0;

                  P0=j;wr=1;wr=0;

                  delay(100);

                  j=_cror_(j,1);

                  cs1=cs2=0;

                  P0=0xff;wr=1;wr=0;

         }

}

//初始化DS18B20,成功返回0,失败返回1

bit STA_1820(void){

    bit ack;

        DQ=1;delay(5);

        DQ=0;delay(80);           //拉低总线480~960μS

        DQ=1;delay(5);           //拉高等待15~60μS

    ack=DQ;delay(50);  //读应答位并延时480μS以上

    return ack;        

}


//读DS18B20一字节,返回读到的数

char Read_1820(void){

        unsigned char i,dat=0;

        for(i=0;i<8;i++){

                DQ=0; dat>>=1;         //拉低,右移兼延时

                DQ=1; if(DQ)dat|=0x80; //拉高,读数据

                delay(7);                           //延时使总时间>60μS

        }

        return(dat);

}


//向DS18B20写一字节,参数为要写的数

void Write_1820(unsigned char dat){

        unsigned char i;

        for(i=0;i<8;i++)

    {

                DQ=0;                                  //拉低开始

                DQ=dat&0x01; delay(7);//送数并保持60μS以上

                DQ=1; dat>>=1;                  //拉高,右移准备下一位

        }

}


void st()                                          

{

    if(STA_1820())return;

        Write_1820(0xcc);

        Write_1820(0x44);

}


unsigned int rt(void)                   //读温度

{

    STA_1820();

        Write_1820(0xcc);

        Write_1820(0xbe);

        TCL=Read_1820();

        TCH=Read_1820();

        return(TCH*0X100+TCL)*0.0625;

}

uchar j,n=3,s,s1=1;                                                                                                        

void main()

{

  TMOD=0x01;

  EA=ET0=1;

  while(1)

  {

    if(k==0)

        {

            EA=0;st();EA=1;

                EA=0;sjwd=rt();EA=1;

            buf[0]=10;

                buf[1]=11;

                buf[2]=12;

                buf[3]=szwd/10;

                buf[4]=szwd%10;

                buf[5]=12;

                buf[6]=(sjwd)/10;

                buf[7]=(sjwd)%10;

                //按键处理部分

                if(key()!=25&&keydown==0)

                {

                     delay(200);

                         if(key!=25)

                         {

                             j=key();                                          //取键值

                 keydown=1;

                             switch(j)

                           {

                               case 1:                                                  //水位设置

                                        swsz=1;

                                                break;

                                  /* case        2:                                          //水温设置

                                        sws=1;

                                                break;

                                   case 3:                                                  //手动上水

                                        sdss=!sdss;

                                                break;

                                   case 4:                                                  //手动加热

                                        sdjr=!sdjr;

                                                break;*/               

                           }

                     }

                }            

                if(key()==25)keydown=0;

                //水位处理

                if(swsz==0&&key()==25)                                                                                                                         //检测

                {

                        if(sw0&&sw1&&sw2&&sw3){LED0=0;LED1=1;LED2=1;LED3=1;LED4=1;}                                         //0%                          LED0亮

                    if(sw0==0){LED0=1;LED1=0;LED2=1;LED3=1;LED4=1;}                                                                 //20%                          LED1亮

                    if(sw0==0&&sw1==0){LED0=1;LED1=1;LED2=0;LED3=1;LED4=1;}                                                 //50%                          LED2亮

                    if(sw0==0&&sw1==0&&sw2==0){LED0=1;LED1=1;LED2=1;LED3=0;LED4=1;}                                 //80%                          LED3亮

                    if(sw0==0&&sw1==0&&sw2==0&&sw3==0){LED0=1;LED1=1;LED2=1;LED3=1;LED4=0;}                 //100%                          LED4亮

                }

        if(swsz==1&&key()==1)                             //水位设置

                        {        

                            while(key()==1);                        

                                n=(n+1)%4;                                         //支取0~3

                                switch(n)

                                {

                                    case 0:

                                             LED0=1;LED1=0;LED2=1;LED3=1;LED4=1;                 //设置20%水位

                                                 break;

                                        case 1:

                                             LED0=1;LED1=1;LED2=0;LED3=1;LED4=1;                 //设置50%水位

                                                 break;

                                        case 2:

                                             LED0=1;LED1=1;LED2=1;LED3=0;LED4=1;                 //设置80%水位

                                                 break;

                                    case 3:

                                             LED0=1;LED1=1;LED2=1;LED3=1;LED4=0;                 //设置100%水位

                                                 break;

                                }


                        }

                        if(swsz==1&&key()==25)                                                                         //水位设置按键复位

                    {   

                                     s1=1;

                                         TR0=1;

                                     if(s1==0&&key()==25)

                                         {

                                             s=2;

                                         if(s==0&&key()==25)

                                                 {

                                                      swsz=0;

                                                          TR0=0;

                                                 }

                                         }

                                         else TR0=0;

                         }

                }

        /*        总关闭      */

        else

        {

           buf[0]=buf[1]=buf[2]=buf[3]=13;

           buf[4]=buf[5]=buf[6]=buf[7]=13;

           f=0;

           con=1;

           LED0=LED1=LED2=LED3=LED4=1;

           ka=1;

        }               

        dis();

  }

}

void time0() interrupt 1

{

     TH0=0XFC;

         TL0=0X17;

         if(++c==1000)

         {

             c=0;

                 if(s>0)s--;

         }

         if(++c==999)

         {

              if(s1>0)s1--;

         }

}




分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:385045 发表于 2018-9-28 23:46 | 只看该作者
用一个软件延时就可以搞定的东西,你为啥要用一个定时器延时。
回复

使用道具 举报

板凳
ID:385045 发表于 2018-9-28 23:48 | 只看该作者
void delay(uint i)
{
                uint j,k;
                for(j=i;j>0;j--)
                        for(k=110;k>0;k--);
}
用一个软件延时,进行无意义的运行,来达到延时的目的。没必要使用定时器。
delay(2000);延时2s,如果不是追求特别精确的延时,就可以使用这个
回复

使用道具 举报

地板
ID:246002 发表于 2018-10-1 10:57 | 只看该作者
因为s1永远等于1,所以就进不去下面的if,,在s1=1;后面加一个死循环,括住后面的语句
回复

使用道具 举报

5#
ID:272089 发表于 2018-10-17 10:08 | 只看该作者
supermans 发表于 2018-9-28 23:46
用一个软件延时就可以搞定的东西,你为啥要用一个定时器延时。

两秒没按才可以,按了还要接着重新来的。用delay不是没反应?

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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