一、系统方案
上电初始化完成系统初始化,液晶滚动显示北京、莫斯科、东京、伦敦、巴黎、纽约等六个城市的标准时间,显示的内容包括地区名及相应地区的年、月、日、星期、时、分、秒。
使用K1按键控制滚动显示或稳定显示某个地区的时间。
使用K3、K4、K5按键可进行时间和日期的设定。在进行年、月、日、时、分、秒的调整时,被选中的调节对象能闪烁显示。
二、硬件设计
原理图如下:
三、单片机软件设计
1、首先是系统初始化
unsigned char set_mode=0;
short time_offset=0;
unsigned char last_display_flag;
unsigned char i =0,set_obj=0;
CLI(); //disable all interrupts
PORTA = 0xFF;
DDRA = 0x00;//输入
PORTB = 0xFF;//低电平
DDRB = 0x00;//输入
PORTC = 0xFF;//低电平
DDRC = 0xFF;//输出
PORTE = 0xFF;
DDRE = 0xff;//输出
PORTD = 0xff;
DDRD = 0xFF;//输出
PORTD = 0xff;
PORTF = 0xFF;
DDRF = 0xFF;//输出
PORTG = 0xFF;
DDRG = 0xFF;//输出
LCD12864_Init();XDIV = 0x00; //xtal divider
XMCRA = 0x00; //external memory
MCUCR = 0x00;
TCCR0 = (1<<CS02)|(1<<CS01);//T/C0工作于定时方式,系统时钟256分频
TCNT0 = 0x00; //计数初值
TIMSK = 0x11; //timer interrupt sources
SEI(); //使能全局中断 //initial_ds1302();
2、液晶显示程序
void SendCommand(unsigned char command)
{
CheckState();
LGM12864_CLR_RS;
LGM12864_CLR_RW;
LCDa_DO = command;
delay_nus(2);
LGM12864_SET_EN;
delay_nus(2);
LGM12864_CLR_EN;
}
unsigned char LCD12864_RecData()
{
unsigned char temp;
CheckState();
LGM12864_SET_RS;
LGM12864_SET_RW;
LGM12864_SET_EN;
temp=LCDa_DI;
LGM12864_CLR_EN;
return (temp);
}
3、按键程序
if((PINA&0x01) == 0x00)
{
delay_nms(50);
while((PINA&0x01) == 0x00);
work_mode++;
if(work_mode>2)
{
work_mode = 0;
}
}
else if((PINA&0x02) == 0x00)
{
delay_nms(50);
while((PINA&0x02) == 0x00);
display_flag++;
if(display_flag>7)
{
display_flag=0;
}
}
else if((PINA&0x04) == 0x00)
{
delay_nms(50);
while((PINA&0x04) == 0x00);
work_mode=2;
display_flag=1;
set_obj++;
if(set_obj>8)
{
//work_mode=0;
set_obj=0;
initial_ds1302();
}
}
else if((PINA&0x08) == 0x00)
{
delay_nms(50);
while((PINA&0x08) == 0x00);
set_mode++;
if(set_mode>=2)
{
set_mode=0;
}
}
4、核心算法程序
if((display_flag != last_display_flag)||(work_mode0x02)||(work_mode0x01))
{
last_display_flag = display_flag;
if(display_flag==0)
{
LCD12864_Show_16_16(3,0,Title_Font_Arrary[0]);
LCD12864_Show_16_16(4,0,Title_Font_Arrary[1]);
LCD12864_Show_16_16(5,0,Title_Font_Arrary[2]);
}
else
{
LCD12864_Show_16_16(3,0,Title_Font_Arrary[3+(display_flag-1)*2]);
LCD12864_Show_16_16(4,0,Title_Font_Arrary[3+(display_flag-1)*2+1]);
LCD12864_Show_16_16(5,0,Title_Font_Arrary[13]);
}
ds1302_dec_data.second = H_D(ds1302_data.second);
ds1302_dec_data.minute = H_D(ds1302_data.minute);
ds1302_dec_data.hour = H_D(ds1302_data.hour)+time_offset;
ds1302_dec_data.week = H_D(ds1302_data.week);
ds1302_dec_data.day = H_D(ds1302_data.day);
ds1302_dec_data.month = H_D(ds1302_data.month);
ds1302_dec_data.year = H_D(ds1302_data.year);
LCD12864_Show_8_16(0,1,Number_Font_Arrary[2]);LCD12864_Show_8_16(1,1,Number_Font_Arrary[0]);for(i=0;i<3;i++){LCD12864_Show_8_16(2+i*3,1,Number_Font_Arrary[(*(&ds1302_dec_data.year+i))/10%10]);LCD12864_Show_8_16(3+i*3,1,Number_Font_Arrary[(*(&ds1302_dec_data.year+i))%10]);if(i!=2)LCD12864_Show_8_16(4+i*3,1,TIME_Font_Arrary[0]);}for(i=0;i<3;i++){LCD12864_Show_8_16(0+i*3,2,Number_Font_Arrary[(*(&ds1302_dec_data.hour+i))/10%10]);LCD12864_Show_8_16(1+i*3,2,Number_Font_Arrary[(*(&ds1302_dec_data.hour+i))%10]);if(i!=2)LCD12864_Show_8_16(2+i*3,2,TIME_Font_Arrary[0]);}LCD12864_Show_8_16(0,3,Number_Font_Arrary[ds1302_dec_data.week/10%10]);LCD12864_Show_8_16(1,3,Number_Font_Arrary[ds1302_dec_data.week%10]);if(set_obj>0){delay_nms(200);if(set_obj<=0x03){LCD12864_Show_Anti_White_8_16(2+(set_obj-1)*3,1,Number_Font_Arrary[(*((unsigned char*)&ds1302_dec_data.year+set_obj-1))/10%10]); LCD12864_Show_Anti_White_8_16(3+(set_obj-1)*3,1,Number_Font_Arrary[(*((unsigned char*)&ds1302_dec_data.year+set_obj-1))%10]); }else if(set_obj<=0x04) {LCD12864_Show_Anti_White_8_16(0,3,Number_Font_Arrary[ds1302_dec_data.week/10%10]); LCD12864_Show_Anti_White_8_16(1,3,Number_Font_Arrary[ds1302_dec_data.week%10]); }else if(set_obj<=0x07){LCD12864_Show_Anti_White_8_16(0+(set_obj-5)*3,2,Number_Font_Arrary[(*((unsigned char*)&ds1302_dec_data.year+set_obj-1))/10%10]); LCD12864_Show_Anti_White_8_16(1+(set_obj-5)*3,2,Number_Font_Arrary[(*((unsigned char*)&ds1302_dec_data.year+set_obj-1))%10]); }}}//}
四、proteus仿真设计
Proteus软件是一款应用比较广泛的工具,它可以在没有硬件平台的基础上通过自身的软件仿真出硬件平台的运行情况,这样就可以通过软件仿真来验证我们设计的方案有没有问题,如果有问题,可以重新选择器件,连接器件,直到达到我们设定的目的,避免我们搭建实物的时候,如果当初选择的方案有问题,我们器件都已经焊接好了,再去卸载下去,再去焊接新的方案的器件,测试,这样会浪费人力和物力,也给开发者带来一定困惑,Proteus仿真软件就很好的解决这个问题,我们在设计之初,就使用该软件进行模拟仿真,测试,选择满足我们设计的最优方案。最后根据测试没问题的仿真图纸,焊接实物,调试,最终完成本设计的作品。