【单片机】DS1302
来源:互联网 发布:mac 设置用户头像 编辑:程序博客网 时间:2024/05/18 18:22
main.c
#include <reg52.h>#include "./lcd/lcd.h"#define ds1302_sec_add0x80//#define ds1302_min_add0x82//#define ds1302_hr_add0x84//#define ds1302_date_add0x86//#define ds1302_month_add0x88//#define ds1302_day_add0x8a//#define ds1302_year_add0x8c//#define ds1302_control_add0x8e//#define ds1302_charger_add0x90 #define ds1302_clkburst_add0xbesbit RST = P1^0;sbit SCK = P1^1;sbit IO = P1^2;unsigned char timebuf[7] = {18,40,55,16,8,17,3}; //时,分,秒,年,月,日,星期unsigned char tempbuf[7];unsigned char readbuf[7];unsigned char disbuf[7];void ds1302_write_byte(unsigned char addr, unsigned char byte){ unsigned char i;addr = addr & 0xfe; //最低位清0SCK = 0;RST = 0;RST = 1;for(i = 0; i < 8; i++){ IO = addr & 0x01; //最低位SCK = 0; //上升沿SCK = 1; //上升沿addr >>= 1; //次低位}for(i = 0; i < 8; i++){ IO = byte & 0x01;SCK = 0;SCK = 1;byte >>= 1;}SCK = 0;RST = 0;}unsigned char ds1302_read_byte(unsigned char addr){ unsigned char i;unsigned char temp;addr = addr & 0xfe; //最低位清0SCK = 0;RST = 0;RST = 1;addr = addr + 1;for(i = 0; i < 8; i++){ IO = addr & 0x01; //最低位SCK = 0; //上升沿SCK = 1; //上升沿addr >>= 1; //次低位}for(i = 0; i < 8; i++){ SCK = 1; SCK = 0;temp >>= 1;if(IO){ temp += 0x80;}}RST = 0;return temp;}void ds1302_write_time(){ unsigned char temp; unsigned char i; for(i = 0; i < 7; i++) { temp = timebuf[i] / 10;tempbuf[i] = timebuf[i] % 10;tempbuf[i] = (temp << 4) | tempbuf[i];} ds1302_write_byte(ds1302_control_add,0x00); //关闭写保护 ds1302_write_byte(ds1302_hr_add,tempbuf[0]); ds1302_write_byte(ds1302_min_add,tempbuf[1]); ds1302_write_byte(ds1302_sec_add,tempbuf[2]);ds1302_write_byte(ds1302_year_add,tempbuf[3]);ds1302_write_byte(ds1302_month_add,tempbuf[4]);ds1302_write_byte(ds1302_date_add,tempbuf[5]);ds1302_write_byte(ds1302_day_add,tempbuf[6]); ds1302_write_byte(ds1302_control_add,0x80); //打开写保护}void ds1302_read_time(){ unsigned char i;unsigned char high;unsigned char low;readbuf[0] = ds1302_read_byte(ds1302_hr_add);readbuf[1] = ds1302_read_byte(ds1302_min_add);readbuf[2] = ds1302_read_byte(ds1302_sec_add);readbuf[3] = ds1302_read_byte(ds1302_year_add);readbuf[4] = ds1302_read_byte(ds1302_month_add);readbuf[5] = ds1302_read_byte(ds1302_date_add);readbuf[6] = ds1302_read_byte(ds1302_day_add);for(i = 0; i < 7; i++){ high = (readbuf[i] >> 4);low = (readbuf[i] & 0x0f);disbuf[i] = high * 10 + low;}}void lcd_dis_time(){ unsigned char lcd_distime[9] = {0};unsigned char lcd_time[9] = {0};lcd_distime[0] = (disbuf[0] / 10) + 0x30;lcd_distime[1] = (disbuf[0] % 10) + 0x30;lcd_distime[2] = ':';lcd_distime[3] = (disbuf[1] / 10) + 0x30;lcd_distime[4] = (disbuf[1] % 10) + 0x30;lcd_distime[5] = ':';lcd_distime[6] = (disbuf[2] / 10) + 0x30;lcd_distime[7] = (disbuf[2] % 10) + 0x30;lcd_time[0] = (disbuf[3] / 10) + 0x30;lcd_time[1] = (disbuf[3] % 10) + 0x30;lcd_time[2] = '.';lcd_time[3] = (disbuf[4] / 10) + 0x30;lcd_time[4] = (disbuf[4] % 10) + 0x30;lcd_time[5] = '.';lcd_time[6] = (disbuf[5] / 10) + 0x30;lcd_time[7] = (disbuf[5] % 10) + 0x30;lcd_dis_str(1,1,"DAY:20");lcd_dis_str(1,7,lcd_time);lcd_dis_str(2,6,lcd_distime);switch(readbuf[6]){ case 1:{ lcd_dis_str(2,1,"MON");break;}case 2:{ lcd_dis_str(2,1,"TUE");break;}case 3:{ lcd_dis_str(2,1,"WED");break;}case 4:{ lcd_dis_str(2,1,"THU");break;}case 5:{ lcd_dis_str(2,1,"FRI");break;}case 6:{ lcd_dis_str(2,1,"SAT");break;}case 7:{ lcd_dis_str(2,1,"SUN");break;}}}void main(){ lcd_init();ds1302_write_time();while(1){ ds1302_read_time();lcd_dis_time();}}
lcd.c
#include <reg52.h>#include "../delay/delay.h"#include "lcd.h"/*==================================================== 判断写入命令/数据函数=====================================================*/void lcd_write(unsigned char byte, unsigned char flag){ if(flag){ RS = 1; //选择数据寄存器}else{ RS = 0; //选择指令寄存器}RW = 0; //写E = 1; //选中LCDLCDPORT = byte;delay_us(5); //稳定E = 0; //失能LCD}/*==================================================== LCD初始化函数=====================================================*/void lcd_init(){ delay_ms(15);lcd_write(0x38,LCD_WRITE_COM); //显示8位数据接口,两行显示,5*7点阵字符delay_ms(5);lcd_write(0x38,LCD_WRITE_COM);delay_ms(5);lcd_write(0x38,LCD_WRITE_COM);delay_ms(5);lcd_write(0x38,LCD_WRITE_COM);delay_ms(5);lcd_write(0x08,LCD_WRITE_COM); //关闭显示,关闭光标的闪烁delay_ms(5);lcd_write(0x01,LCD_WRITE_COM); //清屏delay_ms(5);lcd_write(0x06,LCD_WRITE_COM); //设置指针方式,画面不平移delay_ms(5);lcd_write(0x0c,LCD_WRITE_COM); //打开显示delay_ms(5);}/*==================================================================================== 写入字符函数函数原型:void lcd_dis_byte(unsigned char x, unsigned char y, unsigned char byte);说明:x为行(1——2),y为列(1——8)。=====================================================================================*/void lcd_dis_byte(unsigned char x, unsigned char y, unsigned char byte){ unsigned char add; if(((0 == x) || (x > 2)) || ((0 == y) || (y > 16))){ return ;} add = 0x80 + (x - 1) * 0x40 + (y - 1);lcd_write(add,LCD_WRITE_COM); lcd_write(byte,LCD_WRITE_DATA);}/*==================================================================================== 写入字符串函数函数原型:void lcd_dis_str(unsigned char x, unsigned char y, unsigned char *disdata);说明:x为行(1——2),y为列(1——8)。=====================================================================================*/void lcd_dis_str(unsigned char x, unsigned char y, unsigned char *disdata){ unsigned char add; if(((0 == x) || (x > 2)) || ((0 == y) || (y > 16))){ return ;} add = 0x80 + (x - 1) * 0x40 + (y - 1);lcd_write(add,LCD_WRITE_COM); while(*disdata != '\0'){ lcd_write(*disdata,LCD_WRITE_DATA);disdata++;}}#if 0/*=========================================================================== 时间显示函数============================================================================*/void lcd_dis_time(){ lcd_write(0x80 + 4,LCD_WRITE_COM);lcd_write((hour / 10) + 0x30,LCD_WRITE_DATA);lcd_write((hour % 10) + 0x30,LCD_WRITE_DATA);lcd_write((min / 10) + 0x30,LCD_WRITE_DATA);lcd_write((min % 10) + 0x30,LCD_WRITE_DATA);lcd_write((sec / 10) + 0x30,LCD_WRITE_DATA);lcd_write((sec % 10) + 0x30,LCD_WRITE_DATA);}#endif
0 0
- 单片机--ds1302
- 【单片机】DS1302
- STC单片机 DS1302
- stc15f204单片机使用ds1302调试
- 单片机——ds1302代码
- 51单片机(AT89C52)DS1302时钟芯片程序
- AVR单片机(ATMEGA16)DS1302时钟芯片程序
- PIC单片机(PIC16F877A)DS1302芯片程序
- DS1302 中文资料+代码 单片机制作时钟
- STC单片机学习------DS1302时钟芯片
- 单片机复习笔记005 -- DS1302时钟芯片
- 51单片机DS1302实时时钟驱动程序
- 单片机笔记之DS1302实时时钟
- 51单片机的DS1302的驱动程序
- 单片机——ds1302时钟芯片
- 51单片机DS1302时钟芯片简单程序
- 单片机时钟程序(4)ds1302.c
- 单片机时钟程序(5)ds1302.h
- c++简单的ATL COM开发和调用实例
- 欢迎使用CSDN-markdown编辑器
- AllenZhao Java项目中读取properties文件,以及六种获取路径的方法
- WSGI 简介
- Java数组-选择排序-排序的性能问题
- 【单片机】DS1302
- 解决 网页本地调试通过,上传到服务器上后运行不加载JavaScript的问题
- rest与soap
- 究竟怎样写代码才算是好代码
- java文件I/O
- Eclipse将引用了第三方jar包的Java项目打包成jar文件的两种方法
- ''最少有一个"为什么跟distinct 有关
- RSA算法原理
- elasticsearch Getting Started (四)-修改数据