⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lcdkey03.c

📁 个人单片机入门程序集合 。很适合刚学单片机的人。用的是keil proteus
💻 C
📖 第 1 页 / 共 2 页
字号:
#include<reg51.h>
#include<intrins.h>
#include<string.h>
#include<stdio.h>
#include<math.h>

#define uint unsigned int
#define uchar unsigned char
#define lcd_bus P1
#define key_bus P0


sbit rs=P3^0;
sbit rw=P3^1;
sbit e =P3^2;
sbit P2_4=P2^4;

sbit beep=P3^5;

sbit load=P2^0;
sbit sclk=P2^1;
sbit sdata=P2^2;
sbit DQ =P3^5;   //定义通信端口

uchar  code table[16]={15,0,14,13,7,8,9,12,4,5,6,11,1,2,3,10};
                    //年月度    
uchar code hanzi[]={0x80,0x0f,0x12,0x0f,0x0a,0x1f,0x02,0x02,  
                    0xf,0x9,0xf,0x9,0xf,0x9,0x11,0,  
                    0x1C,0x14,0x1C,0x0,0x0,0x0,0x00,0x00};     
                                
uchar code str1[]="I LIKE MCU";
uchar code str2[]="INPUT FREQENCY:";
uchar code str3[]="INPUT PHASE:";
uchar code str4[]="1:FREQENCY";     //频率
uchar code str5[]="2:PHASE";        //相位
uchar code str6[]="3:AMPLITUDE";    //幅度
//uchar code str7[]="4: HELP";
uchar code str8[]="4:TEMPERATURE";    //温度
uchar code str9[]="temperature  is:";
uchar code str10[]="5:INPUT TL";
uchar code str11[]="6:INPUT TH";


uchar code he[]=" A:OK B:DEL D:UP";
uchar code am[]="INPUT AMPLITUDE:";
uchar code warn[]="WARNING!!VOLTAGE < 5V";
uchar state=0;

uchar  fre[20];
uchar  TL[3];
uchar  TH[3];
uchar  TLL;
uchar  THH;
void lcd_wrcmd(uchar cmd);
void lcd_wrdata( uchar lcddata);





delay(int d)
{
        while(--d);
}

/*****************读按键***************/
uchar getkey()
{
    uchar keycode=0xff,temp,i;
    key_bus=0x0f;
    temp=key_bus&0x0f; 
    if(temp!=0x0f)              //有键按下
    {
        beep=0;
        key_bus=0x7f;
        for(i=0;i<4;i++)
        {
            temp=key_bus&0x0f;
            if(temp==0x07)
            {    
                keycode=i*4;
                break;
        	}
            else if(temp==0x0b)
        	{
                keycode=i*4+1;
                break;
        	}
            else if(temp==0x0d)
        	{
                keycode=i*4+2;
                break;
        	}
            else if(temp==0x0e)
        	{
                keycode=i*4+3;
                break;
        	}
            key_bus=(key_bus>>1)|0x80;
        }

         while((key_bus&0x0f)!=0x0f)   //等待释放
         {
             key_bus=0x0f; 
         }
         beep=1;                                             
        
     }
     return keycode;
}       


reset(void)
{
   unsigned char x=0;
   DQ = 1;    //DQ复位
   delay(8);  //稍做延时
   DQ = 0;    //单片机将DQ拉低
   delay(80); //精确延时 大于 480us
   DQ = 1;    //拉高总线
   delay(14);
   x=DQ;      //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
   delay(20);
}



//读一个字节
unsigned char read_byte(void)
{
  unsigned char i=0;
  unsigned char dat = 0;
  for (i=8;i>0;i--)
  {
     DQ = 0; // 给脉冲信号
     dat>>=1;
     DQ = 1; // 给脉冲信号
     if(DQ)
        dat|=0x80;        /*LSB to MSB*/
     delay(4);
   }
   return(dat);
}



