找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1295|回复: 0
收起左侧

单片机DS1302+LCD1602源程序

[复制链接]
ID:569701 发表于 2019-10-19 17:08 | 显示全部楼层 |阅读模式
/* 星期映射表 */
unsigned char * code p[7] = {"Sun.","Mon.","Tue.","Wed.","Thur.","Fri.","Sat."};
/* 定义标志 0:年 1:月 2:日 3:周 4:时 5:分*/
unsigned char flag_adjust = 0;


/**                @brief        时间显示函数
*                @param        无
*                @reval        无
*/

void Time_Display(void){
        DS1302_ReadTime();                                // 读取实时时间
        lcd_w_cmd(0x82);
        lcd_w_nums(TIM[0],2);                        // 年
        lcd_w_cmd(0x85);
        lcd_w_nums(TIM[1],2);                        // 月
        lcd_w_cmd(0x88);
        lcd_w_nums(TIM[2],2);                        // 日
        lcd_w_cmd(0x8E);
        lcd_w_num(flag_adjust);                // 调整位
        
        lcd_w_cmd(0xC0);
        lcd_w_nums(TIM[4],2);                        // 时
        lcd_w_cmd(0xC3);
        lcd_w_nums(TIM[5],2);                        // 分
        lcd_w_cmd(0xC6);
        lcd_w_nums(TIM[6],2);                        // 秒
        lcd_w_cmd(0xCF);
        lcd_w_str(" ");
        lcd_w_cmd(0xCB);
        lcd_w_str(p[TIM[3]-1]);                // 星期英文缩写
}
/**                @brief        时间列表调整函数
*                @param        char i 1 自加 -1 自减
*                @reval        无
*/

void time_adjust(char i){
        int temp = TIM[flag_adjust];
        if(i==1 || i==-1)temp+=i;
        switch(flag_adjust){
                case 0:                                                                        // 年
                        if(temp<0)
                                temp=99;
                  else if(temp>99)
                                temp=0;   
                        break;
                case 1:                                                                        // 月
                        if(temp<=0)
                                temp=12;
                  else if(temp>=13)
                                temp=1;   
                        break;
                case 2:                                                                        // 日
                        if(temp<=0)
                                temp=31;
                  else if(temp>31)
                                temp=1;   
                        break;
                case 3:                                                                        // 周
                        if(temp<1)
                                temp=7;
                  else if(temp>7)
                                temp=1;   
                        break;
                case 4:                                                                        // 时
                        if(temp<0)
                                temp=23;
                  else if(temp>=23)
                                temp=0;   
                        break;
                case 5:                                                                        // 分
                        if(temp<0)
                                temp=59;
                  else if(temp>=60)
                                temp=0;   
                        break;
        }
        temp = ((temp/10)<<4)|(temp%10);                        // 将数字转化为BCD码
        TIM[flag_adjust] = temp;                                                        // 将对应的BCD码填入表格中
}

/**                @brief        按键处理函数
*                @param        无
*                @reval        无
*/

void key_pro(void){
        unsigned char key = 0;        // 存储按键值
        key = key_scanf(0);                        // 获取按键值
        switch(key){
                case 1: flag_adjust++;if(flag_adjust>5)flag_adjust=0;break;
                case 2: time_adjust(1);break;
                case 3: time_adjust(-1);break;
                default:break;
        }                // 按键处理
        if(key==2||key==3){        
                DS1302_WriteData(0X8E,0x00);
                DS1302_WriteData(RTC_WRITE_ADDR[flag_adjust],TIM[flag_adjust]);
                DS1302_WriteData(0X8E,0x80);
        }                // 把按键更新的数据写进对应寄存器里
}


/**                @brief        主函数
*                @param        无
*                @reval        无
*/

void main(void){
        lcd_int();                                                                // 液晶初始化
        DS1302_Init();                                                // DS302初始化
        lcd_w_str("2019-10-19");        
        lcd_w_cmd(0xC0);
        lcd_w_str("15:38:30");                // 显示
        while(1){
                Time_Display();                                        // 刷新时间
                key_pro();                                                        // 按键处理
        }
}


DS1302.jpg

DS1302.rar (1.65 MB, 下载次数: 19)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表