📄 16-32.c
字号:
#define uchar unsigned char
#define uint unsigned int
#include <reg52.h>
#include<1302.h>
#include<zifu.h>
#define BLKN 2 //列锁存器数
sbit G=P1^7; //P1.7为显示允许控制信号端
sbit CLK=P1^6; //P1.6为输出锁存器时钟信号端
sbit SCLR=P1^5; //移位寄存器的清0端
void delay(unsigned int);
void showtime(uchar);
void showxq(uchar);
unsigned char data dispram[32];
unsigned char data dispram0[32];
unsigned char code time[][16];
unsigned char code Timename[][32];
unsigned char code xinqi[][32];
uchar inittime[7]={0x00,0x24,0x15,0x25,0x12,0x04,0x07}; //初始化后设置
void main()
{
register unsigned char i,j,k,l;
uchar ucAddr = 0x81;
SCON=0x00; //串口工作模式0:移位寄存器方式
TMOD=0x01; //定时器T0工作在试1:16位方式
TR0=1; //启动定时器
P1=0x3f; //P1口初值允许接收,锁存,显示
IE=0x82; //允许定时器T0中断
Set1302(inittime); //初始化
W1302(0x8e,0x00); /* 控制命令,WP=0,写操作?*/
W1302(0x90,0xa5); //打开充电二级管 一个二级管串联一个2K电阻
du1302(); //读取 秒 分 时 日 月 星期 年
while(1)
{
delay(2000); //延时2S
/*for(i=0;i<32;i++) //显示效果:卷帘出
{
dispram[i]=Bmp[1][i];
if(i%2)delay(100);
}
delay(100);*/
for(i=0;i<9;i++) //显示效果:左移显示:你好我是......
{
for(j=0;j<2;j++)
for(k=1;k<9;k++)
{
for(l=0;l<16;l++)
{
dispram[l*BLKN]=dispram[l*BLKN]
<<1|dispram[l*BLKN+1]>>7;
dispram[l*BLKN+1]=dispram[l*BLKN+1]
<<1|dispram0[l*BLKN]>>7;
dispram0[l*BLKN]=dispram0[l*BLKN]
<<1|dispram0[l*BLKN+1]>>7;
dispram0[l*BLKN+1]=dispram0[l*BLKN+1]
<<1|Bmp[i][l*BLKN+j]>>(8-k);
}
delay(100);
}
}
delay(100);
du1302(); // 读时间
for(i=0;i<11;i++)
{
if(i==3)
{
showtime(Year);
}
if(i==4)
{
showtime(Month);
}
if(i==5)
{
showtime(Day);
}
if(i==6)
{
showtime(Hour);
}
if(i==7)
{
showtime(Cent);
}
if(i==8)
{
showtime(Sec);
}
if(i==10)
{
for(j=0;j<2;j++)
for(k=1;k<9;k++)
{
for(l=0;l<16;l++)
{
dispram[l*BLKN]=dispram[l*BLKN]
<<1|dispram[l*BLKN+1]>>7;
dispram[l*BLKN+1]=dispram[l*BLKN+1]
<<1|dispram0[l*BLKN]>>7;
dispram0[l*BLKN]=dispram0[l*BLKN]
<<1|dispram0[l*BLKN+1]>>7;
dispram0[l*BLKN+1]=dispram0[l*BLKN+1]
<<1|xinqi[Week%16][l*BLKN+j]>>(8-k);
}
delay(100);
}
}
for(j=0;j<2;j++)
for(k=1;k<9;k++)
{
for(l=0;l<16;l++)
{
dispram[l*BLKN]=dispram[l*BLKN]
<<1|dispram[l*BLKN+1]>>7;
dispram[l*BLKN+1]=dispram[l*BLKN+1]
<<1|dispram0[l*BLKN]>>7;
dispram0[l*BLKN]=dispram0[l*BLKN]
<<1|dispram0[l*BLKN+1]>>7;
dispram0[l*BLKN+1]=dispram0[l*BLKN+1]
<<1|Timename[i][l*BLKN+j]>>(8-k);
}
delay(100);
}
}
for(i=0;i<32;i++) //显示效果:卷帘入
{
dispram[i]=0;
dispram0[i]=0;
if(i%2)delay(100);
}
}
}
/*-------------延时------------*/
void delay(unsigned int dt)
{
register unsigned char bt;
for(;dt;dt--)
for(bt=0;bt<225;bt++);
}
/*-------显示屏扫描(定时器T0中断)函数-------------*/
void leddisplay(void) interrupt 1 using 1
{
register unsigned char i,j=BLKN;
TH0=0xf8; //设定显示屏刷新率每秒62.5帧
TL0=0x30;
i=P1; //读出当前显示的行号
i=++i&0x0f; //行号加1屏蔽高四位
do
{
j--;
SBUF=~dispram0[i*BLKN+j]; //送显示数据
//SBUF=dispram0[i*BLKN+j];
while (!TI);TI=0;
}
while(j); //完成一行数据传输
j=BLKN;
do
{j--;
SBUF=~dispram[i*BLKN+j];
//SBUF=dispram[i*BLKN+j];
while(!TI);TI=0;
}
while(j);
G=1; //消隐(关闭显示)
P1&=0xf0; //行号端清0
CLK=1; //显示数据输出到锁存寄存器
P1 |=i; //写入行号
CLK=0; //锁存器显示数据
G=0; //打开显示
}
void showtime(uchar shijian)
{
uchar l,k;
for(k=1;k<9;k++)
{
for(l=0;l<16;l++)
{
dispram[l*BLKN]=dispram[l*BLKN]
<<1|dispram[l*BLKN+1]>>7;
dispram[l*BLKN+1]=dispram[l*BLKN+1]
<<1|dispram0[l*BLKN]>>7;
dispram0[l*BLKN]=dispram0[l*BLKN]
<<1|dispram0[l*BLKN+1]>>7;
dispram0[l*BLKN+1]=dispram0[l*BLKN+1]
<<1|time[shijian/16][l]>>(8-k);
}
delay(100);
}
for(k=1;k<9;k++)
{
for(l=0;l<16;l++)
{
dispram[l*BLKN]=dispram[l*BLKN]
<<1|dispram[l*BLKN+1]>>7;
dispram[l*BLKN+1]=dispram[l*BLKN+1]
<<1|dispram0[l*BLKN]>>7;
dispram0[l*BLKN]=dispram0[l*BLKN]
<<1|dispram0[l*BLKN+1]>>7;
dispram0[l*BLKN+1]=dispram0[l*BLKN+1]
<<1|time[shijian%16][l]>>(8-k);
}
delay(100);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -