基于PIC16F887单片机的数字钟完整c程序代码(2)

2020-02-20 14:04

//=======DS1307有关子程序 //===DS1307初始化 void DS1307_CSH() { write_DS1307(0x00,0X00);//秒钟设置 write_DS1307(0x01,0x01);//分钟设置 write_DS1307(0x02,0x01);//小时设置 write_DS1307(0x03,0X01);//星期天设置 write_DS1307(0x04,0x01);//日月设置 write_DS1307(0x05,0x05);//月设置 write_DS1307(0x06,0x12);//年设置 write_DS1307(0x07,0x70);//7脚方波允许,输出1HZ }

//==IIC初始化 void IIC_CSH()

{ TRISC =0b00011000; //SDA,SCL设置为输入 SSPCON=0b00101000; //同步串口使能(SSPEN),主控方式 SMP=0; //使能高速模式(400 kHz) 的压摆率控制 SSPADD=4; //主控模式为波特率值,每位时间T=(SSPADD+1)/Tcy=5us }

//发送数R并等待发送完成,收到从机的应答信号 void IIC_SEND(char R) { SSPBUF=R; //发送 while (RW==1); //在主动模式下,判断发送是否完成 while (SSPIF==0); //等待发送完成 while (ACKSTAT==1); //等待从机发送应答信号 NOP(); }

//====读写DS1307程序

void write_DS1307(char addr,char data) { SEN=1; //发送起始位 while(SEN==1); //检测起始位完成 IIC_SEND(0b11010000); //送DS1307的七位地址和写功能 IIC_SEND(addr); //发送要写入的地址 IIC_SEND(data); //发送要写入的数

PEN=1; //发送停止位 while (PEN==1); //检查停止位结束 }

//===读DS1307

void READ_DS1307(char addr,char n) { char i; SEN=1; //产生起始位 while (SEN==1); //检测起始位完成 IIC_SEND(0b11010000); //送DS1307的7位地址 IIC_SEND(addr); //此值为DS1307要读的地址 PEN=1; //发送停止位 while (PEN==1);//检查停止位结束 NOP(); RSEN=1; //发送重新启始位 while(RSEN==1); //检测重新起始位完成 IIC_SEND(0b11010001); //读数据 for (i=0;i

//=====显示DS1307

void MENU_DS1307(void)

{ LCD_WRITE(0b00001100,COM); //D(d2)=1:打开显示,C(d1)=1:光标打开,B(d0)=1:光标不闪烁 char i; LCD_WRITE(LINE1,COM); //DDRAM地址,第1行的第1个字符 LCD_WRITE(' ',DAT);

LCD_WRITE('2',DAT); LCD_WRITE('0',DAT); LCD_WRITE((A[6]>>4)+0x30,DAT); LCD_WRITE((A[6]&0x0F)+0x30,DAT); LCD_WRITE('-',DAT); LCD_WRITE((A[5]>>4)+'0',DAT); LCD_WRITE((A[5]&0x0F)+'0',DAT); LCD_WRITE('-',DAT); LCD_WRITE((A[4]>>4)+'0',DAT); LCD_WRITE((A[4]&0x0F)+'0',DAT); LCD_WRITE(' ',DAT); i=A[3]&0x07; LCD_WRITE(table[(i-1)*4],DAT); LCD_WRITE(table[(i-1)*4+1],DAT); LCD_WRITE(table[(i-1)*4+2],DAT); LCD_WRITE(table[(i-1)*4+3],DAT); //LCD_WRITE(' ',DAT); LCD_WRITE(LINE2,COM); //DDRAM地址,第2行的第1个字符 LCD_WRITE(' ',DAT); LCD_WRITE((A[2]>>4)+'0',DAT); LCD_WRITE((A[2]&0x0F)+'0',DAT); LCD_WRITE(0x3A,DAT); LCD_WRITE((A[1]>>4)+'0',DAT); LCD_WRITE((A[1]&0x0F)+'0',DAT); LCD_WRITE(0x3A,DAT); LCD_WRITE((A[0]>>4)+'0',DAT); LCD_WRITE((A[0]&0x0F)+'0',DAT); LCD_WRITE(' ',DAT); }

char dec_bcd(char dec) { char bcd; bcd= 0; while(dec >= 10) { dec -= 10; bcd++; } bcd <<= 4; bcd |= dec; return (bcd); }

void bcd_dec(char adr,char R) { SW=A[adr]>>4; GW=A[adr]&0x0F; while(SW>0) { R=R+10;SW--; } R+=GW; }

//====按键程序 void set_time() { if(mod==0) {

delaynms(30); if(mod==0) {

while(!mod);//等待 M++; if(M==3)

{ M=0;flag=0;f=0;a=0; } } }

if(M==1)//设置时间 {

if(set==0) {

delaynms(30); if(set==0) {

while(!set); a++; if(a==8) a=0; } }

guangbiao();//光标定位,闪烁 if(a==1) {

if(add==0) {

delaynms(30); if(add==0) {

while(!add); bcd_dec(0,sec); sec++; if(sec==60) sec=0; write_DS1307(0,dec_bcd(sec)); } }

if(miu==0) {

delaynms(30); if(miu==0) {

while(!miu); bcd_dec(0,sec); sec--;

if(sec==-1)sec=59; write_DS1307(0,dec_bcd(sec)); } } }

if(a==2) {

if(add==0) {

delaynms(30); if(add==0) {

while(!add); bcd_dec(1,min); min++; if(min==60) min=0;

write_DS1307(1,dec_bcd(min)); } }

if(miu==0) {


基于PIC16F887单片机的数字钟完整c程序代码(2).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:股权转让过程中涉税问题

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: