PIC单片机(PIC16F877A)DS1302芯片程序
2012-06-29 11:29
288 查看
#include<pic.h> typedef unsigned char uchar; typedef unsigned int uint; #define rs_h PORTC|=0x01 #define rs_l PORTC&=0xfe #define rw_h PORTC|=0x02 #define rw_l PORTC&=0xfd #define en_h PORTC|=0x04 #define en_l PORTC&=0xfb #define rst_h PORTC|=0x08 #define rst_l PORTC&=0xf7 #define sck_h PORTC|=0x10 #define sck_l PORTC&=0xef #define io_h PORTC|=0x20 #define io_l PORTC&=0xdf #define SECADD 0X80//秒寄存器地址 #define MINADD 0x82 #define HRADD 0x84 #define DATEADD 0x86 #define MONTHADD 0x88 #define DAYADD 0x8a #define YEARADD 0x8c #define CONTROLADD 0x8e #define PORT (PORTB) void delayms(uint x); void lcd_com(uchar com); void lcd_dat(uchar dat); void lcd_write(uchar c,uchar r,uchar dat); void lcd_init(void); void Ds1302Init(void); void WriteByte(uchar dat); uchar ReadByte(void); uchar BCDtoDex(uchar dat); uchar DextoBCD(uchar dat); uchar ReadByte(void); void Ds1302Write(uchar add,uchar dat); uchar Ds1302Read(uchar add); void main(void) { uchar sec,min,hr,date,month,day,year; TRISB=0x00; TRISC&=0xc0; lcd_init(); Ds1302Init(); while(1) { sec=Ds1302Read(SECADD); min=Ds1302Read(MINADD); hr=Ds1302Read(HRADD); date=Ds1302Read(DATEADD); month=Ds1302Read(MONTHADD); day=Ds1302Read(DAYADD); year=Ds1302Read(YEARADD); sec=BCDtoDex(sec); min=BCDtoDex(min); hr=BCDtoDex(hr); date=BCDtoDex(date); month=BCDtoDex(month); day=BCDtoDex(day); year=BCDtoDex(year); lcd_write(0,1,0x32); lcd_write(0,2,0x30); lcd_write(0,3,0x30+year/10); lcd_write(0,4,0x30+year%10); lcd_write(0,6,0x30+month/10); lcd_write(0,7,0x30+month%10); lcd_write(0,9,0x30+date/10); lcd_write(0,10,0x30+date%10); lcd_write(0,14,0x30+day); lcd_write(1,4,0x30+hr/10); lcd_write(1,5,0x30+hr%10); lcd_write(1,7,0x30+min/10); lcd_write(1,8,0x30+min%10); lcd_write(1,10,0x30+sec/10); lcd_write(1,11,0x30+sec%10); delayms(1005);//1ms } } void Ds1302Init(void) { rst_l; sck_l; Ds1302Write(CONTROLADD,0);//关闭写保护 Ds1302Write(MINADD,DextoBCD(06)); Ds1302Write(HRADD,DextoBCD(19)); Ds1302Write(DATEADD,DextoBCD(20)); Ds1302Write(MONTHADD,DextoBCD(5)); Ds1302Write(DAYADD,DextoBCD(7)); Ds1302Write(YEARADD,DextoBCD(12)); Ds1302Write(SECADD,DextoBCD(30));//写秒,同时启动时钟 } void WriteByte(uchar dat)//上升沿输出 { uchar i; TRISC&=0xdf; for(i=8;i>0;i--) { sck_l;//低电平时数据线可变 if(dat&0x01) io_h; else io_l; sck_h; dat>>=1; } } uchar BCDtoDex(uchar dat)//BCD码转十进制 { uchar i; i=dat/16; dat%=16; i=i*10+dat; return i; } uchar DextoBCD(uchar dat)//十进制转BCD码 { uchar i; i=dat/10; dat%=10; i=i*16+dat; return i; } uchar ReadByte(void)//下降沿输出 { uchar i; uchar dat; TRISC|=0x20; for(i=8;i>0;i--)//要考虑之前写完后的状态,第一次进入此循环体即有下降沿 { dat>>=1; sck_l; if(PORTC&0x20) dat|=0x80; sck_h; } return dat; } void Ds1302Write(uchar add,uchar dat) { rst_l; sck_l; rst_h; WriteByte(add);//最低位置0表示写 WriteByte(dat); rst_l; } uchar Ds1302Read(uchar add) { uchar dat; rst_l; sck_l; rst_h; WriteByte(add+1);//地址最低位置1表示读 dat=ReadByte(); rst_l; return dat; } void delayms(uint x) //8M晶振下,延时1ms { uint y,z; for(y=x;y>0;y--) for(z=220;z>0;z--); } void lcd_init(void)//LCD1602初始化 { lcd_com(0x38); lcd_com(0x0c); lcd_com(0x06); lcd_write(0,5,0xb0); lcd_write(0,8,0xb0); lcd_write(1,6,0x3a); lcd_write(1,9,0x3a); } void lcd_com(uchar com)//向LCD1602写命令 { rs_l; rw_l; PORT=com; delayms(1); en_h; delayms(1); en_l; } void lcd_dat(uchar dat)//向LCD1602写数据 { rs_h; rw_l; PORT=dat; delayms(1); en_h; delayms(1); en_l; } void lcd_write(uchar c,uchar r,uchar dat)//向LCD1602指定行、指定列、写数据 { lcd_com(0x80+0x40*c+r); lcd_dat(dat); delayms(1); }
![](http://my.csdn.net/uploads/201206/29/1340941071_7125.jpg)
相关文章推荐
- PIC单片机(PIC16F877A)外部中断程序
- PIC单片机(PIC16F877A)串行收发程序
- PIC单片机的BCD码处理程序
- PIC单片机(PIC16F877A)基于状态机思想的矩阵键盘检测
- PIC最简约的PWM波形产生程序(PIC16F877A)
- PIC单片机(PIC16F877A)定时器
- 在stm32f4(正点原子“探索者”的板子)上,如何移植ds1302芯片程序
- 综合实例:PIC单片机(PIC16F877A)万年历(温度闹钟年月日时分秒星期)
- PIC单片机DS18B20温度报警程序及仿真
- PIC单片机之中断程序
- PIC单片机(PIC16F877A)DS18B20温度传感器驱动程序
- PIC16F877A PICC AD转换程序
- PIC16F877A PICC AD转换程序
- 漫话验证码缘起,程序原理及其他
- 用程序禁用与启用网卡
- C#实现类似qq的屏幕截图程序 [转载]
- 一个屏蔽广告程序的简单实现
- VS.NET2005编写的程序在没有.NET FRAMWORK环境下的运行方法!
- 程序设计竞赛网站集锦
- 程序人生--一个程序员对学弟学妹建议(转2)