📄 newyear.c
字号:
#include <reg51.h> //51芯片管脚定义头文件
#include <intrins.h> //内部包含延时函数 _nop_();
#define uchar unsigned char
#define uint unsigned int
#define BLKN 2 //列锁存器数
sbit SDATA_595=P0^0; //串行数据输入
sbit SCLK_595 =P2^7; //移位时钟脉冲
sbit RCK_595 =P0^2; //输出锁存器控制脉冲
sbit G_74138 =P2^4; //显示允许控制信号端口
uchar data dispram[32]; //显示缓存
uchar temp;
void delay(uint );
uchar code Bmp[][32]=
{
{0xff,0x7f,0xff,0x7f,0xfe,0xbf,0xfe,0xbf,0xfd,0xdf,0x83,0xe0,0xdf,0xfd,0xef,0xfb,0xf7,0xf7,0xfb,0xef,0xf7,0x77,0xf6,0xb7,0xe9,0xcb,0xe7,0xf3,0xdf,0xfd,0xff,0xff},
{0xff,0x7f,0xff,0x7f,0xfe,0x3f,0xfe,0x3f,0xfc,0x1f,0x80,0x0,0xc0,0x1,0xe0,0x3,0xf0,0x7,0xf8,0xf,0xf0,0x7,0xf0,0x87,0xe1,0xc3,0xe7,0xf3,0xdf,0xfd,0xff,0xff},
{0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF},
{0x7F,0xFF,0xBF,0xFF,0xDF,0xFF,0xEF,0xFF,0xF7,0xFF,0xFB,0xFF,
0xFD,0xFF,0xFE,0xFF,0xFF,0x7F,0xFF,0xBF,0xFF,0xDF,0xFF,0xEF,
0xFF,0xF7,0xFF,0xFB,0xFF,0xFD,0xFF,0xFE},
{0xef,0xf7,0xf5,0xe3,0x80,0x9f,0xff,0xbf,0xdd,0xbf,0xeb,0xbb,0x0,0x1,0xf5,0xb7,0x80,0xb7,0xf7,0xb7,0xf5,0xb7,0xd6,0x77,0xb7,0x77,0x76,0xf7,0xd7,0xf7,0xef,0xf7},//新
{0xf7,0xff,0xf7,0xf7,0xe0,0x3,0xee,0xff,0xde,0xff,0xbe,0xef,0xe0,0x7,0xee,0xff,0xee,0xff,0xee,0xfb,0x0,0x1,0xfe,0xff,0xfe,0xff,0xfe,0xff,0xfe,0xff,0xfe,0xff},//年
{0xef,0x7f,0xef,0x7f,0xef,0x7f,0xef,0x77,0xa4,0x3,0xab,0x77,0xaf,0x77,0x6f,0x77,0xef,0x77,0xe0,0x1,0xef,0x7f,0xee,0xbf,0xee,0xdf,0xed,0xef,0xeb,0xf1,0xe7,0xfb},//快
{0xff,0xdf,0xff,0xf,0xe0,0xff,0xef,0xff,0xee,0xff,0xee,0xff,0xde,0xfb,0x80,0x1,0xfe,0xff,0xfe,0xff,0xf6,0xdf,0xf6,0xef,0xee,0xf7,0xde,0xf3,0xba,0xfb,0xfd,0xff}//乐
};
/*******************************************************
* *
* 延时函数 *
* *
*******************************************************/
void delay(uint dt)
{
uchar bt;
for(;dt;dt--)
for(bt=0;bt<255;bt++);
}
/**********************************************************/
void delay0(uint x) //x*0.14MS
{
uchar b;
while(x--)
{
for (b = 0; b<13; b++) {}
}
}
/*******************************************************
* *
*将显示数据送入74HC595内部移位寄存器 *
* *
*******************************************************/
void WR_595(void)
{
uchar x;
for (x=0;x<8;x++)
{
temp=temp<<1;
SDATA_595=CY;
SCLK_595=1; //上升沿发生移位
_nop_();
_nop_();
SCLK_595=0;
}
}
/*******************************************************
* *
* 主函数 *
* *
*******************************************************/
void main(void)
{
uchar i,k,h,s;
TMOD = 0x01; //定时器T0工作方式1
TH0 = 0xFC; //1ms定时常数
TL0 = 0x66;
G_74138 = 1; //关闭显示
RCK_595=0;
P2 =0xF0; //行号端口清零
IE = 0x82; //允许定时器T0中断
TR0 = 1; //启动定时器T0
while(1)
{
for(k=0;k<3;k++)
{
for(i=0;i<32;i++)
{
dispram[i]= Bmp[k][i];
}
delay(1500);
}
TR0=0;
s=0;
h=0;
while(s!=32)
{
G_74138=1; //关闭显示
s++;
temp = Bmp[3][s];
WR_595();
s--;
temp = Bmp[3][s];
WR_595();
s++;
s++;
RCK_595 = 1; //上升沿将数据送到输出锁存器
_nop_();
RCK_595 = 0; //锁存显示数据
G_74138=0; //打开显示
for(i=0;i<16;i++)
{
while(h!=0x10)
{
P2=h;
h++;
delay0(10);
}
h=0;
}
}
temp = 0x00;
WR_595();
WR_595();
RCK_595 = 1; //上升沿将数据送到输出锁存器
_nop_();
RCK_595 = 0; //锁存显示数据
h=0;
while(h!=0x10)
{
P2=h;
h++;
delay0(2000);
}
TR0=1;
for(k=4;k<8;k++) //显示"伟纳电子"
{
for(i=0;i<32;i++)
{
dispram[i]= Bmp[k][i];
}
delay(1500);
}
} //end of while(1)
} //end of main()
/*******************************************************
* *
* 中断服务函数 *
* *
*******************************************************/
void leddisplay(void) interrupt 1 using 1
{
uchar i,j=BLKN;
TH0 = 0xFC; //1ms定时常数
TL0 = 0x66;
i=P2; //读取当前显示的行号
i=++i & 0x0f; //行号加1,屏蔽高4位
do{
j--;
temp = dispram[i*BLKN+j];
WR_595();
}while(j);
G_74138=1; //关闭显示
P2 &= 0xf0; //行号端口清零
RCK_595 = 1; //上升沿将数据送到输出锁存器
P2 |=i; //写入行号
RCK_595 = 0; //锁存显示数据
G_74138=0; //打开显示
}
/******************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -