新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > DS1302芯片+1602液晶显示

DS1302芯片+1602液晶显示

作者: 时间:2016-11-29 来源:网络 收藏

网上的DS1302与1602搭配的程序很多都有很大问题。我写个全的,而且写得很细,让大家看看好了解,端口自己修改即可

本文引用地址:https://www.eepw.com.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;//秒、分、时、星期、日、月、年void delay(uint z) //延时子程序{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)//定义一个带参数的写数据子程序{rs=1; //1602的rs为0时,接收命令,为1时接收数据P0=dat;//把void write_shu(uchar shu)中的COM中的数据给P0口delay(5);en=1;delay(5);en=0;delay(5);}void write_1602com(uchar com)//定义一个带参数的写命令子程序{rs=0; //1602的rs为0时,接收命令,为1时接收数据P0=com;//把void write_com(uchar com)中的COM中的数据给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()//定义一个初始化子程序{en=0;rw=0;write_1602com(0x38);//调用 write_com子程序并把0x38赋给P0口,显示模式打开write_1602com(0x0e);//调用 write_com子程序并把“开显示,显示光标,光标闪烁”指令码赋给P0口write_1602com(0x06);//调用 write_com子程序并把“地址指针加1,整屏不移动”指令码赋给P0口//write_com(0x80+0x10);//数据指针初始化,让指针指向可显示的最右端write_1602com(0x80);//数据指针初始化,让指针指向最左端,显示从第一行开始write_1602com(0x01);//调用 write_com子程序并把"清零指"令码赋给P0口Write1602(0x80,2);Write1602(0x81,0);Write1602(0x80+4,-);Write1602(0x80+7,-);Write1602(0x80+0x40+5,:);Write1602(0x80+0x40+8,:);}/********************写一个字节**************/void write_1302byte(dat){uchar i;sclk=0;delayus();for(i=8;i>0;i--){io=dat&0x01;//只要是从低位取数,向高位一定要和0X01与delayus();sclk=1;//为写数据制造上升沿。delayus();sclk=0;//为下一次上升沿写下一个字节做准备dat>>=1;//将数据向左移一位,准备写入下一个数据}}/********************读一个字节***************/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拉高,为读一个字节的下降沿做准备delayus;//稍等制造一个高电平sclk=0;//为读一个字节制造下降沿delayus;}return dat;}/*************写入一个时间位*****************/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();//将上面地址中的数据赋给timedatsclk=1;_nop_();rst=0;return timedat;}/****************初始化1302*********************/void init_1302(){flag=read_1302add(0x81);//读秒寄存器的最高位,读出时钟状态if(flag&0x80)//判断时钟是否关闭,若内部关闭,则初始,若没关闭,不初始化,还在走{write_1302(0x8e,0x00);//去除写保护write_1302(0x80,((55/10)<<4|(55%10)));//写秒寄存器,并写入初值55write_1302(0x82,((59/10)<<4|(55%10)));//写分寄存器,并写入初值59write_1302(0x84,((22/10)<<4|(22%10)));//写小时寄存器,并写入初值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);//加上写保护}}				   
				
            
                
			
							
上一页 1 2 下一页

评论


技术专区

关闭