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

📄 4.1.c

📁 单片机C51典型应用设计代码共11章包括液晶显示代码
💻 C
字号:
#include <reg51.h>

//extern register char cputick;
unsigned  char sec100,sec,sec5,min,hour,flag1,command,ACC1,temp,opto,cputick;
unsigned  char i,digit,buffer[4],onHour1,onMin1,offHour1,offMin1;
char key,delay,count1;
char convert[10] = {0x3F,0x0c,0x76,0x5e,0x4d,0x5b,0x7b,0x0e,0x7f,0x5f};

main()
{
  opto = 0xff;
  cputick = 0;
  hour = 18;
  min = 0;
  sec = 0;
  key = -1;
  flag1 = 0;
  onHour1 = 18;       // 18:30打开LED
                        
  onMin1 = 01;
  offHour1 = 18;     // 21:30 关闭LED
  offMin1 = 02;
  count1 = 0;
  buffer[0] = 0x40;
  buffer[1] = 0x40;
  buffer[2] = 0x40;
  buffer[3] = 0x40;

//void serinit(9600);       //调用tiny模式                      
//  while(1)
//  {
//    while ( cputick < 1)
//    scanLED();
//    cputick = 0;
//任务执行周期10ms     

//    time();
 //   timeToBuffer();
//    blink();
//    offmsd();
 //   keyexe();
//  keydelay();
//  comparetime();

//   }
}
   
time()
//更新实时时钟
{
   sec100++;
   if (sec100 >= 100)        // 100 * 10 ms = 1 s 
   {sec100 = 0;
flag1 |= 0x05;           //置 0位,2位 
                       
    temp = 50;
    sec++;
    if (sec >= 60)
    {sec = 0;
flag1 |= 0x02;         //置1位
                       
     min++;
     if (min >= 60)
     {min = 0;
     hour++;
     if (hour >= 24)
     {hour = 0;

    }
  }
 }
}
}

scanLED()                      //扫描LED和4个键                                

{
    int i;
    digit = 0x08;
    key = -1;
    for( i = 0; i < 4; i++)         // 扫描 
    {
        P3 = ~digit & opto;     // 完成第2个 
                                
        P1 = ~buffer[i];         
       // pause(1);             //延迟
                               
        P1 = 0xff;            // 关闭LED 
        if ((P3 & 0x10) == 0)   // 如果键按下 P3.4 变低 
           key = i;           // 存键值 
        digit>>=1;            //下一个
    }
}

timeToBuffer()
{
    buffer[0] = convert[min%10];
    buffer[1] = convert[min/10];
    buffer[2] = convert[hour%10];
    buffer[3] = convert[hour/10];

}

blink()
{
    if((flag1 & 0x04) != 0)         // 检查bit 2 
     {temp--;
        if (temp != 0)
                {
                buffer[1] |= 0x80;
                buffer[2] |= 0x80;
                }
                else( flag1 &= ~0x04);
      }
}

keyexe()
{
    if (key != -1)
    {
        if ((flag1 & 0x80) == 0)        //延时 0.5 秒 
            {
                flag1 |= 0x80;
                delay = 50;

      switch(key){
        case (0):                    // 0 键
        manualOnOff();             // 处理0 键
        break;
        case (1):                   //1键
        savetimeOnOff1();           // 处理1键
        break;
        case (2):                  //2键
        setmin();                  //处理2键,设置分
        break;
        case (3):                  //3键
        sethour();                 //处理3键,设置小时
                  }
                }

    }
}

sethour()
{
    hour++;
    if ( hour== 24)
    hour = 0;

}

setmin()
{
    min++;
    sec = 0;
    if( min == 60 )
    min = 0;
}

savetimeOnOff1()

{
    count1++;
    if (count1 == 1)
    {
    onHour1 = hour;
    onMin1 = min;
    buffer[0] = 0x00;
    buffer[1] = 0x68;
    buffer[2] = 0x78;
    buffer[3] = 0x71;
    showOnce();
    }
    else
    {
        count1 = 0;
        savetimeOff1();
    }
}

savetimeOff1()

{
    offHour1 = hour;
    offMin1 = min;
    buffer[0] = 0x63;
    buffer[1] = 0x63;
    buffer[2] = 0x78;
    buffer[3] = 0x71;
    showOnce();
}

manualOnOff()

{
    opto= ~opto | 0x7f;         // 激活P3.7 
    if ((opto & 0x80) == 0)
    {
        buffer[0] = 0;
        buffer[1] = 0;
        buffer[2] = 0x68;
        buffer[3] = 0x78;
        showOnce();
    }
    else
    {
        buffer[0] = 0;
        buffer[1] = 0x63;
        buffer[2] = 0x63;
        buffer[3] = 0x78;
        showOnce();
    }
}

showOnce()
{
    int i;
    for(i=0;i<500;i++)
    scanLED();
}
keydelay()
{
    if ((flag1 & 0x80) !=0)
        {
            delay--;
        if(delay == 0)
            flag1 &= ~0x80;
        }
}

comparetime()
{
    if((flag1 & 0x01) != 0 )
    {
        flag1 &= ~0x01;
    if(hour == onHour1 && min == onMin1)
            opto = 0x7f;                      // 清P3.7   
    if(hour == offHour1 && min == offMin1)
            opto = 0xff;                      // 关闭P3.7 
    }
}

offmsd()

{
    if (buffer[3] == 0x3f)                  
       buffer[3] = 0x00;
}

pause(j)
int j;
{
   int i;
   for (i = 0; i < j; i++)
   ;
}

⌨️ 快捷键说明

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