×
单片机 > 单片机程序设计 > 详情

51单片机1602液晶程序

发布时间:2020-08-21 发布时间:
|
#include

#define Lcd_Data P0
sbit RS=P2^0;
sbit RW=P2^1;
sbit E=P2^2;
sbit Busy=P0^7;
sbit k1=P1^0;
sbit k2=P1^1;
sbit k3=P1^2;
sbit k4=P1^3;
sbit buzzer=P3^7;
unsigned int hour,min,second,day,month,year;  ////////定义的几个时间
unsigned char code Time[] = {"Time:           "};////用于显示
unsigned char code num[] = {"0123456789ABCDEF"};/////////////用于液晶显示
unsigned char code haha[]={"^_^"};
unsigned char code middle[]={":"};
unsigned int numberflag;
 unsigned int number;
unsigned  code heart[]={0x03,0x07,0x0f,0x1f,0x1f,0x1f,0x1f,0x1f, 
                        0x18,0x1E,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f, 
                       0x07,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f, 
                       0x10,0x18,0x1c,0x1E,0x1E,0x1E,0x1E,0x1E, 
                      0x0f,0x07,0x03,0x01,0x00,0x00,0x00,0x00, 
                      0x1f,0x1f,0x1f,0x1f,0x1f,0x0f,0x07,0x01, 
                      0x1f,0x1f,0x1f,0x1f,0x1f,0x1c,0x18,0x00, 
                      0x1c,0x18,0x10,0x00,0x00,0x00,0x00,0x00};//心图案
unsigned int t0_1S;//定义0.1S变量
unsigned char keyvalue;//定义键值
void delay(unsigned int time)/////////////////////////////////////////////延时程序
{
 while(time--);
}
void Delay_1ms(unsigned char t)///////////////////////////精确延时子程序,延时 1MS*t S
{
 unsigned char a;
 while(--t != 0)
 {
  for(a = 0; a < 125; a++);
 }
}
////////////////////////////////////////////////
///////////////////////////////////////////////////
//////////////////////////////////////////////////液晶的程序
void Read_Busy(void)
{
 do{     Lcd_Data=0xff;
   RS=0;
   RW=1;
   E=0;
   delay(2);
   E=1;}while(Busy);
}
void Write_Comn(unsigned char comn)
{
 Lcd_Data=comn;
 RS=0;
 RW=0;
 E=0;
 Read_Busy();
 E=1;
}
void Write_Data(unsigned char Lcddata)
{
 Lcd_Data=Lcddata; 
 RS=1;
 RW=0;
 E=0;
 Read_Busy();
 E=1;

}
void init()  
{
 Write_Comn(0x01); ///清显示
 delay(50);
 Write_Comn(0x02); //光标位于左上方
 Write_Comn(0x38); //5*8点阵  8位2行
 Write_Comn(0x06);//  文字不动,光标右移 
 Write_Comn(0x0f);///光标闪烁
}
////////////////////////////////////////////////////
//////////////////////////////////////////////
////////////////////////////////////////////////////
///////////////////////////////////////////以上为lcd的程序;
/////////////////////////////////////////以下为键盘扫描的程序
void KEY4X4_scan(void)
{
    keyvalue=0x00;//无按键时返回Ox00
 P1=0xFE;//扫描第1行
 delay(1);
 if((P1&0xF0)!=0xF0)
  keyvalue=(P1>>4)|0x10;//返回键值
 P1=0xFD;//扫描第2行
 delay(1);
 if((P1&0xF0)!=0xF0)
  keyvalue=(P1>>4)|0x20;//返回键值
 P1=0xFB;//扫描第3行
 delay(1);
 if((P1&0xF0)!=0xF0)
  keyvalue=(P1>>4)|0x30;//返回键值
 P1=0xF7;//扫描第4行
 delay(1);
 if((P1&0xF0)!=0xF0)
  keyvalue=(P1>>4)|0x40;//返回键值
 // return keyvalue;
}
//////////////////////////////////////////////////
/////////////////////////////////////////////////
///////////////////////////////////////////////秒表程序
void seconddisplay(void)//显示时间
{
 unsigned char aa = 0, bb = 0, cc = 0, dd = 0,ee = 0;//定义时间各个位 
    if(t0_1S>60000)t0_1S=0;
 aa=t0_1S/10000;
 bb=t0_1S%10000/1000;
 cc=t0_1S%1000/100;
 dd=t0_1S%100/10;
 ee=t0_1S%10;
 Write_Comn(0xc9);  
 Write_Data(num[aa]);
 Write_Data(num[bb]);
 Write_Data(num[cc]);
 Write_Data( num[dd] );
    Write_Data('.');
 Write_Data(num[ee]);
 Write_Data('S');
 
}

  /////////////////////////////////////////////////////////////秒表
