完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
电子发烧友论坛扫一扫,分享给好友
想把ds1302的万年历显示在12864上 求大神帮帮忙问题出哪里了 显示日的十位变为冒号 显示分钟的十位变为冒号 最重要的是不走时了 #include #include #define uchar unsigned char #define uint unsigned int #define MAIN_Fosc 11059200UL //宏定义主时钟HZ typedef unsigned char INT8U; typedef unsigned int INT16U; ***it TSCLK = P1^0;//时钟线 接到P10上用杜邦线 ***it tiO = P1^1;//数据线,接到P11上 ***it TRST = P1^2;//使能端,接到P12上 ***it CS=P0^0; //片选信号 ***it SID=P0^1; //数据信号 ***it SCLK=P0^2; //时钟信号 ***it RST=P0^3; //复位信号 //***it CH = P2^4; //并行、串行选择信号 uchar table[]={"0123456789"}; uchar table1[]={"2016-:"}; void Delay_Ms(INT16U ms) { INT16U i; do{ i = MAIN_Fosc / 96000; while(--i); //96T per loop }while(--ms); } //写DS1302数据 void Write_DS1302_DAT(uchar cmd, uchar dat) { uchar i; TRST = 0; //拉低使能端 TSCLK = 0;//拉低数据总线 TRST = 1; //拉高使能端,产生上升沿开始写数据 for(i = 0; i < 8; i++)//每次写1位,写8次 { TSCLK = 0; //拉低时钟总线 TIO = cmd & 0x01; //写1位数据,从最低位开始写 TSCLK = 1; //拉高时钟总线,产生上升沿数据被DS1302读走 cmd >>=1; //右移一位 } for(i = 0; i < 8; i++)//每次写1位,写8次 { TSCLK = 0; //拉低时钟总线 TIO = dat & 0x01; //写1位数据,从最低位开始写 TSCLK = 1; //拉高时钟总线,产生上升沿数据被DS1302读走 dat >>= 1; //右移一位 } } //读DS1302数据 uchar Read_DS1302_DAT(uchar cmd) { uchar i, dat; TRST = 0; //拉低使能端 TSCLK = 0; //拉低数据总线 TRST = 1; //拉高使能端,产生上升沿开始写数据 for(i = 0; i < 8; i++)//每次写1位,写8次 { TSCLK = 0; //拉低时钟总线 TIO = cmd & 0x01;//写1位数据,从最低位开始写 TSCLK = 1; //拉高时钟总线,产生上升沿数据被DS1302读走 cmd >>=1; //右移一位 } for(i = 0; i < 8; i++)//每次读1位,读8次 { TSCLK = 0; //拉低时钟总线,产生下降沿,DS1302把数据放到TIO上 dat >>= 1; //右移一位 if(TIO) dat |= 0x80;//读取数据,从最低位开始 TSCLK = 1; //拉高时钟总线,以备下一次产生下降沿 } return dat; //返回读出数据 } //数据转BCD码 uchar Dat_Chg_BCD(uchar dat) { uchar dat1, dat2; dat1 = dat / 10; dat2 = dat % 10; dat2 = dat2 + dat1 * 16; return dat2; } //BCD码转换为数据 uchar BCD_Chg_Dat(uchar dat) { uchar dat1, dat2; dat1 = dat / 16; dat2 = dat % 16; dat2 = dat2 + dat1 * 10; return dat2; } void delay(unsigned int t) { unsigned int i,j; for(i=0; i } // 按照液晶的串口通信协议,发送数据 void sendbyte(unsigned char zdata) { unsigned int i; for(i=0; i<8; i++) { if((zdata << i) & 0x80) { SID = 1; } else { SID = 0; } SCLK = 0; SCLK = 1;//上升沿发送数据 } } // 写串口指令 void write_com(unsigned char cmdcode) { CS = 1; sendbyte(0xf8); sendbyte(cmdcode & 0xf0); sendbyte((cmdcode << 4) & 0xf0); delay(2); } // 写串口数据 void write_data(unsigned char Dispdata) { CS = 1; sendbyte(0xfa); sendbyte(Dispdata & 0xf0); sendbyte((Dispdata << 4) & 0xf0); delay(2); } //初始化函数 void lcdinit() { RST = 0; delay(100); RST = 1; delay(20000); //延时2秒 write_com(0x30); //写基本指令集 delay(50); write_com(0x0c); //on打开 delay(50); Write_DS1302_DAT(0x90,0xab) ; //设置涓流寄存器,当主电源被切断后,自动切换到备用电源 Write_DS1302_DAT(0x84,0x00); //设置小时为24制 Write_DS1302_DAT(0x8C,0x10); //年 Write_DS1302_DAT(0x8A,0x04); //星期 Write_DS1302_DAT(0x88,0x10); //月 Write_DS1302_DAT(0x86,0x13); //日 Write_DS1302_DAT(0x84,0x00); //小时 Write_DS1302_DAT(0x82,0x00); //分钟 Write_DS1302_DAT(0x80,0x00); //秒钟,并启动时钟 if(Read_DS1302_DAT(0x81)&0x80) { Write_DS1302_DAT(0x8e, 0);//清除写保护 Write_DS1302_DAT(0x80, Dat_Chg_BCD(30));//30秒(并且进行BCD码转换) Write_DS1302_DAT(0x82, Dat_Chg_BCD(15));//15分 Write_DS1302_DAT(0x84, Dat_Chg_BCD(19));//19时 Write_DS1302_DAT(0x86, Dat_Chg_BCD(07)); Write_DS1302_DAT(0x88, Dat_Chg_BCD(05)); Write_DS1302_DAT(0x8c, Dat_Chg_BCD(16)); Write_DS1302_DAT(0x8e, 0x80);//开写保护 } } //主函数 void Main() { P0M0=0; P0M1=0; //CH = 0; delay(1); lcdinit(); delay(10); while(1) { uchar i; uchar Sec, Min, Hour,Nian,Yue,Ri; Write_DS1302_DAT(0x8e, 0); //清除写保护 Sec = BCD_Chg_Dat(Read_DS1302_DAT(0x81));//读秒寄存器(并且进行BCD码转换) Min = BCD_Chg_Dat(Read_DS1302_DAT(0x83));//读分寄存器 Hour = BCD_Chg_Dat(Read_DS1302_DAT(0x85));//读时寄存器 Ri = BCD_Chg_Dat(Read_DS1302_DAT(0x87));//读日寄存器 Yue= BCD_Chg_Dat(Read_DS1302_DAT(0x89));//读月寄存器 Nian = BCD_Chg_Dat(Read_DS1302_DAT(0x8d));//读年寄存器 Write_DS1302_DAT(0x8e, 0x80);//开写保护 for(i = 0; i < 10; i++) //循环显示时钟 { write_com(0x03); delay(50); write_com(0x81); for(i=0;i<5;i++) { write_data(table1); } write_data(table[Yue/10]); write_data(table[Yue%10]); write_data(table1[4]); write_data(table[Ri/10]); write_data(table[Ri%10]); write_com(0x92); write_data(table[Hour/10]); write_data(table[Hour%10]); write_data(table1[5]); write_data(table[Min/10]); write_data(table[Min%10]); write_data(table1[5]); write_data(table[Sec/10]); write_data(table[Sec%10]); } } } |
|
相关推荐
1个回答
|
|
|
软件仿真一步步跟下去。
|
|
|
|
|
只有小组成员才能发言,加入小组>>
3333个成员聚集在这个小组
加入小组9687 浏览 1 评论
10486 浏览 1 评论
MSP430FR5994 使用库函数 定时器触发AD问题请教
10807 浏览 2 评论
请问怎么把下面51单片机的代码改成msp430 g2 pocket的代码,还有改下时间变成30秒
2669 浏览 1 评论
5128 浏览 1 评论
MSP430FR5994 使用库函数 定时器触发AD问题请教
10826浏览 2评论
10503浏览 1评论
9700浏览 1评论
8346浏览 0评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-11 15:13 , Processed in 1.042873 second(s), Total 76, Slave 57 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
2227