LED

  1. Turn an LED on
  2. Turn a digit LED on
  3. count down

hardware

Cathode Share LED digit codes

digit code
0 0x3f
1 0x06
2 0x5b
3 0x4f
4 0x66
5 0x6d
6 0x7d
7 0x07
8 0x7f
9 0x6f
A 0x77
B 0x7c
C 0x39
D 0x5e
E 0x79
F 0x71
0x00

code

#include <reg52.h>

void delay (unsigned int xms);

void main()
{
    int i = 0;
    while(1)
    {
        P1 = 0xfe; // 1111 1110
        for (i = 0; i < 8; i++)
        {
            delay(1000);
            P1 <<= 1; // P1 = P1 << 1;
            P1 = P1 | 0x01;
        }
    }
}

void delay (unsigned int xms)
{
    unsigned int i,j;
    for (i = xms; i > 0; i--)
        for(j = 112; j < 0; j--);
}

Timeout toggle

#include <reg52.h>

sbit led = P1^0;
int i = 0;

void timer1_init()
{
    TMOD = 0x10; // timer 1 mode 2, 16-bits
    TH1 = 0x4C; // set TH1 initial value 
    TL1 = 0x00; // set TL1 initial value
    EA = 1;     // open general interrupt
    ET1 = 1;    // open timer T0 interrupt
    TR1 = 1;    // start T0
}

void main()
{
    led = 1;
    timer1_init();
    while(1)
    {
        if (i == 10)
        {
            led = ~led;
            i = 0;
        }
    }
}

void time1() interrupt 3
{
    TH1 = 0x4c; // init as 50ms
    TL1 = 0x00;
    i++;
}

digit display

#include <reg52.h>
#define duan P0

sbit wei1 = P2^4;
sbit wei2 = P2^5;
sbit wei3 = P2^6;
sbit wei4 = P2^7;

void main()
{
    wei1 = 1;
    wei2 = 0;
    wei3 = 0;
    wei4 = 0;

    duan = 0x7c; // 0111 1100 "b"
    while(1);
}

LED digit dynamic display

#include <reg52.h>
#define duan P0
#define uchar unsigned char

sbit wei1 = P2^4;
sbit wei2 = P2^5;
sbit wei3 = P2^6;
sbit wei4 = P2^7;

uchar code sz[17] = {
    0x3f,
    0x06,
    0x5b,
    0x4f,
    0x66,
    0x6d,
    0x7d,
    0x07,
    0x7f,
    0x6f,
    0x77,
    0x7c,
    0x39,
    0x5e,
    0x79,
    0x71,
    0x00
};

void delay (unsigned int xms)
{
    unsigned int i,j;
    for (i = xms; i > 0; i--)
        for(j = 112; j < 0; j--);
}

void main()
{
    while(1)
    {
        duan = sz[4];
        wei1 = 0;
        wei2 = 0;
        wei3 = 0;
        wei4 = 1;
        delay(1000);
        duan = sz[3];
        wei1 = 0;
        wei2 = 0;
        wei3 = 1;
        wei4 = 0;
        delay(1000);
        duan = sz[2];
        wei1 = 0;
        wei2 = 1;
        wei3 = 0;
        wei4 = 0;
        delay(1000);
        duan = sz[1];
        wei1 = 1;
        wei2 = 0;
        wei3 = 0;
        wei4 = 0;
        delay(1000);
    }
}

流水灯

led

/****
 * 利用位移指令实现流水灯
 * hardware: STC89C51RC
 * crystal: 12.0MHz
 */

#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char

void delayms(uint ms)
{
    uint i;
    while (ms--)
    {
        for (i=0;i<120;i++);
    }
}

void main(void)
{
    uchar i,j;
    P0 = 0xFF;
    while (1)
    {
        j = 0x01;
        for (i=0; i<8;i++)
        {
            P0=~j;
            delayms(250);
            j=j<<1;
        }
        j = 0x80;
        for (i=0;i<8;i++)
        {
            P0 = ~j;
            delayms(250);
            j = j>>1;
        }
    }
}
/**
 * 利用移位+intrins.h 实现流水灯
 * hardware: stc89c51rc
 * crystal: 12.0MHz
 */
#include <reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char

void delayms(uint ms)
{
    uint i;
    while (ms--)
    {
        for (i=0;i<120;i++);
    }
}

void main(void)
{
    uchar i,j;
    P0 = 0xFF;
    while(1)
    {
        j=0x01;
        for (i=0;i<8;i++)
        {
            P0=~j;
            delayms(250);
            j = _crol_(j, 1); // left move in loop
        }
        j = 0x80;
        for (i=0;i<8;i++)
        {
            P0 = ~j;
            delayms(250);
            j = _cror_(j, 1); // right move in loop
        }
    }
}


Page Source