51单片机-时钟

#include "reg52.h"
#include <intrins.h>
typedef unsigned char uchar;
typedef unsigned int uint;
typedef unsigned char u8;
typedef unsigned int u16;
typedef unsigned long u32;
// sbit led = P2 ^ 0;
sbit LSA = P2 ^ 2;
sbit LSB = P2 ^ 3;
sbit LSC = P2 ^ 4;

// display 0-9 A-F
u8 smgduan[17] = {0x3f, 0x06, 0x5b, 0x4f,
                  0x66, 0x6d, 0x7d, 0x07,
                  0x7f, 0x6f, 0x77, 0x7c,
                  0x39, 0x5e, 0x79, 0x71};
sbit key1 = P3 ^ 1;
sbit led = P2 ^ 0;
static u32 number = 86389;

// unsigned char h = 23, m = 59, s = 59;
// unsigned char f1 = 0, f2 = 0, f3 = 0;
void delay(uint i)
{
    while (i--)
        ;
}
void keypros()
{
    if (0 == key1)
    {
        delay(1000);
        if (0 == key1)
        {
            led = ~led;
        }
        while (!key1)
            ;
    }
}
void Timer0Init()
{
    TMOD |= 0x01;
    TH0 = 0xfc;
    TL0 = 0x18;
    ET0 = 1;
    EA = 1;
    TR0 = 1;
    // TL1 = (65536 - 50000) % 256;
    // TH1 = (65536 - 50000) / 256;
}
void smg_display(u8 location, u8 num)
{
    switch (location - 1)
    {
    case (0):
        LSA = 1;
        LSB = 1;
        LSC = 1;
        break;
    case (1):
        LSA = 0;
        LSB = 1;
        LSC = 1;
        break;
    case (2):
        LSA = 1;
        LSB = 0;
        LSC = 1;
        break;
    case (3):
        LSA = 0;
        LSB = 0;
        LSC = 1;
        break;
    case (4):
        LSA = 1;
        LSB = 1;
        LSC = 0;
        break;
    case (5):
        LSA = 0;
        LSB = 1;
        LSC = 0;
        break;
    case (6):
        LSA = 1;
        LSB = 0;
        LSC = 0;
        break;
    case (7):
        LSA = 0;
        LSB = 0;
        LSC = 0;
        break;
    }
    P0 = smgduan[num];
    delay(100);
    P0 = 0x00;
}
void showNumbers()
{
    u32 h, m, s;
    h = number / 3600;
    m = number % 3600 / 60;
    s = number % 60;
    if (h < 10)
    {
        smg_display(1, 0);
        smg_display(2, h);
    }
    else if (h < 24)
    {
        smg_display(1, h / 10);
        smg_display(2, h % 10);
    }
    else
    {
        number = 0;
    }
    if (m < 10)
    {
        smg_display(3, 0);
        smg_display(4, m);
    }
    else
    {
        smg_display(3, m / 10);
        smg_display(4, m % 10);
    }
    if (s < 10)
    {
        smg_display(5, 0);
        smg_display(6, s);
    }
    else
    {
        smg_display(5, s / 10);
        smg_display(6, s % 10);
    }
}
void main()
{
    Timer0Init();
    led = 1;
    showNumbers();
    while (1)
    {
        showNumbers();
        //     keypros();
        //     displayNumber();
    }
}
void Timer0() interrupt 1
{
    static unsigned int i;
    TH0 = 0xfc;
    TL0 = 0x18;
    i++;
    if (1000 == i)
    {
        i = 0;
        number++;
    }
}

 

posted on 2023-09-29 19:24  风中狂笑  阅读(23)  评论(0编辑  收藏  举报

导航