显示状态:点阵上每隔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秒到了
}
}