单片机实例---定时器控制点阵显示0~9

显示状态:点阵上每隔1s显示一个数字,显示到9又重头显示不断循环

#include
#include

typedef unsigned int u16;
typedef unsigned char u8;

u8 flag=0;   //时间标志位

#define lie_io P0    //定义P0端口

sbit RCLKK = P3^5;    
sbit SRCLK = P3^6;
sbit SER = P3^4;   //串行输入

unsigned char code lie[8] = {0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};

unsigned char code hang[10][8] = {
                    
    {0x00,0x00,0x3e,0x41,0x41,0x41,0x3e,0x00}, //0

    {0x00,0x00,0x00,0x00,0x21,0x7f,0x01,0x00}, //1

    {0x00,0x00,0x27,0x45,0x45,0x45,0x39,0x00}, //2

{0x00,0x00,0x22,0x49,0x49,0x49,0x36,0x00}, //3

{0x00,0x00,0x0c,0x14,0x24,0x7f,0x04,0x00}, //4

{0x00,0x00,0x72,0x51,0x51,0x51,0x4e,0x00}, //5

{0x00,0x00,0x3e,0x49,0x49,0x49,0x26,0x00}, //6

{0x00,0x00,0x40,0x40,0x40,0x4f,0x70,0x00}, //7

{0x00,0x00,0x36,0x49,0x49,0x49,0x36,0x00}, //8

{0x00,0x00,0x32,0x49,0x49,0x49,0x3e,0x00}, //9

};



void HC595_sendbyte(u8 dat) //数据发送到HC595
{
    u8 i;
    RCLKK = 0;
    SRCLK = 0;
    for(i=0;i<8;i++){
        SER = dat>>7;
        dat<<=1;

        SRCLK = 1;
        _nop_();
        _nop_();
        SRCLK = 0;
    }
    RCLKK = 1;
    _nop_();
    _nop_();
    RCLKK = 0;
}

void timer0_init() //1ms
{
    
    TMOD |= 0x01;
    TH0 = 0x0fc;
    TL0 = 0x18;
    EA = 1;
    ET0 = 1;
    TR0 = 1;
}
void delay(u16 i)
{
    while(i--);
}
void main()
{
    u8 j,i;
    timer0_init();
    while(1){
        if(flag==1)     //flag=1,以为着到1s了
        {
            for(j=0;j<8;j++)     //到1s开始显示数字
            {
                HC595_sendbyte(0x00);   //消隐
                lie_io = lie[j];
                HC595_sendbyte(hang[i][j]);
                delay(200);
            }
            flag=0;    //flag再变为0,为下一次表示1s到做准备
            i++;    //i是用来表示显示哪个数字的
        }

        if(i==10)  //当数组都显示完了,i=0重头不断循环显示
        {
            i= 0;   
        }
    }


}

void timer0() interrupt 1
{
    static u16 i;
    TH0 = 0x0fc;
    TL0 = 0x18;
    i++;
    if(i==1000){  //1000个毫秒等于1s 
        i=0;
        flag = 1; //1秒到了
    }   
}


你可能感兴趣的:(单片机实例---定时器控制点阵显示0~9)