void mysecond()
{            unsigned int i;
                              init();//初始化液晶
         Write_Comn(0x01);//清显示
         k1=1;k2=1; 
         t0_1S=0;
         Write_Comn(0x80);
        
         for(i=0;i<16;i++)
          {
          Write_Data( Time[i] );//显示time字样
          }
      run:
       seconddisplay();
         if(k1==0)
            {  
            while(1)
            {
                Delay_1ms(100);//延时0.1S
             t0_1S++;
             seconddisplay();
                       if(k2==0)
                {
                 while(1)
                 {
                 if(k1==0)break;
                 if(k3==0){t0_1S=0;
                           goto over;
                    }
                     } 
                }
                       }
                }
       goto run;
       over:
       t0_1S=0;
         
}
///////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
void showheart()
{
         unsigned int i;                // char m=0; 
                       init(); 
                      Write_Comn(0x40);             //设定CGRAM地址 
          for(i=0;i<64;i++)    //将心型代码写入CGRAM中 
          { 
                  Write_Data(heart[i]);           
          } 
          Write_Comn(0x85);        //设定上排的显示位置 
          for(i=0;i<4;i++)        //显示心型图案的上半部分 
          { 
                  Write_Data(i); 
          } 
          Write_Comn(0xc5);        //将显示坐标转移到下排和上排相对应的地方 
          for(i=4;i<8;i++)        //显示心型图案的下半部分 
          { 
                  Write_Data(i); 
          }

 


}
//////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////
/////////////////////////////////////////////
////////////////////////////////////////////////
///////////////////////////////////定时器中断的初始化
void init_int()
{
     TMOD=0x01;
  TH0=(65536-50000)/256;
  TL0=(65536-50000)%256;
  ET0=1;
  TR0=1;
  EA=1;
}
  void edit(unsigned int t)////////////////////////////对月,天 时 分 秒的计算
  {
  unsigned int a,b;
  a=t/10;
  b=t%10;
  Write_Data(num[a]);
  Write_Data(num[b]);
  }
void showmiddle(unsigned int x)///////////////////////////////显示冒号的函数
{   Write_Comn(x);
      Write_Data(middle[0]);
}
void  showhaha(unsigned int x) //////////////////////////////////显示笑脸的函数
{ unsigned int i;
 Write_Comn(x);
    for(i=0;i<3;i++)
   Write_Data(haha[i]);
}
 void showtime()
 { unsigned int a,b,c,d;
   
    
     a=year/1000;
  b=(year%1000)/100;
  c=((year%1000)%100)/10;
  d=year%1000%100%10;
   init();
  showhaha(0x80);  /////////////////////////////////显示笑脸
  Write_Comn(0x80+3);
  Write_Data(num[a]);
  Write_Data(num[b]);
  Write_Data(num[c]);
  Write_Data(num[d]);
  
  showmiddle(0x80+7); ////////////////////////////显示冒号
  Write_Comn(0x80+8);
     edit(month);

  showmiddle(0x80+10); ////////////////////////////显示冒号  
  Write_Comn(0x80+11);
  edit(day);
  showhaha(0x80+13);///////////////////////////////////////显示笑脸
 showhaha(0xc0+1);  //////////////////////////////////////显示笑脸
  Write_Comn(0xc0+4);
  edit(hour);

  showmiddle(0xc0+6);   ////////////////////////////显示冒号
  Write_Comn(0xc0+7);
  edit(min);

    showmiddle(0xc0+9); /////////////////////////////////显示冒号
  Write_Comn(0xc0+10);
  edit(second);
  showhaha(0xc0+12);////////////////////////////////显示笑脸
 }
 //////////////////////////////////
 /////////////////////////////////////
 ///////////////////////////////键盘上显示数字的小函数
 void shownumber()
 {
                              numberflag=0;
                          Write_Comn(0x80+number-1);
                       Write_Data(num[number]);
 }

 

关键字:51单片机  1602液晶  显示控制

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
51单片机CO2检测显示程序解析