0
怎么修改这个程序中实现时钟和日期交换显示,,日期是单排8x8点阵显示 时钟是两排点阵显示的
附上图片 点阵分开那个图是对的 第2张的点阵排法是错的只是怕大家看不清其他元件才附上的
#include
#include
#define uchar unsigned char
#define uint unsigned int
unsigned second,minute,hour,day,month,week,year;
char cashe[4];
/*****************************************************************************************************/
/****it ds=P0^0; //数据打入口
***it E1=P2^4; //74HC154-E1 为0开列输出 显示允许控制信号端口
***it stcp=P0^2; //74HC595-ST_CP 上升沿--移位寄存器的数据进入数据存储寄存器 输出锁存器的时钟信号端口
***it shcp=P0^1; //移位数据脉冲位数据脉冲位数据脉冲位数据脉冲
***it MR=P0^3; //74HC595-MR 为0将移位寄存器的数据清0
/*****************************************************************************************************/
//74HC595管脚定义
***it ds=P1^0;
***it E1=P2^4;
***it stcp=P1^1;
***it shcp=P1^2;
***it MR=P1^3;
//按键管脚定义
***it KEY_1 = P1^1;
***it KEY_2 = P1^2;
***it KEY_3 = P1^0;
//DS1302管脚定义
***it T_CLK = P3^4; //ds1302_clk(时钟线)
***it T_IO = P3^5; //ds1302_dat(数据线)
***it T_RST = P3^6; //ds1302_Rst(复位线)
***it ACC0 = ACC^0;
***it ACC1 = ACC^1;
***it ACC2 = ACC^2;
***it ACC3 = ACC^3;
***it ACC4 = ACC^4;
***it ACC5 = ACC^5;
***it ACC6 = ACC^6;
***it ACC7 = ACC^7;
unsigned char idata Dis[4];
unsigned char code font[]={
0x00,0x00,0x00,0x18,0x24,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x24,0x18,0x00,0x00,/*"0",0*/
0x00,0x00,0x00,0x08,0x0e,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x3e,0x00,0x00,/*"1",1*/
0x00,0x00,0x00,0x3c,0x42,0x42,0x42,0x20,0x20,0x10,0x08,0x04,0x42,0x7e,0x00,0x00,/*"2",2*/
0x00,0x00,0x00,0x3c,0x42,0x42,0x20,0x18,0x20,0x40,0x40,0x42,0x22,0x1c,0x00,0x00,/*"3",3*/
0x00,0x00,0x00,0x20,0x30,0x28,0x24,0x22,0x22,0x22,0x7e,0x20,0x20,0x78,0x00,0x00,/*"4",4*/
0x00,0x00,0x00,0x7e,0x02,0x02,0x02,0x1a,0x26,0x40,0x40,0x42,0x22,0x1c,0x00,0x00,/*"5",5*/
0x00,0x00,0x00,0x38,0x24,0x02,0x02,0x1a,0x26,0x42,0x42,0x42,0x24,0x18,0x00,0x00,/*"6",6*/
0x00,0x00,0x00,0x7e,0x22,0x22,0x10,0x10,0x08,0x08,0x08,0x08,0x08,0x08,0x00,0x00,/*"7",7*/
0x00,0x00,0x00,0x3C,0x42,0x42,0x42,0x24,0x18,0x24,0x42,0x42,0x42,0x3C,0x00,0x00,/*"8",8*/
0x00,0x00,0x00,0x18,0x24,0x42,0x42,0x42,0x64,0x58,0x40,0x40,0x24,0x1c,0x00,0x00,/*"9",9*/
0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x30,0xC0,0x30,0x00,0x00,0x00,0x00,0x00,0x00,/*":",10*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",11*/
};
/*******************************************************************************************
* 函数名: Delay
* 功能描述:
* 入口参数: 无
* 出口参数: 无
*******************************************************************************************/
/*void Delay(unsigned int i)
{
unsigned int j;
for(j=0;j
}
*/
/*******************************************************************************************
* 函数名: disp_1000ms
* 功能描述:
* 入口参数: 无
* 出口参数: 无
*******************************************************************************************/
void disp_1000ms(void) //精确延时1ms
{
/* unsigned char a,b,c; //1ms
for(c=2;c>0;c--)
for(b=142;b>0;b--)
for(a=2;a>0;a--); */
/* unsigned char a,b; //2ms
for(b=4;b>0;b--)
for(a=248;a>0;a--); */
unsigned char a,b; //0.5m
for(b=2;b>0;b--) //11
for(a=2;a>0;a--);
}
//时钟数据(7字节BCD码)格式为: 秒 分 时 日 月星期 年-----------------------------
unsigned char idata time[7];
/*******************************************************************************************
* 函数名: BCD2HEX
* 功能描述: BCD码转换成十进制
* 入口参数: 无
* 出口参数: 无
*******************************************************************************************/
unsigned char BCD2HEX(unsigned char BCDChar)
{
unsigned char temp;
temp=(BCDChar/16*10+BCDChar%16);
return temp;
}
/*******************************************************************************************
* 函数名: HEX2BCD
* 功能描述: 十进制转换成BCD码
* 入口参数: 无
* 出口参数: 无
*******************************************************************************************/
unsigned char HEX2BCD(unsigned char HEXChar)
{
unsigned char temp;
temp=(HEXChar/10*16+HEXChar%10);
return temp;
}
/*******************************************************************************************
* 函数名: WriteByteDS1302
* 功能描述:
* 入口参数: 无
* 出口参数: 无
*******************************************************************************************/
/*void WriteByteDS1302(unsigned char Data)
{
unsigned char i;
ACC = Data&0xFE;
T_RST = 0;
T_CLK = 0;
T_RST = 1;
for(i=8; i>0; i--)
{
T_IO = ACC0;
T_CLK = 0;
T_CLK = 1;
ACC = ACC >> 1;
}
}
/*******************************************************************************************
* 函数名: ReadByteDS1302
* 功能描述:
* 入口参数: 无
* 出口参数: 无
*******************************************************************************************/
/*unsigned char ReadByteDS1302(void)
{
unsigned char i;
T_CLK = 0;
for(i=8; i>0; i--)
{
ACC = ACC >>1;
ACC7 = T_IO;
T_CLK = 1;
T_CLK = 0;
}
return(ACC);
}
/*******************************************************************************************
* 函数名: WriteDS1302
* 功能描述:
* 入口参数: 无
* 出口参数: 无
*******************************************************************************************/
void WriteDS1302(unsigned char Addr,unsigned char Data)
{
unsigned char i;
T_RST = 0;
T_CLK = 0;
T_RST = 1;
// Addr=Addr|0x01;
for(i=0;i<8;i++)
{ T_CLK = 0;
if(Addr&0x01) T_IO=1;
else T_IO=0;
T_CLK = 1;
Addr=Addr>>1;
}
for(i=0;i<8;i++)
{ T_CLK = 0;
if(Data&0x01) T_IO=1;
else T_IO=0;
T_CLK = 1;
Data=Data>>1;
}
T_CLK = 1;
T_RST = 0;
// WriteByteDS1302(Addr);
// WriteByteDS1302(Data);
// T_CLK = 1;
// T_RST = 0;
}
/*******************************************************************************************
* 函数名: ReadDS1302
* 功能描述:
* 入口参数: 无
* 出口参数: 无
*******************************************************************************************/
unsigned char ReadDS1302(unsigned char Addr)
{
unsigned char Data,i;
T_RST = 0;
T_CLK = 0;
T_RST = 1;
Addr=Addr|0x01;
for(i=0;i<8;i++)
{
T_CLK = 0;
if(Addr&0x01) T_IO=1;
else T_IO=0;
T_CLK = 1;
Addr=Addr>>1;
}
for(i=0;i<8;i++)
{
T_CLK = 0;
Data=Data>>1;
if(T_IO==1) Data|=0x80;
else Data&=0x7f;
T_CLK = 1;
T_CLK = 0;
//T_IO=0;
}
T_CLK = 1;
T_RST = 0;
return(Data);
}
/*******************************************************************************************
* 函数名: Set
* 功能描述:
* 入口参数: 无
* 出口参数: 无
*******************************************************************************************/
/*void Set(unsigned char sel,unsigned char selby)
{
unsigned char address,item;
unsigned char max,min;
if(sel==0) {address=0x80; max=59;min=0;} //秒
if(sel==1) {address=0x82; max=59;min=0;} //分钟
if(sel==2) {address=0x84; max=23;min=0;} //小时
if(sel==3) {address=0x86; max=31;min=1;} //日
if(sel==4) {address=0x88; max=12;min=1;} //月
if(sel==5) {address=0x8a; max=7; min=1;} //星期
if(sel==6) {address=0x8c; max=99;min=0;} //年
if(sel==7) {address=0xc0; max=59;min=0;} //闹钟分钟
if(sel==8) {address=0xc2; max=23;min=0;} //闹钟小时
item=ReadDS1302(address+1)/16*10+ReadDS1302(address+1)%16;
if (selby==0) item++; else item--;
if(item>max) item=min;
if(item
WriteDS1302(0x8e,0x00);
WriteDS1302(address,item/10*16+item%10);
WriteDS1302(0x90,0xa5);
WriteDS1302(0x8e,0x80);
}
*/
/*******************************************************************************************
* 函数名: SetTime
* 功能描述:
* 入口参数: 无
* 出口参数: 无
*******************************************************************************************/
/*void SetTime(unsigned char *pClock)
{
unsigned char h;
unsigned char Addr=0x80;
WriteDS1302(0x8e,0x00);
for(h=7; h>0; h--)
{
WriteDS1302(Addr,*pClock);
pClock++;
Addr+=2;
}
WriteDS1302(0x90,0xa5);
WriteDS1302(0x8e,0x80);
}*/
/*******************************************************************************************
* 函数名: ReadTime
* 功能描述:
* 入口参数: 无
* 出口参数: 无
*******************************************************************************************/
void ReadTime()
{
second = BCD2HEX(Time[0]=ReadDS1302(0x81));
minute = BCD2HEX(Time[1]=ReadDS1302(0x83));
hour = BCD2HEX(Time[2]=ReadDS1302(0x85));
day = BCD2HEX(Time[3]=ReadDS1302(0x87));
month = BCD2HEX(Time[4]=ReadDS1302(0x89));
year = BCD2HEX(Time[5]=ReadDS1302(0x8d));
week = BCD2HEX(Time[6]=ReadDS1302(0x8b));
}
/*******************************************************************************************
* 函数名: WriteTime
* 功能描述:
* 入口参数: 无
* 出口参数: 无
*******************************************************************************************/
void WriteTime()
{
WriteDS1302(0x8e,0x00); //控制写入WP=0
WriteDS1302(0x90,0xa5);
WriteDS1302(0x80,0x00); //秒
WriteDS1302(0x82,0x45); //分
WriteDS1302(0x84,0x14); //时24时制
WriteDS1302(0x86,0x01); //日
WriteDS1302(0x88,0x12); //月
WriteDS1302(0x8a,0x07); //星期
WriteDS1302(0x8c,0x13); //年 */
WriteDS1302(0x8e,0x80);
//WriteDS1302(0x8e,0x00);
// WriteDS1302(0x80,(0x80)); // WriteDS1302(0x80,HEX2BCD(second));
// WriteDS1302(0x82,HEX2BCD(0x23));//WriteDS1302(0x82,HEX2BCD(minute));
// WriteDS1302(0x84,HEX2BCD(0x12));//WriteDS1302(0x84,HEX2BCD(hour));
// WriteDS1302(0x80,HEX2BCD(0x00));
//WriteDS1302(0x86,HEX2BCD(day));
//WriteDS1302(0x88,HEX2BCD(month));
// WriteDS1302(0x8A,HEX2BCD(week));
// WriteDS1302(0x8C,HEX2BCD(year));
// WriteDS1302(0x90,0xa5);
WriteDS1302(0x8e,0x80);
}
/*******************************************************************************************
* 函数名: shcp2
* 功能描述: 595数据传送
* 入口参数: 无
* 出口参数: 无
*******************************************************************************************/
void shcp2(uchar temp1)
{
uchar i;
for (i=0;i<8;i++)
{
shcp=0;
temp1=temp1<<1;
ds=CY;
shcp=1;
shcp=0;
}
}
/*******************************************************************************************
* 函数名: send
* 功能描述:
* 入口参数: 无
* 出口参数: 无
*******************************************************************************************/
void send(void)
{
char i,j,a;
char temp;
i=0;
//P2=0x00;
for(i=0;i<16;i++)
{
for(j=0;j<4;j++)
{
cashe[3-j]=font[Dis[j]*16+i];
if((i==5||i==6||i==10||i==11)&&(j==1||j==2))
{
if((second%10)%2)
{
cashe[3-j]=font[Dis[j]*16+i];
}
else
{
cashe[3-j]=font[Dis[j]*16+i];
if(j==1)
{
cashe[3-j]|=0x80;//显示第一行第二列和第二行第二列的8*8点阵显示的数字加上闪烁的点
}
if(j==2)
{
cashe[3-j]|=0x01;//显示第一行第三列和第二行第三列将码表中要显示的数字加上闪烁的点
}
}
}
for(a=0;a<4;a++)
{
temp =cashe[a];
shcp2(temp);
}
}
E1=1;
P2=i;
E1=0;
stcp=1;
disp_1000ms();
stcp=0;
}
}
/*******************************************************************************************
* 函数名: init
* 功能描述:
* 入口参数: 无
* 出口参数: 无
*******************************************************************************************/
void init(void)
{
//EA=1;
// SCON=0;//串口方式0
ReadTime();//读取时间
disp_1000ms();
Dis[0]=hour/10; //取小时的十位数
Dis[1]=hour%10; //取小时的个位数
Dis[2]=minute/10;//取分钟的十位数
Dis[3]=minute%10;//取分钟的个位数
}
void main(void)
{
uint rows=sizeof(font); //计算字模总数
disp_1000ms();
WriteTime(); //时间初始化...
disp_1000ms();
init(); //读取时间
while(1)
{
init(); //读取时间
disp_1000ms();
if(hour/10==0) //如果小时的十位数是零,则不显示
{
Dis[0]=11;
if((hour/10==0)&(hour%10==0))//如果小时十位数为零,且个位数也为零,则为零零
Dis[0]=0;
}
else
Dis[0]=hour/10;
Dis[1]=hour%10;
/* if(minute/10==0) //如果分钟的十位数是零,则不显示
Dis[2]=0;
else
Dis[2]=minute/10;*/
send();
disp_1000ms();
}
}
|
|