pic16f877a和ds1302时钟在LCD12864的显示

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

#includepic.h//包含单片机内部资源预定义__CONFIG(0xFF32);//芯片配置字,看门狗关,上电延时开,掉电检测关,低压编程关,加密,4M晶体HS振荡#definelcd_dataPORTD//RDx并行通信引脚:D0-D7#definersRA5//RS接RA5#definerwRA4//RW接RA4#defineenRA3//E接RA3#definerstRA1//RST接RA1#definepsbRA2//PSB接RA2#definepsb_dirTRISA2#defineuintunsignedint#defineucharunsignedchar#definei_oRC4//定义DS1302的数据口#definei_o_dirTRISC4#definesclkRC3//定义DS1302的时钟口#definerst1RC2//定义DS1302的复位口unsignedchartime_rx@0x30;//定义接收寄存器staticvolatilebittime_rx7@(unsigned)&time_rx*8+7;//接收寄存器的最高位voidport_init();//申明引脚初始化函数voidds1302_init();//申明DS1302初始化函数voidset_time();//申明设置时间函数voidget_time_date();//申明读取时间函数voidzhaunhuan();//申明显示函数voidtime_write_1(unsignedchartime_tx);//申明写一个字节函数unsignedchartime_read_1();//申明读一个字节函数//定义待设置的时间:秒、分、时、日、月、星期、年、控制字constchartable[]={0x00,0x00,0x13,0x28,0x8,0x04,0x14,0x00};//定义读取时间和日期存放表格chartable1[7];//定义0-9的显示代码constunsignedcharTABLE[10]={0x3f,0x6,0x5b,0x4f,0x66,0x6d,0x7d,0x7,0x7f,0x6f};//,0x77,0x7c,0x39,0x5e,0x79,0x71};chartime[20];chardate[20];voidport_init(){ADCON1=0X07;//设置A口为普通I/O口//TRISB=0X0F;//设置B口低4位为输入//高四位为输出TRISA=0x00;//porta输出PORTA=0x00;//先关闭所有显示TRISD=0x00;//portd输出PORTD=0x00;TRISC=0X00;//rc输出}voidds1302_init(){sclk=0;//拉低时钟信号rst1=0;//复位DS1302rst1=1;//使能DS1302time_write_1(0x8e);//发控制命令time_write_1(0);//允许写DS1302rst1=0;//复位}voidset_time(){inti;//定义循环变量rst1=1;//使能DS1302time_write_1(0xbe);//时钟多字节写命令for(i=0;i8;i++)//连续写8个字节数据{time_write_1(table[i]);//调用写一个字节函数}rst1=0;//复位}voidtime_write_1(unsignedchartime_tx)//入口参数:unsignedchartime_tx待写数据{intj;//设置循环变量for(j=0;j8;j++)//连续写8bit{i_o=0;//先设置数据为0sclk=0;//时钟信号拉低if(time_tx&0x01)//判断待发送的数据位是0或1{i_o=1;//待发送数据位是1}time_tx=time_tx1;//待发送的数据右移1位sclk=1;//拉高时钟信号}sclk=0;//写完一个字节,拉低时钟信号}voidget_time_date(){inti;//设置循环变量rst1=1;//使能DS1302time_write_1(0xbf);//发送多字节读取命令for(i=0;i7;i++)//连续读取7个字节数据{table1[i]=time_read_1();//调用读取1个字节数据的函数}rst1=0;//复位DS1302zhaunhuan();//调用显示函数}unsignedchartime_read_1(){intj;//设置循环变量i_o_dir=1;//设置数据口方向为输入for(j=0;j8;j++)//连续读取8bit{sclk=0;//拉低时钟信号time_rx=time_rx1;//接收寄存器右移1位time_rx7=i_o;//把接收到的数据放到接收寄存器的最高位sclk=1;//拉高时钟信号}i_o_dir=0;//恢复数据口方向为输出sclk=0;//拉低时钟信号return(time_rx);//返回读取到的数据}voidzhaunhuan(){time[7]=(table1[0]&0x0f)+0x30;//求秒的个位time[6]=((table1[0]&0xf0)4)+0x30;//求秒的十位time[5]=0x3a;time[4]=(table1[1]&0x0f)+0x30;//求分的个位time[3]=((table1[1]&0xf0)4)+0x30;//求分的十位time[2]=0x3a;time[1]=(table1[2]&0x0f)+0x30;//求时的个位time[0]=((table1[2]&0xf0)4)+0x30;//求时的十位time[8]='\0';date[1]=(table1[6]&0x0f)+0x30;//求年的个位date[0]=((table1[6]&0xf0)4)+0x30;//求年的十位date[2]='/';date[4]=(table1[4]&0x0f)+0x30;//求月的个位date[3]=((table1[4]&0xf0)4)+0x30;//求月的十位date[5]='/';date[7]=(table1[3]&0x0f)+0x30;//求日的个位date[6]=((table1[3]&0xf0)4)+0x30;//求日的十位date[8]='\0';}/***************LCD显示部分**************************/voiddelayms(unsignedcharms)//80MHZ系统及外围设备时钟电路,延时MSms{//精确延时1munsignedchari;//100ms延时误差-1.8mswhile(ms--)//50ms延时误差-0.1ms{//10ms延时误差-0.2msfor(i=0;i121;i++)//200ms延时误差-3.8msNOP();}}voidbusy_check(void)//LCD与MCU通信“判忙”函数{unsignedcharlcd_status;while(1){rs=0;//指令寄存器rw=1;//读en=0;//使能低电平,为使能高电平读数据做准备delayms(1);lcd_status=PORTD;delayms(1);en=1;//使能高电平,读操作是在高电平时完成的//delayms(50);while(lcd_status&0x80);//等待忙碌状态结束break;}}voidwr_data(unsignedcharwrdata)//写数据函数{busy_check();//“判忙”rs=1;//数据寄存器rw=0;//写en=1;//使能高电平delayms(1);lcd_data=wrdata;en=0;//准备写入if(wrdata&0x80){PORTD=0;}elseNOP();//使能低电平,产生下降沿,完成写操作//delayms(100);}voidwr_cmd(unsignedcharcmd)//写指令函数{busy_check();//判忙rs=0;//指令寄存器rw=0;//写en=1;//使能高电平,为产生下降沿做准备delayms(1);lcd_data=cmd;//准备写入delayms(1);en=0;if(cmd&0x80){PORTD=0;}//使能低电平,产生下降沿,指令写入//delayms(100);}voiddisplay(ucharx,uchary,uchar*seg)//LCD显示位置的确定{//第X行,第Y列uchari=0;uchart=0;switch(x){case1:i=0x80;break;//第1行case2:i=0x90;break;//第2行case3:i=0x88;break;//第3行case4:i=0x98;break;//第4行default:break;}i=i+y-1;//确定最后的显示位置:第x行,第y列wr_cmd(i);//写入显示位置//delayms(100);while(seg[t]!='\0')//写入要显示的数据{//delayms(100);wr_data(seg[t]);//delayms(100);t++;}}voidlcd_init(void)//lcd初始化{delayms(20);psb=1;//delayms(20);rst=1;//置为高电平,结束重置//delayms(20);rst=0;//重置(低电平有效)//delayms(20);rst=1;//置为高电平,结束重置//delayms(20);wr_cmd(0x30);//显示格式命令//delayms(20);wr_cmd(0x30);//2次输入,无需判忙//delayms(20);wr_cmd(0x0c);//游标向右,显示光标,关闭反白//delayms(20);wr_cmd(0x01);//清屏//delayms(50);wr_cmd(0x06);//数据读取写入时,光标右移,显示右移//delayms(20);}voidmain(){port_init();//调用引脚初始化函数lcd_init();ds1302_init();//调用DS1302初始化函数//set_time();//调用设置时间函数while(1){get_time_date();//调用取时间函数display(1,1,date);display(2,1,time);}}

1 / 7
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功