微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 按键问题求大神帮助

按键问题求大神帮助

时间:10-02 整理:3721RD 点击:
这是我运用STC89C52单片机和DS18B20做的温度计,能实现温度显示,但是按键都不能用,k1只能加0.1度,K2减0.1,K3没用,k4也不行。我本来是想按一次K3跳到最后一个数码管,按两次跳到上一个,按三下跳第一个,按四下就显示温度。调到第一个数码管按K1就可以实现加1,K2就减1,K4就是调节上下限温度。
#include <reg52.h>
#include <intrins.h>
#define  uchar  unsigned  char
#define  uint   unsigned  int
uchar data b;//定时器中断次数
uchar data buf[4];//字型显示中间变量
sbit  ds = P2^2; //DS18B20接入口
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,//不带小数点的0~9编码
                    0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};//带小数点的0~9编码
sbit dula=P2^6;  //数码管段选线
sbit wela=P2^7;  //数码管位选线
sbit beep=P2^3;  //蜂鸣器
int temp;       //定义整型的温度数据
sbit k1=P3^4;    //+
sbit k2=P3^5;    //-
sbit k3=P3^6;    //确认
sbit k4=P3^7;    //切换
int alarmH=320;
int alarmL=100;
int ss;                //中间的一个变量
int t=0;
int dd;
int j;
int n;
bit set=0;        //初始化
bit Flag=0;
sbit led0=P1^0;
sbit led1=P1^1;
void key_to1();
void key_to2();
void key_to3();
void key_to4();
void delay(uint);
void key();
void Show();
void delay(uint num)//延时程序
{
        while(num--) ;
}
Init_DS18B20(void)                   //传感器初始化
{
        uchar x=0;
        ds = 1;    //DQ复位
        delay(10);  //稍做延时
        ds = 0;    //单片机将DQ拉低
        delay(80); //精确延时 大于 480us    //450
        ds = 1;    //拉高总线
        delay(20);
        x=ds;      //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
        delay(30);
}
tempreadbit(void)  //读一个字节
{
        uchar i=0;
        uchar dat = 0;
        for (i=8;i>0;i--)
        {
                  ds = 0; // 给脉冲信号
                  dat>>=1;
                  ds = 1; // 给脉冲信号
                  if(ds)
                   dat|=0x80;
                  delay(8);
        }
        return(dat);
}
tempwritebit(unsigned char dat)        //写一个字节
{
        uchar i=0;
        for (i=8; i>0; i--)
        {
                  ds = 0;
                  ds = dat&0x01;
                  delay(10);
                  ds = 1;
                  dat>>=1;
        }
        delay(8);
}
uint ReadTemperature(void) //读取温度
{
        uchar a=0;
        uchar b=0;
        float tt=0;
        Init_DS18B20();
        tempwritebit(0xCC); // 跳过读序号列号的操作
        tempwritebit(0x44); // 启动温度转换
        Init_DS18B20();
        tempwritebit(0xCC); //跳过读序号列号的操作
        tempwritebit(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
        a=tempreadbit();//低位
        b=tempreadbit();//高位
        t=b;
        t<<=8;
        t=t|a;
        tt=t*0.0625;
        t= tt*10+0.5;
        return(t);
}
void  display00()     //*********显示负值子函数
{       
    dd=-(temp-1);
    buf[1]=dd/100;
        buf[2]=dd/100;
        buf[3]=dd%100/10;
        buf[0]=dd%10;
        //动态显示
        for(j=0;j<5;j++)
    {
                wela=1;       
            P0=0xfe; //片选LCD1
                wela=0;
                P0=0xff;
                dula=1;
           P0=0x40;
                dula=0;
                delay(100);
                 wela=1;
           P0=0xfd;  //片选LCD2
                wela=0;
                P0=0xff;
                dula=1;
           P0=table[buf[2]];
                dula=0;
                delay(100);
       
                wela=1;
                P0=0xfb;//片选LCD3
                wela=0;
                P0=0xff;
                dula=1;
                P0=table[buf[3]+10];
                dula=0;
                delay(100);
       
                wela=1;
                P0=0xf7; //片选LCD4       
                wela=0;
                P0=0xff;
                dula=1;
                P0=table[buf[0]];                  
                dula=0;
                delay(100);
                P0=0xff;   
    }
}
//显示正值子函数
void  display()
{       
        uint j;       
        buf[1]=temp/1000;//显示百位
        buf[2]=temp/100%10;//显示十位
        buf[3]=temp%100/10;//显示个位
        buf[0]=temp%10; //小数位
        for(j=0;j<3;j++)
        {       
           wela=1;       
           P0=0xfe; //片选LCD1
                wela=0;
                P0=0xff;
                dula=1;
           P0=table[buf[1]];
                dula=0;
                delay(100);
                wela=1;
           P0=0xfd;  //片选LCD2
                wela=0;
                P0=0xff;
                dula=1;
           P0=table[buf[2]];
                dula=0;
                delay(100);
       
                wela=1;
                P0=0xfb;//片选LCD3
                wela=0;
                P0=0xff;
                dula=1;
                P0=table[buf[3]+10];
                dula=0;
                delay(100);
       
                wela=1;
                P0=0xf7;
                wela=0;
                P0=0xff;
                dula=1;
                P0=table[buf[0]];                  //片选LCD4       
                dula=0;
                delay(100);
                P0=0xff;  
        }
}

void key()        //按键扫描子程序
{  
        if(k1==0)
        {
           delay(50);
           if(k1==0)
           {
                    delay(50);
                        while(1)
                          {
                                key_to1();
                            for(n=0;n<8;n++)
                            Show();
                                while(!k1);
                        }
           }
        }
        if(k2==0)
        {
                delay(50);
                if(k2==0)
                {
                  while(1)
                        { key_to2();
                          for(n=0;n<8;n++)
                      Show();
                        }
                while(!k2);
                delay(50);
                while(!k2);       
                }
        }       
        if(k3==0)
        {       
                delay(50);
                if(k3==0)
                {
                        int num;
                        num=0;
                        num++;
                        if(num==5)
                        num=0;
                       
                        if(num==1)
                        {
                                wela=1;P0=0xf7;
                        }
                        if(num==2)
                        {
                                wela=1;P0=0xfb;
                        }
                        if(num==3)
                        {
                                wela=1;P0=0xfd;
                        }
                        if(num==4)
                        {
                                TR0=1; //复位,开定时
                        temp=ReadTemperature();
                        }
               
                }
                while(!k3);
                delay(50);
                while(!k3);       
        }
        if(k4==0)
        {  
                delay(50);
           if(k4==0)
           {  
             set=!set;
                  if(set==0)
                  { alarmH=temp;}  
                  else { alarmL=temp;}  
                       
                }
                while(!k4);
                delay(50);
                while(!k4);
        }
}
void key_to1()
{
        TR0=0;       //关定时器
        if(temp>=1100)
                {temp=-550;}
   if(set==0)
                {temp=alarmH; key_to3();}
        else {temp=alarmL; key_to3();}       
}
void key_to2()
{
            TR0=0;
       //关定时器
     //  temp-=1;
                if(temp<=-550)
                    {temp=1100;}
        if(set==0)
                { temp=alarmH;key_to4();}         
                else {temp =alarmL;key_to4();}
}
void key_to3()
{
        uint num;
        if(num==1)
        {
                dula=1;P0=table[buf[0]+1];
        }
        if(num==2)
        {
                dula=1;P0=table[buf[3]+10+1];
        }
        if(num==3)
        {
                dula=1;P0=table[buf[1]+1];
        }
}
void key_to4()
{
        uint num;
        if(num==1)
        {
                dula=1;P0=table[buf[0]-1];
        }
        if(num==2)
        {
                dula=1;P0=table[buf[3]+10-1];
        }
        if(num==3)
        {
                dula=1;P0=table[buf[1]-1];
        }
}
void alarm(void)
{
          if(temp>alarmH)
          {beep=0;led0=0;led1=1;}
          else if(temp<alarmL)
          {beep=0;led1=0;led0=1;}
          else{beep=1;led1=1;led0=1;}
}
logo()//开机的Logo  
{  
        wela=1;
        P0=0xc0;
        wela=0;
        dula=1;
        P0=0x40;
        dula=0;
        delay(500);
   P1 = 0xff;         //关闭显示
}
void Show()  //显示函数,分别表示温度正负值
{            if(temp>=0)
                {display();}
                if(temp<0)
                {display00();}
}
void  main()
{       
    TCON=0x01; //定时器T0工作在01模式下
    TMOD=0X01;       
         TH0=0XD8;//装入初值
         TL0=0XF0;
         EA=1;  //开总中断
         ET0=1; //开T0中断
         TR0=1; //T0开始运行计数
         EX0=1; //开外部中断0
        for(n=0;n<500;n++)//显示启动LOGo"- - - -"
        {beep=~beep;logo();}
        while(1)
        {
            key();
                ss=ReadTemperature();
        Show();
                alarm();   //报警函数
               
        }         
}
void time0(void) interrupt 1 using 1  //每隔10ms执行一次此子程序
{        TH0=0X56;
        TL0=0XDC;       
        temp=ss;
}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top