|
#include <reg51.h>
#include <intrins.h> // ????????
typedef unsigned char u8; //u8 = unsigned char
typedef unsigned int u16;
sbit SRCLK = P3^6; //移位寄存器
sbit RCLK = P3^5; //存储寄存器
sbit SER = P3^4; //串行数据输入
static unsigned int tmr = 0,index = 0;
u8 ledduan[] = {
0x00,0x70,0x89,0x89,0x89,0x89,0x7e,0x00, // 8*8点阵显示数字9
0x00,0x36,0x49,0x49,0x49,0x36,0x00,0x00, // 8
0x00,0x40,0x43,0x44,0x48,0x50,0x60,0x00}; // 7
u8 ledwei[] = {0x7f, 0xbf, 0xdf, 0xef, 0xf7, 0xfb, 0xfd, 0xfe}; //选择列数导通
void Time0()
{
TMOD = 0X01;
TH0 = 0XFC; //1ms定时
TL0 = 0X18;
TR0 = 1;
EA = 1;
ET0 = 1;
}
void Hc595sentbyte(u8 dat)
{
u8 a;
SRCLK = 0;
RCLK = 0;
for(a = 0; a < 8; a++)
{
SER = (dat >> 7); //1100 1001; ser =0000 0001
dat<<=1; //dat= 1001 0010
SRCLK = 1;
// _nop_();
SRCLK = 0;
}
RCLK = 1;
RCLK = 0;
}
void time0int() interrupt 1
{
u8 i = 0;
TH0 = 0XFC;
TL0 = 0X18;
tmr++;
for(i = 0; i < 8; i++) //循环显示8列
{
Hc595sentbyte(ledduan[index+i]);
P0 = ledwei[i];
Hc595sentbyte(0x00);
P0 = 0xff;
}
}
void run()
{
while(1)
{
if(tmr >= 1000) //1s延时
{
tmr = 0;
index = index + 8; //作为切换显示
if(index > 16)
index = 0;
}
}
}
void main()
{
Time0();
run();
}
|
|