//写一个字节
write_byte(unsigned char dat)
{
   unsigned char i=0;
   for (i=8; i>0; i--)
   {
      DQ = 0;
      DQ = dat&0x01;
      delay(5);
      DQ = 1;
      dat>>=1;
   }
}




//读取温度

  

//读取温度
unsigned char read_temperature(void)
{
   unsigned char a=0;
   unsigned char b=0;

   reset();
   write_byte(0xCC); // 跳过读序号列号的操作
   write_byte(0x44); // 启动温度转换
   reset();
   write_byte(0xCC); //跳过读序号列号的操作
   write_byte(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
   a=read_byte();
   b=read_byte();
   b=b<<4;
   a=a>>4;

return(a|b);
}





unsigned char tempdisplay(void)
{   
   unsigned char iii,i,r=0,j;
   unsigned char t,stra[3];
   float tt=0;
     lcd_wrcmd(0x0f);
       lcd_wrcmd(0xc9);
       lcd_wrdata(2);
       lcd_wrdata(0x43);
       lcd_wrcmd(0x81);
       for(j=0;j<16;j++)lcd_wrdata(str9[j]);
while(1)
      
{
       t=read_temperature();
        if(t<TLL||t>THH)
        P2_4=0;
        else  P2_4=1;
        stra[0]=t/100+'0';
        stra[1]=t%100/10+'0';
       stra[2]=t%10+'0';
       if(stra[0]=='0')
          r=1;
       lcd_wrcmd(0xc6+r);
       for(i=r;i<3;i++)
       lcd_wrdata(stra[i]);
         lcd_wrcmd(0xcf);
        iii=table[getkey()];
          
            if(iii==13)
          {
                 state=1;
                 lcd_wrcmd(0x0c);
                 lcd_wrcmd(1);
                 lcd_wrcmd(0x80);
                 break;
           }


}
}






dac_tlc5620(uchar send_char)
{
        uchar i;
        load=1;
        sclk=1;sdata=0;sclk=0;
        sclk=1;sdata=0;sclk=0;
        sclk=1;sdata=1;sclk=0;

        for(i=0;i<8;i++)
        {
                sclk=1;
                if(send_char&0x80) sdata=1;
                else sdata=0;
                sclk=0;
                send_char=send_char<<1;
        }
        load=0;
        load=1;

}



/**********判断忙标志,返回的是一个位BF**********/
bit lcd_busy(void)
{
        uchar bflag;     
        rs=0;
        rw=1;
        _nop_();
        e=1;
        _nop_();
        lcd_bus=0xff;
        bflag=lcd_bus;
        e=0;
        return(bit)(bflag&0x80);    //BF=1 busy   
}



/*********写命令,有两个参数,第一个是要写的命令控制字,
第二个是用来控制是否进行忙标志的判断。
busyflag=1:判断;为 0:不判断****************/
void lcd_wrcmd(uchar cmd)
{
        while(lcd_busy());
        lcd_bus=cmd;
        rs=0;
        rw=0;
        _nop_();
        e=1;
        _nop_();
        _nop_();
        e=0; 
}


/************向液晶片写数据***************/
void lcd_wrdata( uchar lcddata)
{
        while(lcd_busy());
        lcd_bus=lcddata;
        rs=1;
        rw=0;
        _nop_();
        e=1;
        _nop_();
        _nop_();
        e=0;
}

/****************初始化***************/
void lcd_ini(void)
{
        lcd_wrcmd(0x38); 
        delay(100);
        lcd_wrcmd(0x0c);
        delay(100);
        lcd_wrcmd(0x06);
        delay(100);
        lcd_wrcmd(0x01);
        delay(100);
}

//////////////////////////////////////////////
//
//    生成汉字子模函数
//    当lcd_wrdata(0);显示第一个汉字
//    当lcd_wrdata(1);显示第二个汉字
//
//////////////////////////////////////////////
lcd_h()
{
    uchar i;
    lcd_wrcmd(0x40);
    for(i=0;i<24;i++) lcd_wrdata(hanzi[i]);
}


welcome()
{
       
       uchar temp=0x12,w;
       lcd_wrcmd(0x0c);
       lcd_wrcmd(0x82); 
          
       for(w=0;w<strlen(str1);w++)
            lcd_wrdata(str1[w]);
       lcd_h();
       lcd_wrcmd(0xc4);
       lcd_wrdata('2'); lcd_wrdata('0');lcd_wrdata('0');lcd_wrdata('7');
       lcd_wrdata(0);
       lcd_wrdata('0');lcd_wrdata('7');
       lcd_wrdata(1);
       while(1)
       {                                                           
           temp=getkey();
           if(temp!=0xff)    //按任意键跳转
           {
               state=1;  
               lcd_wrcmd(1);
               break;
           }
       }
}
   

phase()
{
       uchar i,j,t,cnt=0;    
       lcd_wrcmd(0x0f);
       lcd_wrcmd(0xc9);
       lcd_wrdata(2);
       lcd_wrcmd(0x83);
       for(t=0;t<strlen(fre);t++)lcd_wrdata(0x30+fre[t]);
       lcd_wrcmd(0xc5);
       while(1)                  //按键处理

       { 
           i=table[getkey()];
           if(i<10)
           {     cnt++;
                 if(cnt<=3)
                 {	
                     lcd_wrcmd(0xc5+cnt-1);
                     lcd_wrdata(0x30+i);
                 }       			 
                 else
            	 {
                     cnt=0;             	 					 
                     lcd_wrcmd(0xc5);
                     for(j=0;j<=3;j++)
                         lcd_wrdata(' ');
                     lcd_wrcmd(0xc5);
                 }
            }
            else if(i==12)
            {
                 state=1;
                 lcd_wrcmd(0x0c);
                 lcd_wrcmd(1);
                 lcd_wrcmd(0x80);
                 break;
            }
            else if(i==13)
        	{
                cnt=0;                   					 
                lcd_wrcmd(0xc5);
                for(j=0;j<=3;j++)
                lcd_wrdata(' ');
                lcd_wrcmd(0xc5);    
             }
        }


}



frequency()
{      
       uchar i,j,cnt=0;  // 假如将cnt定义成全局变量,当退出这个界面时,cnt仍然保存原来的值        
       lcd_wrcmd(0x80);  //会出现光标乱跳的错误
       lcd_wrcmd(0xce);
       lcd_wrdata('H');
       lcd_wrdata('Z');
       lcd_wrcmd(0x81);
       for(i=0;i<15;i++)lcd_wrdata(str2[i]);
       lcd_wrcmd(0x0f);
       lcd_wrcmd(0xc0);
      for(i=0;i<20;i++)   
      fre[i]=NULL;
       while(1)                  //按键处理
       { 
           i=table[getkey()];
          
           if(i<10)
           {     cnt++;
                 if(cnt<=10)
                 {	 fre[cnt-1]=i;
                     lcd_wrcmd(0xc0+cnt-1);
                     lcd_wrdata(0x30+i);
                     
                 }       			 
                 else
            	 {
                     cnt=0;             	 					 
                     lcd_wrcmd(0xc0);
                     for(j=0;j<=10;j++)
                         lcd_wrdata(' ');  
                 

                     lcd_wrcmd(0xc0);
                 }
            }
            else if(i==12)
            {
                 state=1;
                 lcd_wrcmd(0x0c);
                 lcd_wrcmd(1);
                 lcd_wrcmd(0x80);
                 break;
            }
            else if(i==13)
        	{
                cnt=0;                   					 
                lcd_wrcmd(0xc0);
                for(j=0;j<=10;j++)
                lcd_wrdata(' ');
                lcd_wrcmd(0xc0);    
        	}
        }

}

warning()
{
    uchar i,ii;
    lcd_wrcmd(1);
    lcd_wrcmd(0x0c);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -