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

📄 shizhong.c

📁 用1602液晶显示的时钟程序。用C写的
💻 C
字号:
#include < reg52.h >
#include < intrins.h >
#define uchar unsigned char
#define uint  unsigned int
sbit  LCD_RS = P2^0;             
sbit  LCD_RW = P2^1;
sbit  LCD_EN = P2^2;
sbit  key1=P1^0;
sbit  key2=P1^1;
sbit  key3=P1^2;
sbit  key4=P1^3;
uchar hour=0,min=0,sec=0;
uchar year,year1=20,year2=8,month=7,date=26,week=6,j;
uint count=0,i;
uchar   a[ ] = {"    -  -        "};
               //0123456789ABCDEF
uchar   b[ ] = {"TIME:   00-00-00"};

uchar tab[]={'0','1','2','3','4','5','6','7','8','9'};
/**********************************************************

* 5us 延时子程序

**********************************************************/
void  delayNOP()
{
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();         	  
}
/**********************************************************

* 延时子程序

**********************************************************/
void delay(uint ms) 
{
   uchar t;
   while(ms--)
   { 
     for(t = 0; t < 120; t++);
   }
}
/**********************************************************

* 检查LCD忙状态                                           
* lcd_busy为1时,忙,等待。                               
* lcd-busy为0时,闲,可写指令与数据                        

**********************************************************/ 
bit lcd_busy()
 {                          
    bit result;
    LCD_RS = 0;
    LCD_RW = 1;
    LCD_EN = 1;
    delayNOP();
    result = (bit)(P2&0x80);
    LCD_EN = 0;
    return(result); 
 }
/************************************/
void lcd_writedata( uchar in_data) 
{
    uchar Hdata,Ldata;
    while(lcd_busy());
    Hdata=in_data&0xf0;         //取高四位
    Ldata=(in_data<<4)&0xf7;    //取低四位
    delayNOP();
    
    P2 = Hdata;                 //发送高四位 
    LCD_RS=1;                 //写入数据 
    LCD_RW=0;
    LCD_EN=0;
    delay(5);    
    LCD_EN=1;
    delay(5);
    LCD_EN=0;
    delay(5);
    
         
    P2 = Ldata;                 //发送低四位 
    LCD_RS=1;                 //写入数据 ,RS=1,,RW=0时是写入数据      
    LCD_EN=1;
    delay(5);
    LCD_EN=0;
    delay(5);
}
/*********************************************************

* 写指令或数据

 写入命令

*********************************************************/
void lcd_writecom(uchar com) 
{
    uchar Hdata,Ldata;

    while(lcd_busy());

    Hdata=com&0xf0;         //取高四位
    Ldata=(com<<4)&0xf7;    //取低四位
    delayNOP();

    P2 = Hdata;                 //发送高四位
    LCD_RS = 0;                 //写入命令 ,RS=0,,RW=0时是写入命令
    LCD_RW = 0;
    LCD_EN = 0;
    delayNOP();
    LCD_EN = 1;
    delayNOP();
    LCD_EN = 0;
    delayNOP();

    P2 = Ldata;                 //发送低四位
    LCD_RS = 0;                 //写入命令 ,RS=0,,RW=0时是写入命令
    LCD_EN = 1;
    delayNOP();
    LCD_EN = 0;
    delayNOP();
}
/**********************************************************

*  设定显示位置                                             
                                                        
**********************************************************/
void lcd_pos(uchar pos)
{                          
  lcd_writecom(pos=pos+0x80);     //数据指针=80+地址变量
}
/**********************************************************

* 定义display1函数                                            
                                                        
**********************************************************/
void display1()
{  
  unsigned char i;

  while(lcd_busy());
  delayNOP();
  lcd_writecom(0x80);
  delayNOP();
  while(lcd_busy());
  delayNOP();
  for(i=0;i<16;i++)
  {lcd_writedata(a[i]);  
   delayNOP();
   while(lcd_busy());}
}
/**********************************************************

* 定义display2函数                                            
                                                        
**********************************************************/
void display2()
{  
  unsigned char i;

  while(lcd_busy());
  delayNOP();
  lcd_writecom(0xc0);
  delayNOP();
  while(lcd_busy());
  delayNOP();
  for(i=0;i<16;i++)
  {lcd_writedata(b[i]);  //display
   delayNOP();
   while(lcd_busy());}
}
/*************************************************************

*  LCD初始化设定                                             

*************************************************************/
void lcd_init()
{
    uchar  m;
    delay(15);
    lcd_writecom(0x28);      //16*2显示,5*7点阵,4位数据,
    delay(5);
    lcd_writecom(0x28);
    delay(5);
    lcd_writecom(0x28);

    delay(5);
    lcd_writecom(0x0c);      //显示开,关光标
    delay(5);
    lcd_writecom(0x06);      //移动光标
    delay(5);
    lcd_writecom(0x01);      //清除LCD的显示内容
    delay(25);
    
    lcd_pos(0x00);           //设置显示位置为第一行
    for(m=0;m<16;m++)
    { lcd_writedata(a[m]);    //显示是通过写来实现的
      delay(150);}

    lcd_pos(0x40);           //设置显示位置为第二行     
    for(m=0;m<16;m++)
    {lcd_writedata(b[m]);
      delay(50);}
            		 //延时
}
/**********************************************************

* 主函数

**********************************************************/
void  main()
{
    TMOD=0X01;
    EA=1;
    ET0=1;
    TR0=1;
    TH0=(65536-49950)/256;
    TL0=(65536-49950)%256;

    lcd_init();              //LCD1602初始化
    
     while(1)
   {
    a[0]=tab[year1/10];
    a[1]=tab[year1%10];
    a[2]=tab[year2/10];
    a[3]=tab[year2%10];
    a[5]=tab[month/10];
    a[6]=tab[month%10];
    a[8]=tab[date/10];
    a[9]=tab[date%10];
    a[13]=tab[week%10];
    display1();

    b[15]=tab[sec%10];
    b[14]=tab[sec/10];
    b[12]=tab[min%10];
    b[11]=tab[min/10];
    b[9]=tab[hour%10];
    b[8]=tab[hour/10];
    if(key1==0)
    {delay(5);if(key1==0){min=min+10;if(min>=60){min=0;}}}
    if(key2==0)
    {delay(5);if(key2==0){min++;if(min==60){min=0;};}}
    if(key3==0)
    {if(key3==0){delay(5);hour++;}}
    if(key4==0)
    {if(key4==0){delay(5);hour--;}if(hour<=0)hour=24;}
    display2();
    }
}
void time0()interrupt 1 
{
 TH0=(65536-49950)/256;
 TL0=(65536-49950)%256;
 count++;
 if(year1>99)
 {year1=0;year2++;}
 if(year2>99)
 year2=0;
 if(count==20)
 {count=0;sec++;}
 if(sec==60)
 {sec=0;min++;}
 if(min==60)
 {min=0;hour++;}
  if(hour==24)
 { hour=0;date++;week++; }
 if(week>7)
  {week=1;}
   switch(month)
  {
   case  1:  
   case  3:
   case  5:
   case  7:
   case  8:
   case 10:
   case 12: if(date>31)
             {date=1;month++;}
             if(month>12)
             { month=1;year2++;}
             if(year2>99)
               {year2=0;year1++;}
                break;   
   case  2: year=year1*100+year2;
           if(year%4==0)
          {if(year%100==0)
          {if(year%400==0)
                   j=13;
                   else
                   j=14;}
                   else
                   j=13;}
                   else
                   j=14; 
             switch(j)
        {case 13:if(date>29)
               {date=1; month++;} 
              break;
         case 14:if(date>28)
             {date=1;month++;}
              break;}
              break;
   case  4:
   case  6:
   case  9:
   case 11:if(date>30)
           {date=1;month++;}
            break;
   }
 }

⌨️ 快捷键说明

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