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

📄 6 wendu.c

📁 一些驱动程序和显示程序及传感器的简单应用,再软件和硬件上全部调试通过,可以直接使用
💻 C
📖 第 1 页 / 共 2 页
字号:
//////////////////////////////////////////////////////////////
//
//          1602子程序
//函数说明:delay(uchar d)             延时2us程序
//          lcd_wrcmd(uchar cmd)       写命令子程序
//          lcd_wrdata(uchar lcddata)  写数据子程序
//          lcd_h()                    建立自定义字符库

//

        
//////////////////////////////////////////////////////////////

#include<reg51.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
#define lcd_bus P1
#define key_bus P2
uchar offset=0x80;
uchar d[2]={0x30,0x30};
uchar tem1[3];
uchar tem2[4];
uchar tplsb,tpmsb;
uchar temp1,temp2;

sbit rs=P0^5;
sbit rw=P0^6;
sbit e =P0^7;
sbit DQ=P3^3;
sbit alert=P0^0;    

//sbit rs=P3^2;
//sbit rw=P3^3;
//sbit e =P3^4;
//sbit beep=P3^5;

sbit load=P2^0;
sbit sclk=P2^1;
sbit sdata=P2^2;

                    //年月摄氏度	
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,
                    0x06,0x08,0x10,0x10,0x10,0x08,0x06,0x00};  
uchar code table[15]={0,0x30,0,0x2e,0x37,0x38,0x39,0,0x34,0x35,0x36,0,0x31,0x32,0x33};   
uchar code num[11]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};   

                                
uchar code str1[]="THE MIN SYSTEM";
uchar code str2[]="the tempreture:";
//uchar code str3[]="INPUT PHASE:";
uchar code str4[]="A: voltage";  //电压
uchar code str5[]="B: tempreture"; //温度
uchar code str6[]="C: input";    //标定
uchar code str7[]="D: help";
uchar code he[]="*:OK #:UP(clear)";
uchar code am[]="please input:";
//uchar code warn[]="WARNING!!VOLTAGE < 5V";
uchar state=0;




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;

}

*/

//////////////////////////////////////////
delay(uchar d)
{
        while(--d);
}


/**********判断忙标志,返回的是一个位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<32;i++) lcd_wrdata(hanzi[i]);
}

/*****************读按键***************/
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;
}       


welcome()
{
       
       uchar temp,i;
       lcd_wrcmd(0x0c);
       lcd_wrcmd(0x82); 
          
       for(i=0;i<14;i++)
            lcd_wrdata(str1[i]);
       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,cnt=0;    
       lcd_wrcmd(0x0f);
       lcd_wrcmd(0xc9);
       lcd_wrdata(2);
       lcd_wrcmd(0x83);
       for(i=0;i<12;i++)lcd_wrdata(str3[i]);
       lcd_wrcmd(0xc5);
       while(1)                  //按键处理

       { 
           i=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==10)
            {
                 state=1;
                 lcd_wrcmd(0x0c);
                 lcd_wrcmd(1);
                 lcd_wrcmd(0x80);
            	 break;
        	}
            else if(i==11)
    		{
                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);
       while(1)                  //按键处理
       { 
           i=getkey();
           if(i<10)
           {     cnt++;
                 if(cnt<=10)
        		 {	
                     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==10)
            {
                 state=1;
                 lcd_wrcmd(0x0c);
                 lcd_wrcmd(1);
                 lcd_wrcmd(0x80);
            	 break;
        	}
            else if(i==11)
    		{
                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);
    lcd_wrcmd(0x83);
    for(i=0;i<9;i++)
        lcd_wrdata(warn[i]);
    lcd_wrcmd(0xc1);	 
    for(i=0;i<12;i++)
        lcd_wrdata(warn[i+9]);
    while(1)
    {
        ii=getkey();
        if(ii!=0xff)
    	{
            lcd_wrcmd(1);
            break;
            
    	}

    }
}


uchar dac_convert(uchar *amp)
{
    uint v;
    v=amp[2]*100+amp[1]*10+amp[0];
    if(v<500)
    {
         v=32*v;
         dac_tlc5620(v/100);
         return 0;
     }
     else
     {
         return 1;
     }
        
}


amplitude()
{
     uchar i,ii;
     uchar amp[3],t=0;
     lcd_wrcmd(0x80);
     for(i=0;i<16;i++)
         lcd_wrdata(am[i]);
     lcd_wrcmd(0xcc);
     lcd_wrdata('V');
     lcd_wrcmd(0xc8);
     lcd_wrdata('.'); 
     lcd_wrcmd(0x0f);            //开光标
     lcd_wrcmd(0xc7);
     while(1)
     {
         ii=getkey();
         if(ii==10)
    	 {
             if(t==4)
        	 {
                 if(dac_convert(amp))
        		 {
                     warning();
                     break;
        		  }
        	 }
             lcd_wrcmd(0x0c);
             state=1;
             lcd_wrcmd(1);
             break;
    	 }
         if(ii<10)
         {	 
             t++;
             if(t==1)
        	 {
                lcd_wrcmd(0xc9);
        	 }
             if(t==2)t++;
             if(t==1)amp[2]=ii;
             else if(t==3)amp[1]=ii;
             else if(t==4)amp[0]=ii;	     

             if(t==5)
        	 {
                  t=0;
                  lcd_wrcmd(0xc7);
                  lcd_wrdata(' '); lcd_wrdata('.');lcd_wrdata(' ');lcd_wrdata(' ');
                  lcd_wrcmd(0xc7);
        	 }
        	 else
        	 {
                  lcd_wrcmd(0xc6+t);
                  lcd_wrdata(0x30+ii);
        	 }
        	 			 
    		 
    	 }

                 
     }
    
}
*/
 
///////////////////////////////////输入函数////////////////////////////////////
 /*****************************************/

/*****************************************/

 /* 延时t毫秒 */
void delay2(uint t)
{
    uint i;
    while(t--)
    {
        /* 对于11.0592M时钟,约延时1ms */
        for (i=0;i<125;i++)
    	{}
    }
} 

/* 产生复位脉冲初始化DS18B20 */
void TxReset(void)
{
    uint i;
    DQ = 0;

    /* 拉低约900us */
    i = 100;
    while (i>0) i--;	
    
    DQ = 1;             // 产生上升沿
    i = 4;
    while (i>0) i--;
}

⌨️ 快捷键说明

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