新聞中心

DS1302芯片+1602液晶顯示

作者: 時(shí)間:2016-11-29 來(lái)源:網(wǎng)絡(luò) 收藏

網(wǎng)上的DS1302與1602搭配的程序很多都有很大問(wèn)題。我寫個(gè)全的,而且寫得很細(xì),讓大家看看好了解,端口自己修改即可

本文引用地址:http://butianyuan.cn/article/201611/323346.htm
#include #include /*********************************端口定義**********************************/sbit sclk = P3^4;sbit io= P3^3;sbit rst= P3^5;sbit rs=P1^0;sbit en=P1^2;sbit rw=P1^1;#define uchar unsigned char#define uint  unsigned intuchar flag,second,minute,hour,week,day,month,year;//秒、分、時(shí)、星期、日、月、年void delay(uint z) //延時(shí)子程序{uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void delayus(){_nop_();_nop_();_nop_();_nop_();}void write_1602dat(uchar dat)//定義一個(gè)帶參數(shù)的寫數(shù)據(jù)子程序{rs=1; //1602的rs為0時(shí),接收命令,為1時(shí)接收數(shù)據(jù)P0=dat;//把void write_shu(uchar shu)中的COM中的數(shù)據(jù)給P0口delay(5);en=1;delay(5);en=0;delay(5);}void write_1602com(uchar com)//定義一個(gè)帶參數(shù)的寫命令子程序{rs=0; //1602的rs為0時(shí),接收命令,為1時(shí)接收數(shù)據(jù)P0=com;//把void write_com(uchar com)中的COM中的數(shù)據(jù)給P0口delay(5);en=1;delay(5);en=0;delay(5);}void Write1602(uchar add,uchar dat){write_1602com(add);write_1602dat(dat);}void init1602()//定義一個(gè)初始化子程序{en=0;rw=0;write_1602com(0x38);//調(diào)用 write_com子程序并把0x38賦給P0口,顯示模式打開(kāi)write_1602com(0x0e);//調(diào)用 write_com子程序并把“開(kāi)顯示,顯示光標(biāo),光標(biāo)閃爍”指令碼賦給P0口write_1602com(0x06);//調(diào)用 write_com子程序并把“地址指針加1,整屏不移動(dòng)”指令碼賦給P0口//write_com(0x80+0x10);//數(shù)據(jù)指針初始化,讓指針指向可顯示的最右端write_1602com(0x80);//數(shù)據(jù)指針初始化,讓指針指向最左端,顯示從第一行開(kāi)始write_1602com(0x01);//調(diào)用 write_com子程序并把"清零指"令碼賦給P0口Write1602(0x80,2);Write1602(0x81,0);Write1602(0x80+4,-);Write1602(0x80+7,-);Write1602(0x80+0x40+5,:);Write1602(0x80+0x40+8,:);}/********************寫一個(gè)字節(jié)**************/void write_1302byte(dat){uchar i;sclk=0;delayus();for(i=8;i>0;i--){io=dat&0x01;//只要是從低位取數(shù),向高位一定要和0X01與delayus();sclk=1;//為寫數(shù)據(jù)制造上升沿。delayus();sclk=0;//為下一次上升沿寫下一個(gè)字節(jié)做準(zhǔn)備dat>>=1;//將數(shù)據(jù)向左移一位,準(zhǔn)備寫入下一個(gè)數(shù)據(jù)}}/********************讀一個(gè)字節(jié)***************/uchar read_1302byte(){uchar i,dat;delayus();for(i=8;i>0;i--){dat>>=1;if(io==1){dat|=0x80;//將1取出,寫在dat的最高位。}sclk=1;//把sclk拉高,為讀一個(gè)字節(jié)的下降沿做準(zhǔn)備delayus;//稍等制造一個(gè)高電平sclk=0;//為讀一個(gè)字節(jié)制造下降沿delayus;}return dat;}/*************寫入一個(gè)時(shí)間位*****************/void write_1302(uchar add,uchar dat){rst=0;delayus();sclk=0;delayus();rst=1;write_1302byte(add);delayus();write_1302byte(dat);delayus();rst=0;}/****************讀1302的地址******************/uchar read_1302add(uchar add){uchar timedat;rst=0;_nop_();sclk=0;_nop_();rst=1;write_1302byte(add);//寫入要讀的地址timedat=read_1302byte();//將上面地址中的數(shù)據(jù)賦給timedatsclk=1;_nop_();rst=0;return timedat;}/****************初始化1302*********************/void init_1302(){flag=read_1302add(0x81);//讀秒寄存器的最高位,讀出時(shí)鐘狀態(tài)if(flag&0x80)//判斷時(shí)鐘是否關(guān)閉,若內(nèi)部關(guān)閉,則初始,若沒(méi)關(guān)閉,不初始化,還在走{write_1302(0x8e,0x00);//去除寫保護(hù)write_1302(0x80,((55/10)<<4|(55%10)));//寫秒寄存器,并寫入初值55write_1302(0x82,((59/10)<<4|(55%10)));//寫分寄存器,并寫入初值59write_1302(0x84,((22/10)<<4|(22%10)));//寫小時(shí)寄存器,并寫入初值23write_1302(0x86,((24/10)<<4|(24%10)));//寫日寄存器,并寫入初值18write_1302(0x88,((2/10)<<4|(2%10)));//寫月寄存器,并寫入初值2write_1302(0x8a,((5/10)<<4|(5%10)));//寫周寄存器,并寫入初值5write_1302(0x8c,((12/10)<<4|(12%10)));//寫年寄存器,并寫入初值12,不能寫2012年write_1302(0x90,0xa5);//寫充電方式write_1302(0x8e,0x80);//加上寫保護(hù)}}				   
				
            
                
			
							
上一頁(yè) 1 2 下一頁(yè)

關(guān)鍵詞: DS1302芯片1602液晶顯

評(píng)論


技術(shù)專區(qū)

關(guān)閉