
-
UID:1217843
-
- 注册时间2012-08-02
- 最后登录2025-04-18
- 在线时间12407小时
-
-
访问TA的空间加好友用道具
|
朋友生日,所以就做了个 简单的ds1302的时钟,使用1602显示,大字符+普通字符切换显示+背光灯开关+红外控制+闹钟 红外所用到的键值:45 46 43 40 09 15 47 16 0c 18 5e 08 1c 5a 42 52 4a 各个功能大家自己研究吧 大字符显示模式: 普通字符显示模式: 闹钟设置模式: 闹钟: 开机: 生日快乐~ 卸掉1602: 电路图: 以下为代码: ds1302.h: - #define uchar unsigned char
- #define uint unsigned int
- sbit io=P0^2; //ds1302的数据线
- sbit sck=P0^1; //ds1302的时钟线
- sbit rst=P0^3; //ds1302的复位线
- char time[8]={13,1,1,12,0,0,6,0}; //时间10进制 年月日时分秒 闹钟时 闹钟分
- uchar alarm_time_disp[4];
- uchar time16[6]; //时间16进制
- uchar disp[12]; //时间各位分解以便显示
- uchar write_add[6]={0x8c,0x88,0x86,0x84,0x82,0x80};//写地址
- uchar read_add[6]={0x8d,0x89,0x87,0x85,0x83,0x81}; //读地址
- void time_pros();
- void write_ds1302_byte(uchar dat); //写一个字节
- void write_ds1302(uchar add,uchar dat); //写
- uchar read_ds1302(uchar add); //读
- void read(); //将时间从1302中读出于time[]
- void delay(int x)
- { int y;
- for(x;x>0;x--)
- for(y=125;y>0;y--);
- }
- void delayms(int x)
- { int y;
- for(x;x>0;x--)
- for(y=13;y>0;y--);
- }
- void write_ds1302_byte(uchar dat)
- { uchar i;
- for(i=0;i<8;i++)
- {
- sck=0;
- io=dat&0x01;
- dat=dat>>1;
- sck=1;
- }
- }
- void write_ds1302(uchar add,uchar dat) //写
- {
- rst=0; _nop_();
- sck=0; _nop_();
- rst=1; _nop_();
- write_ds1302_byte(add);
- write_ds1302_byte(dat);
- rst=0; _nop_();
- io=1;
- sck=1;
- }
- uchar read_ds1302(uchar add)
- { uchar i,value;
- rst=0; _nop_();
- sck=0; _nop_();
- rst=1; _nop_();
- write_ds1302_byte(add);
- for(i=0;i<8;i++)
- {
- value=value>>1;
- sck=0;
- if(io)
- value=value|0x80;
- sck=1;
- }
- rst=0;
- sck=1;
- io=1;
- return value;
- }
- void read()
- {
- uchar i;
- for(i=0;i<6;i++)
- {
- time16[i]=read_ds1302(read_add[i]);
- }
- }
- void time_pros()
- { int i;
- disp[0]=time16[0]/16; //年十位
- disp[1]=time16[0]%16; //年个位
- disp[2]=time16[1]/16; //月十位
- disp[3]=time16[1]%16; //月各位
- disp[4]=time16[2]/16; //日十位
- disp[5]=time16[2]%16; //日个位
-
- disp[6]=time16[3]/16; //时十位
- disp[7]=time16[3]%16; //时个位
- disp[8]=time16[4]/16; //分十位
- disp[9]=time16[4]%16; //分个位
- disp[10]=time16[5]/16; //秒十位
- disp[11]=time16[5]%16; //秒个位
-
- alarm_time_disp[0]=time[6]/10; //闹钟时十位
- alarm_time_disp[1]=time[6]%10; //闹钟时个位
- alarm_time_disp[2]=time[7]/10; //闹钟时十位
- alarm_time_disp[3]=time[7]%10; //闹钟分个位
-
- for(i=0;i<6;i++) time[i]=disp[2*i]*10+disp[2*i+1];
- }
- void set() //设置ds1302
- { uchar i;
- for(i=0;i<6;i++)
- time16[i]=time[i]%10+time[i]/10*16;
-
- write_ds1302(0x8e,0x00); //去除写保护
- for(i=0;i<6;i++)
- {
- write_ds1302(write_add[i],time16[i]);
- }
- write_ds1302(0x8e,0x80); //加写保护
- }
1602.h: - sbit rs=P2^1; //1602RS控制位
- sbit rw=P2^2; //1602RW控制位
- sbit e =P2^3; //1602E 控制位
- uchar code LCD[10]="0123456789";
- //液晶自定义字符编码表
- uchar code ziku0[]={
- 0x1f,0x1f,0x00,0x00,0x00,0x00,0x00,0x00 // 100
- };
- uchar code ziku1[]={
- 0x1f,0x1f,0x00,0x1f,0x1f,0x00,0x1f,0x1f // 111
- };
- uchar code ziku2[]={
- 0x1f,0x1f,0x00,0x00,0x00,0x00,0x1f,0x1f //101
- };
- uchar code ziku3[]={
- 0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0x1f //001
- };
- uchar code ziku4[]={
- 0x00,0x00,0x07,0x07,0x07,0x07,0x00,0x00
- };
- uchar code ziku5[]={
- 0x00,0x04,0x0e,0x0e,0x0e,0x1f,0x00,0x00
- };
- uchar code ziku6[]={
- 0x04,0x0a,0x11,0x10,0x08,0x04,0x02,0x01
- };
- uchar code ziku7[]={
- 0x04,0x0A,0x11,0x01,0x02,0x04,0x08,0x10
- };
- void write_com(uchar com); //函数功能:写指令
- void write_data(uchar dat); //函数功能:写数据 0x80+0x40
- void init1602(void); //函数功能:初始化1602
- /**************************************************************************/
- /************ 各延时程序 **************/
- /**************************************************************************/
- void delay_50us(uint t)
- {
- uchar j;
- for(;t>0;t--)
- for(j=1;j>0;j--);
- }
- uchar Dat(uchar com)
- { uchar a,b=0,i,temp;
- a=com;
- for(i=0;i<8;i++)
- {
- temp=a&0x01;
- a=a>>1;
- b=b+temp;
- if(i != 7)
- b=b<<1;
- }
- return b;
- }
- /************************************************************************/
- /************** 1602显示部分 *****************/
- /************************************************************************/
- void write_com(uchar com) //函数功能:写指令
- { uchar a;
- a=Dat(com);
- e=0;
- rs=0;
- rw=0;
- P3=a;
- delay_50us(10);
- e=1;
- delay_50us(20);
- e=0;
- }
- void write_data(uchar dat) //函数功能:写数据
- { uchar a;
- a=Dat(dat);
- e=0;
- rs=1;
- rw=0;
- P3=a;
- delay_50us(10);
- e=1;
- delay_50us(20);
- e=0;
- }
- void init1602(void) //函数功能:初始化1602
- {
- delay_50us(300);
- write_com(0x38);
- delay_50us(100);
- write_com(0x38);
- delay_50us(100);
- write_com(0x38);
- write_com(0x38);
- write_com(0x01);
- write_com(0x01);
- write_com(0x06);
- write_com(0x0c);
- }
- /***********************向液晶写入自定义字符****************************/
- void lcd_wrzf()
- {
- uchar i;
- write_com(0x40);//字符00
- for(i=0;i<8;i++)
- {
- write_data(ziku0[i]);
- }
- write_com(0x48);//字符01
- for(i=0;i<8;i++)
- {
- write_data(ziku1[i]);
- }
- write_com(0x50);//字符02
- for(i=0;i<8;i++)
- {
- write_data(ziku2[i]);
- }
- write_com(0x58);//字符03
- for(i=0;i<8;i++)
- {
- write_data(ziku3[i]);
- }
- write_com(0x60);//字符04
- for(i=0;i<8;i++)
- {
- write_data(ziku4[i]);
- }
- write_com(0x68);//字符05
- for(i=0;i<8;i++)
- {
- write_data(ziku5[i]);
- }
- write_com(0x70);//字符06
- for(i=0;i<8;i++)
- {
- write_data(ziku6[i]);
- }
- write_com(0x78);//字符07
- for(i=0;i<8;i++)
- {
- write_data(ziku7[i]);
- }
- }
- /*---------------------大字符显示部分---------------------*/
- void display_big(uchar add,char date) //大字显示模式 i是显示的数据,j是显示的地址
- {
- switch(date)
- {
- case '0':
- write_com(0x80+add);
- write_data(0x01);
- write_com(0x81+add);
- write_data(0x00);
- write_com(0x82+add);
- write_data(0x01);
- write_com(0x80+0x40+add);
- write_data(0x01);
- write_com(0x80+0x41+add);
- write_data(0x03);
- write_com(0x80+0x42+add);
- write_data(0x01);
- break;
- case '1':
- write_com(0x80+add);
- write_data(' ');
- write_com(0x81+add);
- write_data(0x01);
- write_com(0x82+add);
- write_data(' ');
- write_com(0x80+0x40+add);
- write_data(' ');
- write_com(0x80+0x41+add);
- write_data(0x01);
- write_com(0x80+0x42+add);
- write_data(' ');
- break;
- case '2':
- write_com(0x80+add);
- write_data(0x00);
- write_com(0x81+add);
- write_data(0x00);
- write_com(0x82+add);
- write_data(0x01);
- write_com(0x80+0x40+add);
- write_data(0x01);
- write_com(0x80+0x41+add);
- write_data(0x02);
- write_com(0x80+0x42+add);
- write_data(0x02);
- break;
- case '3':
- write_com(0x80+add);
- write_data(0x00);
- write_com(0x81+add);
- write_data(0x00);
- write_com(0x82+add);
- write_data(0x01);
- write_com(0x80+0x40+add);
- write_data(0x02);
- write_com(0x80+0x41+add);
- write_data(0x02);
- write_com(0x80+0x42+add);
- write_data(0x01);
- break;
- case '4':
- write_com(0x80+add);
- write_data(0x01);
- write_com(0x81+add);
- write_data(0x03);
- write_com(0x82+add);
- write_data(0x01);
- write_com(0x80+0x40+add);
- write_data(0x00);
- write_com(0x80+0x41+add);
- write_data(0x00);
- write_com(0x80+0x42+add);
- write_data(0x01);
- break;
- case '5':
- write_com(0x80+add);
- write_data(0x01);
- write_com(0x81+add);
- write_data(0x00);
- write_com(0x82+add);
- write_data(0x00);
- write_com(0x80+0x40+add);
- write_data(0x02);
- write_com(0x80+0x41+add);
- write_data(0x02);
- write_com(0x80+0x42+add);
- write_data(0x01);
- break;
- case '6':
- write_com(0x80+add);
- write_data(0x01);
- write_com(0x81+add);
- write_data(0x00);
- write_com(0x82+add);
- write_data(0x00);
- write_com(0x80+0x40+add);
- write_data(0x01);
- write_com(0x80+0x41+add);
- write_data(0x02);
- write_com(0x80+0x42+add);
- write_data(0x01);
- break;
- case '7':
- write_com(0x80+add);
- write_data(0x00);
- write_com(0x81+add);
- write_data(0x00);
- write_com(0x82+add);
- write_data(0x01);
- write_com(0x80+0x40+add);
- write_data(' ');
- write_com(0x80+0x41+add);
- write_data(' ');
- write_com(0x80+0x42+add);
- write_data(0x01);
- break;
- case '8':
- write_com(0x80+add);
- write_data(0x01);
- write_com(0x81+add);
- write_data(0x00);
- write_com(0x82+add);
- write_data(0x01);
- write_com(0x80+0x40+add);
- write_data(0x01);
- write_com(0x80+0x41+add);
- write_data(0x02);
- write_com(0x80+0x42+add);
- write_data(0x01);
- break;
- case '9':
- write_com(0x80+add);
- write_data(0x01);
- write_com(0x81+add);
- write_data(0x00);
- write_com(0x82+add);
- write_data(0x01);
- write_com(0x80+0x40+add);
- write_data(0x02);
- write_com(0x80+0x41+add);
- write_data(0x02);
- write_com(0x80+0x42+add);
- write_data(0x01);
- break;
- }
- }
display.h: - sbit beep=P1^0;
- uchar lcd_time[8];
- uchar lcd_data[8];
- uchar lcd_alarm[5];
- uchar lcd_alarm_switch[5]="ONOFF";
- uchar table0[12]="DS1302 INIT!";
- uchar table1[16]="Time:";
- uchar table2[16]="Date:20";
- uchar table3[16]="Set Alarm:";
- uchar table4[]="Alarm switch:";
- uchar table5[]="!!ALARM!!";
- uchar table6[16]="Happy Birthday! ";
- #define wait 8
- uchar table7[16]="made by ZYC";
- uchar other1[10]={0,1};
- uchar other2[2]={0x04,0x20};
- uchar other3[2]={0x05,0x20};
- uchar alarm_switch=1;
- void display1_1() //显示Time: 及Data:20
- { int i;
- write_com(0x80);
- for(i=0;i<5;i++)
- {
- write_data(table1[i]);
- delay_50us(wait);
- }
- write_com(0x80+0x40);
- for(i=0;i<7;i++)
- {
- write_data(table2[i]);
- delay_50us(wait);
- }
- write_com(0x80+15);
- write_data(other3[(alarm_switch==1)]);
- delay_50us(wait);
- }
- void display2_1() //设置闹钟 显示Set Alarm:
- { int i;
- write_com(0x80);
- for(i=0;i<10;i++)
- {
- write_data(table3[i]);
- delay_50us(wait);
- }
- }
- void alarm_switch_Disp() //设置闹钟界面显示闹钟开关状态
- {
-
- write_com(0x80+0x40+12);
- if(alarm_switch!=1)
- {write_data(lcd_alarm_switch[0]);
- delay_50us(wait);
- write_data(lcd_alarm_switch[1]);
- delay_50us(wait);
- write_data(0x20);
- delay_50us(wait);}
- else
- {write_data(lcd_alarm_switch[2]);
- delay_50us(wait);
- write_data(lcd_alarm_switch[3]);
- delay_50us(wait);
- write_data(lcd_alarm_switch[4]);
- delay_50us(wait);}
-
-
-
- }
- void display1()
- { int i;display1_1();
- write_com(0x80+5);
- for(i=0;i<8;i++)
- {
- write_data(lcd_time[i]);
- delay_50us(wait);
- }
- write_com(0x80+0x40+7);
- for(i=0;i<8;i++)
- {
- write_data(lcd_data[i]);
- delay_50us(wait);
- }
- }
- void display2()
- { if(lcd_time[0]=='1') {write_com(0x80);write_data(0x20);write_com(0x80+0x40);write_data(0x20);}
- if(lcd_time[1]=='1') {write_com(0x86);write_data(0x20);write_com(0x86+0x40);write_data(0x20);}
- if(lcd_time[3]=='1') {write_com(0x89);write_data(0x20);write_com(0x89+0x40);write_data(0x20);}
- if(lcd_time[4]=='1') {write_com(0x8f);write_data(0x20);write_com(0x8f+0x40);write_data(0x20);}
- display_big(other1[lcd_time[0]=='1'],lcd_time[0]);
- display_big(4-other1[lcd_time[1]=='1'],lcd_time[1]);
- display_big(9+other1[lcd_time[3]=='1'],lcd_time[3]);
- display_big(13-other1[lcd_time[4]=='1'],lcd_time[4]);
- write_com(0x87);
- write_data(other2[lcd_time[7]%2]);
- write_com(0x87+0x40);
- write_data(other2[lcd_time[7]%2]);
- }
- void set_hour() //调时
- { int i,t;
- display1_1();
- for(t=0;t<5;t++)
- {
- write_com(0x80+5);
- for(i=0;i<8;i++)
- {if(i==0|i==1) write_data(0x20);
- else write_data(lcd_time[i]);
- delay_50us(wait);
- }
- write_com(0x80+0x40+7);
- for(i=0;i<8;i++)
- {
- write_data(lcd_data[i]);
- delay_50us(wait);
- }
- }
- for(t=0;t<8;t++)
- {
- write_com(0x80+5);
- for(i=0;i<8;i++)
- { write_data(lcd_time[i]);
- delay_50us(wait);
- }
- write_com(0x80+0x40+7);
- for(i=0;i<8;i++)
- {
- write_data(lcd_data[i]);
- delay_50us(wait);
- }
- }
- }
- void set_min() //调分
- { int i,t;
- display1_1();
- for(t=0;t<5;t++)
- {
- write_com(0x80+5);
- for(i=0;i<8;i++)
- {if(i==4|i==3) write_data(0x20);
- else write_data(lcd_time[i]);
- delay_50us(wait);
- }
- write_com(0x80+0x40+7);
- for(i=0;i<8;i++)
- {
- write_data(lcd_data[i]);
- delay_50us(wait);
- }
- }
- for(t=0;t<8;t++)
- {
- write_com(0x80+5);
- for(i=0;i<8;i++)
- { write_data(lcd_time[i]);
- delay_50us(wait);
- }
- write_com(0x80+0x40+7);
- for(i=0;i<8;i++)
- {
- write_data(lcd_data[i]);
- delay_50us(wait);
- }
- }
- }
- void set_second() //调秒
- { int i,t;
- display1_1();
- for(t=0;t<5;t++)
- {
- write_com(0x80+5);
- for(i=0;i<8;i++)
- {if(i==6|i==7) write_data(0x20);
- else write_data(lcd_time[i]);
- delay_50us(wait);
- }
- write_com(0x80+0x40+7);
- for(i=0;i<8;i++)
- {
- write_data(lcd_data[i]);
- delay_50us(wait);
- }
- }
- for(t=0;t<8;t++)
- {
- write_com(0x80+5);
- for(i=0;i<8;i++)
- { write_data(lcd_time[i]);
- delay_50us(wait);
- }
- write_com(0x80+0x40+7);
- for(i=0;i<8;i++)
- {
- write_data(lcd_data[i]);
- delay_50us(wait);
- }
- }
- }
- void set_year() //调年
- { int i,t;
- display1_1();
- for(t=0;t<5;t++)
- {
- write_com(0x80+5);
- for(i=0;i<8;i++)
- { write_data(lcd_time[i]);
- delay_50us(wait);
- }
- write_com(0x80+0x40+7);
- for(i=0;i<8;i++)
- {if(i==0|i==1) write_data(0x20);
- else
- write_data(lcd_data[i]);
- delay_50us(wait);
- }
- }
- for(t=0;t<8;t++)
- {
- write_com(0x80+5);
- for(i=0;i<8;i++)
- { write_data(lcd_time[i]);
- delay_50us(wait);
- }
- write_com(0x80+0x40+7);
- for(i=0;i<8;i++)
- {
- write_data(lcd_data[i]);
- delay_50us(wait);
- }
- }
- }
- void set_month() //调月
- { int i,t;
- display1_1();
- for(t=0;t<5;t++)
- {
- write_com(0x80+5);
- for(i=0;i<8;i++)
- { write_data(lcd_time[i]);
- delay_50us(wait);
- }
- write_com(0x80+0x40+7);
- for(i=0;i<8;i++)
- {if(i==3|i==4) write_data(0x20);
- else
- write_data(lcd_data[i]);
- delay_50us(wait);
- }
- }
- for(t=0;t<8;t++)
- {
- write_com(0x80+5);
- for(i=0;i<8;i++)
- { write_data(lcd_time[i]);
- delay_50us(wait);
- }
- write_com(0x80+0x40+7);
- for(i=0;i<8;i++)
- {
- write_data(lcd_data[i]);
- delay_50us(wait);
- }
- }
- }
- void set_day() //调日
- { int i,t;
- display1_1();
- for(t=0;t<5;t++)
- {
- write_com(0x80+5);
- for(i=0;i<8;i++)
- { write_data(lcd_time[i]);
- delay_50us(wait);
- }
- write_com(0x80+0x40+7);
- for(i=0;i<8;i++)
- {if(i==6|i==7) write_data(0x20);
- else
- write_data(lcd_data[i]);
- delay_50us(wait);
- }
- }
- for(t=0;t<8;t++)
- {
- write_com(0x80+5);
- for(i=0;i<8;i++)
- { write_data(lcd_time[i]);
- delay_50us(wait);
- }
- write_com(0x80+0x40+7);
- for(i=0;i<8;i++)
- {
- write_data(lcd_data[i]);
- delay_50us(wait);
- }
- }
- }
- void set_alarm_hour() //调闹钟时
- { int i,t;
- alarm_switch_Disp();
- display2_1();
- for(t=0;t<28;t++)
- {
- write_com(0x80+0x40+4);
- for(i=0;i<5;i++)
- {if(i==0|i==1) write_data(0x20);
- else write_data(lcd_alarm[i]);
- delay_50us(wait);
- }
- }
- for(t=0;t<35;t++)
- {
- write_com(0x80+0x40+4);
- for(i=0;i<5;i++)
- {
- write_data(lcd_alarm[i]);
- delay_50us(wait);
- }
- }
- }
- void set_alarm_min() //调闹钟分
- { int i,t;
- alarm_switch_Disp();
- display2_1();
- for(t=0;t<28;t++)
- {
- write_com(0x80+0x40+4);
- for(i=0;i<5;i++)
- {if(i==3|i==4) write_data(0x20);
- else write_data(lcd_alarm[i]);
- delay_50us(wait);
- }
- }
- for(t=0;t<30;t++)
- {
- write_com(0x80+0x40+4);
- for(i=0;i<5;i++)
- {
- write_data(lcd_alarm[i]);
- delay_50us(wait);
- }
- }
- }
- void alarm_disp() //闹钟开启显示 !!ALARM!!及闹钟时间
- { int i;
- write_com(0x80+3);
- for(i=0;i<9;i++)
- {
- write_data(table5[i]);
- delay_50us(wait);
- }
- write_com(0x80+0x40+5);
- for(i=0;i<5;i++)
- {
- write_data(lcd_alarm[i]);
- delay_50us(wait);
- }
-
- }
- void INIT_ds1302()
- { int i;
- write_com(0x80+2);
- for(i=0;i<12;i++)
- {write_data(table0[i]);
- delayms(20);}
- delay(1000);
- }
- void begin()
- { int i;
- write_com(0x80);
- for(i=0;i<16;i++)
- {write_data(table6[i]);
- delay(100);}
- write_com(0x80+0X40+5);
- for(i=0;i<11;i++)
- {write_data(table7[i]);
- delay(100);}
-
- }
- void Beep_alarm() //闹钟开启蜂鸣器启动
- {
- beep=0;
- delay(200);
- beep=1;
- delay(200);
- beep=0;
- delay(200);
- beep=1;
- delay(500);
- }
- void Beep_key() //按键按下
- {
- beep=0;
- delay(100);
- beep=1;
-
- }
第一次发帖。程序感觉也写得很乱,应该有跟好的写法,高手就勿拍了  ` keil工程及hex文件: [ 此帖被a2633063在2013-01-15 18:02重新编辑 ]
|