📄 time.c
字号:
#include<at89x52.h>
#define uchar unsigned char
#define SCL P1_0
#define SDA P1_1
#define E1 P1_3
#define E2 P1_2
#define RS P3_5
#define RW P3_6
#define E P3_7
#define LED_BUS P2
idata uchar rom_sed[]={0x00,0x56,0x23,0x03,0x21,0x03,0x07,0x00};//秒;分;小时;星期;日;月;年;输出波
idata uchar rom_rec[9];
bit flag,flag1;
/******字库*******/
code uchar zhifu[][16]={
{0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00},//0
{0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00},//1
{0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00},//2
{0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00},//3
{0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00},//4
{0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00},//5
{0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00},//6
{0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00},//7
{0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00},//8
{0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00}};//9
code uchar xian[]=
{0x06,0xC6,0xFE,0xFE,0xC6,0xC6,0x00,0xFE,0x06,0xF6,0xF6,0x06,0xFE,0xFE,0x00,0x00,
0x18,0x18,0x1F,0x0F,0x0C,0x6C,0x30,0x1B,0x0C,0x07,0x3F,0x7C,0x63,0x73,0x70,0x00};/*"现",0*/
code uchar zai[]=
{0x00,0x0C,0x8C,0xCC,0xEC,0x3C,0x9F,0x8F,0x8C,0xEC,0xEC,0x8C,0x8C,0x8C,0x0C,0x00,
0x02,0x03,0x01,0x7F,0x7F,0x30,0x31,0x31,0x31,0x3F,0x3F,0x31,0x31,0x31,0x30,0x00};/*"在",1*/
code uchar shi1[]=
{0xFE,0xFE,0xC6,0xC6,0xFE,0xFE,0x00,0x98,0x98,0x18,0x18,0xFF,0xFF,0x18,0x18,0x00,
0x1F,0x1F,0x0C,0x0C,0x1F,0x1F,0x00,0x00,0x03,0x03,0x60,0x7F,0x3F,0x00,0x00,0x00};/*"时",2*/
code uchar jian[]=
{0x00,0xF8,0xFB,0x07,0xF6,0xF0,0x36,0x36,0x36,0xF6,0xF6,0x06,0xFE,0xFE,0x00,0x00,
0x00,0x7F,0x7F,0x00,0x0F,0x0F,0x0D,0x0D,0x0D,0x0F,0x2F,0x60,0x7F,0x3F,0x00,0x00};/*"间",3*/
code uchar maohao[]=
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x33,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};/*":",4*/
code uchar xin[]=
{0x00,0x00,0x00,0x20,0xF0,0xD0,0xD0,0xD0,0xD0,0xD0,0xD0,0xF0,0x00,0x00,0x00,0x00,
0x00,0x10,0x14,0x1A,0x17,0x16,0x16,0x1F,0x1F,0x16,0x16,0x16,0x10,0x30,0x30,0x10};/*"星",0*/
code uchar qi[]=
{0x00,0x00,0x20,0x20,0xF0,0xA0,0xA0,0xF0,0x20,0x00,0xE0,0xA0,0xA0,0xE0,0x00,0x00,
0x04,0x04,0x24,0x14,0x0B,0x03,0x05,0x1B,0x12,0x1C,0x07,0x02,0x02,0x3F,0x00,0x00};/*"期",1*/
code uchar shi2[]=
{0x00,0xF8,0x08,0x08,0x08,0xF8,0x10,0x90,0x10,0x10,0x10,0x10,0xFC,0x10,0x10,0x00,
0x00,0x7F,0x82,0x82,0x82,0x7F,0x00,0x00,0x41,0x86,0x88,0x80,0xFF,0x00,0x00,0x00};/*"时",0*/
code uchar fen[]=
{0x00,0x80,0x80,0xC0,0xB0,0x8C,0x80,0x80,0x80,0x82,0x8C,0x90,0xA0,0x40,0x80,0x00,
0x00,0x80,0x80,0x40,0x20,0x18,0x07,0x00,0x80,0x80,0x80,0x80,0x7F,0x00,0x00,0x01};/*"分",1*/
code uchar miao[]=
{0x00,0x44,0x44,0xFC,0x44,0x44,0x40,0xF0,0x00,0x00,0xFE,0x00,0x00,0x70,0x80,0x00,
0x10,0x0C,0x03,0xFF,0x03,0x04,0x83,0x80,0x80,0x80,0x5F,0x20,0x10,0x0E,0x01,0x00};/*"秒",2*/
code uchar nian[]=
{0x40,0x20,0x10,0x0C,0xE3,0x22,0x22,0x22,0xFE,0x22,0x22,0x22,0x22,0x02,0x00,0x00,
0x04,0x04,0x04,0x04,0x07,0x04,0x04,0x04,0xFF,0x04,0x04,0x04,0x04,0x04,0x04,0x00};/*"年",0*/
code uchar yue[]=
{0x00,0x00,0x00,0x00,0x00,0xFF,0x11,0x11,0x11,0x11,0x11,0xFF,0x00,0x00,0x00,0x00,
0x00,0x40,0x20,0x10,0x0C,0x03,0x01,0x01,0x01,0x21,0x41,0x3F,0x00,0x00,0x00,0x00};/*"月",1*/
code uchar ri[]=
{0x00,0x00,0x00,0xFE,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0xFE,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x3F,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x3F,0x00,0x00,0x00,0x00};/*"日",2*/
/********************************************************************************************************************/
void delay(void){
uchar i;
for(i=0;i<6;i++) ;
}
void delay2(){
uchar k;
for(k=30000;k>0;k--);
}
/************************************************************************************************************/
/************如果忙则等待****************/
void wait_E1( void )
{
E1=0;E2=1;
LED_BUS=0xff;
RW=1;
RS=0; //d0~D7为状态输出
E=1;
while(LED_BUS&0x80);
E=0;
}
void wait_E2( void )
{
E1=1;E2=0;
LED_BUS=0xff;
RW=1;
RS=0;
E=1;
while(LED_BUS&0x80);
E=0;
}
/************写指令代码数据 *********/
void write_code_E1( uchar cod )
{
wait_E1();
LED_BUS=cod;
RW=0;
RS=0;
E1=0;E2=1;
E=1;
E=0;
}
void write_code_E2( uchar cod )
{
wait_E2();
LED_BUS=cod;
RW=0;
RS=0;
E1=1;E2=0;
E=1;
E=0;
}
/*************向DDRAM中写数据 *********/
void write_data_E1( uchar dat )
{
wait_E1();
LED_BUS=dat;
RW=0;
RS=1;
E1=0;E2=1;
E=1;
E=0;
}
void write_data_E2( uchar dat )
{
wait_E2();
LED_BUS=dat;
RW=0;
RS=1;
E1=1;E2=0;
E=1;
E=0;
}
/*******************清屏*******************/
void clear_lcd()
{
uchar page,i;
for(page=0xb8;page<0xc0;page++) //x=0(10111000) y=(10111111);
{
write_code_E1(page); //设置页地址x=page
write_code_E1(0x40); //设置列地址y=0
for(i=0;i<64;i++)
{
write_data_E1(0x00); //写0 每写一次y自动加1
}
}
for(page=0xb8;page<0xc0;page++) //x=0(10111000) y=(10111111);
{
write_code_E2(page); //设置页地址x=page
write_code_E2(0x40); //设置列地址y=0
for(i=0;i<64;i++)
{
write_data_E2(0x00); //写0 每写一次y自动加1
}
}
}
/****************初始化液晶****************/
void init_lcd()
{
wait_E1();
write_code_E1(0x3e); // 关显示1
wait_E2();
write_code_E2(0x3e); // 关显示2
wait_E1();
write_code_E1(0x3f); // 开显示1
wait_E2();
write_code_E2(0x3f); // 开显示2
wait_E1();
write_code_E1(0xc0); //(11 000000) 设置显示起始行z=0
wait_E2();
write_code_E2(0xc0); //(11 000000) 设置显示起始行z=0
clear_lcd();
}
void write_char_N_16( uchar *p_char,uchar page,uchar column,uchar N )
{
uchar i;
if( column<= 0x38)
{
write_code_E1(page|0xb8); //设置页地址
write_code_E1(column|0x40); //设置列地址
for(i=0;i<N;i++)
write_data_E1(p_char[i]);
write_code_E1(page+1|0xb8); //设置页地址
write_code_E1(column|0x40); //设置列地址
for(i=N;i<(2*N);i++)
write_data_E1(p_char[i]);
}
else
{
write_code_E2(page|0xb8); //设置页地址
write_code_E2(column|0x40); //设置列地址
for(i=0;i<N;i++)
{write_data_E2(p_char[i]);/*P0_0_flash();*/}
write_code_E2(page+1|0xb8); //设置页地址
write_code_E2(column|0x40); //设置列地址
for(i=N;i<(2*N);i++)
{write_data_E2(p_char[i]);/*P0_7_flash();*/}
}
}
/**********************************************************************************************************************/
void start(void){ //IIC总线起始条件
SDA=1;
SCL=1;
delay();
SDA=0;
delay();
SCL=0;
}
void stop(void){ //IIC总线停止条件
SDA=0;
SCL=1;
delay();
SDA=1;
delay();
SCL=0;
}
bit send_byte(uchar da){ //传送字节数据
data uchar i;
for(i=0;i<8;i++){
SDA=(bit)(da&0x80);
da=da<<1;
SCL=1;
delay();
SCL=0;
}
;;
SDA=1; //准备接收ACK位
;
;
SCL=1; //开始接收ACK位
;
;
flag=0;
if(SDA==0) flag=0; //ACK(SDA线上是与关系决定电平)
else flag=1; //No ACK(SDA==1)
SCL=0; //与上面的SCL=1构成正常的时钟同期
delay();//加了这一句之后,成功了
return(flag);
}
uchar recieve_byte(void){
data uchar i;
uchar da=0;
SDA=1;
for(i=0;i<8;i++){
da*=2;
;
SCL=0;
delay();
SCL=1;;;
if(SDA==1) da++;
;;
}
SCL=0;
if(flag1==0){
SDA=0;
;;
SCL=1;
delay();
SCL=0;
delay();
}
else {
SDA=1;
;;
SCL=1;
delay();
SCL=0;
delay();//加了这一句之后,成功了
flag1=0;
}
return(da);
}
void send(){
data uchar i;
for(i=0;i<255;i++) delay();
start();
if(~send_byte(0xd0)){
if(~send_byte(0x00)){
for(i=0;i<8;i++){
if(~send_byte(rom_sed[i]));
else ;
}
stop();
}
else;
}
else;
}
void recieve(){
data uchar i;
start();
if(~send_byte(0xd0)){
if(~send_byte(0x00)){
delay2();
start();
if(~send_byte(0xd1)){
for(i=1;i<9;i++){
if(i==8) flag1=1;
else flag1=0;
rom_rec[i]=recieve_byte();
switch(i){
case 1: rom_rec[i]=rom_rec[i]&0x7f; break;
case 2: rom_rec[i]=rom_rec[i]&0x7f; break;
case 3: rom_rec[i]=rom_rec[i]&0x3f; break;
case 4: rom_rec[i]=rom_rec[i]&0x07; break;
case 5: rom_rec[i]=rom_rec[i]&0x3f; break;
case 6: rom_rec[i]=rom_rec[i]&0x1f; break;
case 7: rom_rec[i]=rom_rec[i]&0xff; break;
default : break;
}
delay();//加了这一句之后,成功了
delay();//加了这一句之后,成功了
}
}
stop();
}
}
}
void main(){
init_lcd();
send();
while(1){
clear_lcd();
write_char_N_16(xian,0x00,00,16);//现
write_char_N_16(zai,0x00,24,16);//在
write_char_N_16(shi1,0x00,48,16);// 时
write_char_N_16(jian,0x00,72,16);//间
write_char_N_16(maohao,0x00,96,16);//:
write_char_N_16(shi2,0x04,16,16);//时
write_char_N_16(fen,0x04,48,16);//分
write_char_N_16(miao,0x04,80,16);//秒
write_char_N_16(xin,0x06,20,16);//星
write_char_N_16(qi,0x06,48,16);//期
write_char_N_16(nian,0x02,16,16);//年
write_char_N_16(yue,0x02,48,16);//月
write_char_N_16(ri,0x02,80,16);//日
recieve();
//秒
write_char_N_16(zhifu[((rom_rec[1]&0x70)>>4)],0x04,64,8);
write_char_N_16(zhifu[(rom_rec[1]&0x0f)],0x04,72,8);
//分
write_char_N_16(zhifu[((rom_rec[2]&0x70)>>4)],0x04,32,8);
write_char_N_16(zhifu[(rom_rec[2]&0x0f)],0x04,40,8);
//时
write_char_N_16(zhifu[((rom_rec[3]&0x70)>>4)],0x04,00,8);
write_char_N_16(zhifu[(rom_rec[3]&0x0f)],0x04,8,8);
//日
write_char_N_16(zhifu[((rom_rec[5]&0x30)>>4)],0x02,64,8);
write_char_N_16(zhifu[(rom_rec[5]&0x0f)],0x02,72,8);
//月
write_char_N_16(zhifu[((rom_rec[6]&0x10)>>4)],0x02,32,8);
write_char_N_16(zhifu[(rom_rec[6]&0x0f)],0x02,40,8);
//年
write_char_N_16(zhifu[((rom_rec[7]&0xf0)>>4)],0x02,00,8);
write_char_N_16(zhifu[(rom_rec[7]&0x0f)],0x02,8,8);
//星期
write_char_N_16(zhifu[(rom_rec[4]&0x07)],0x06,76,8);
delay2();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -