DS1302芯片+1602液晶显示

发布者:光子梦境最新更新时间:2015-07-22 来源: 51hei关键字:DS1302芯片  液晶显示 手机看文章 扫描二维码
随时随地手机看文章

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

#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 int
uchar 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();//将上面地址中的数据赋给timedat
sclk=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)));//写秒寄存器,并写入初值55
   write_1302(0x82,((59/10)<<4|(55%10)));//写分寄存器,并写入初值59
   write_1302(0x84,((22/10)<<4|(22%10)));//写小时寄存器,并写入初值23
   write_1302(0x86,((24/10)<<4|(24%10)));//写日寄存器,并写入初值18
   write_1302(0x88,((2/10)<<4|(2%10)));//写月寄存器,并写入初值2
   write_1302(0x8a,((5/10)<<4|(5%10)));//写周寄存器,并写入初值5
   write_1302(0x8c,((12/10)<<4|(12%10)));//写年寄存器,并写入初值12,不能写2012年
    write_1302(0x90,0xa5);//写充电方式
    write_1302(0x8e,0x80);//加上写保护
   }
}[page]
/*****************读出秒的十进制数***************************/

uchar readsecond(uchar dat)
{
dat=read_1302add(0x81);
second=((dat&0x70)>>4)*10+(dat&0x0f);
return second;
}

/*****************读出分的十进制数***************************/

uchar readminute(uchar dat)
{
dat=read_1302add(0x83);
minute=((dat&0x70)>>4)*10+(dat&0x0f);
return minute;
}

/*****************读出小时的十进制数***************************/

uchar readhour(uchar dat)
{
dat=read_1302add(0x85);
hour=((dat&0x70)>>4)*10+(dat&0x0f);
return hour;
}
/*****************读出天的十进制数***************************/

uchar readday(uchar dat)
{
dat=read_1302add(0x87);
day=((dat&0x70)>>4)*10+(dat&0x0f);
return day;
}

/*****************读出月的十进制数***************************/

uchar readmonth(uchar dat)
{
dat=read_1302add(0x89);
month=((dat&0x70)>>4)*10+(dat&0x0f);
return month;
}
/*****************读出周的十进制数***************************/

uchar readweek(uchar dat)
{
dat=read_1302add(0x8b);
week=((dat&0x70)>>4)*10+(dat&0x0f);
return week;
}

/*****************读出年的十进制数***************************/

uchar readyear(uchar dat)
{
dat=read_1302add(0x8d);
year=((dat&0xf0)>>4)*10+(dat&0x0f);
return year;
}
 
/************************读出所有时间**********************/
readtime()
{
readsecond();
readminute();
readhour();
readday();
-readmonth();
readweek();
readyear();
}
/*********************向1602写入时间****************************/
void write_second()
{
uchar shi,ge;
shi=second/10;
ge=second%10;
Write1602(0x80+0x40+9,0x30+shi);
Write1602(0x80+0x40+10,0x30+ge);
}
void write_minute()
{
uchar shi,ge;
shi=minute/10;
ge=minute%10;
Write1602(0x80+0x40+6,0x30+shi);
Write1602(0x80+0x40+7,0x30+ge);
}
void write_hour()
{
uchar shi,ge;
shi=hour/10;
ge=hour%10;
Write1602(0x80+0x40+3,0x30+shi);
Write1602(0x80+0x40+4,0x30+ge);
}

void write_day()
{
uchar shi,ge;
shi=day/10;
ge=day%10;
Write1602(0x80+8,0x30+shi);
Write1602(0x80+9,0x30+ge);
}
void write_month()
{
uchar shi,ge;
shi=month/10;
ge=month%10;
Write1602(0x80+5,0x30+shi);
Write1602(0x80+6,0x30+ge);
}
void write_year()
{
uchar shi,ge;
shi=year/10;
ge=year%10;
Write1602(0x80+2,0x30+shi);
Write1602(0x80+3,0x30+ge);
}
void write_week()
{
/*uchar shi,ge;
shi=week/10;
ge=week%10;
Write1602(0x80+12,0x30+shi);
Write1602(0x80+13,0x30+ge);
*/
Write1602(0x80+12,0x30+week);
}
 void main()
{
  delay(100);
  init1602();
  init_1302();
  while(1)
    {
  readtime();
  write_second();
  write_minute();
  write_hour();
  write_day();
  write_month();
  write_year();
   write_week();
 }
}
关键字:DS1302芯片  液晶显示 引用地址:DS1302芯片+1602液晶显示

上一篇:基于51单片机的智能小车(遥控模块寻迹避障)
下一篇:基于51单片机的倒计时器设计

推荐阅读最新更新时间:2024-03-16 14:25

液晶显示AT89C52单片机DS1302实时时钟程序
#include'reg52.h' //包含单片机寄存器的头文件 #include'intrins.h' //包含_nop_()的头文件 sbit RS=P2^0; //LCD读写选择位 sbit RW=P2^1; //LCD读写选择位 sbit E=P2^2; //LCD使能端 sbit BF=P0^7; //忙信号 sbit SCLK=P1^0; //1302时钟输出端 sbit DATA=P1^1; //1302数据端 sbit RST=P1^2; //1302复位端 unsigned char code digit = 0123456789 ; void
[单片机]
MSP430 G2553 LCD1602 秒表
按键控制开始暂停 int main(void) { unsigned char dis , count; WDTCTL = WDTPW | WDTHOLD; // stop watchdog timer //设置单片机工作时钟 设置为1MHZ if (CALBC1_1MHZ == 0xFF) // If calibration constant erased { while (1) ; // do not load, trap CPU!! } DCOCTL = 0; // Select lowest
[单片机]
MSP430 G2553 LCD<font color='red'>1602</font> 秒表
stm8 软件模拟IIC驱动PCF8563T,NOKIA5110液晶显示
调试stm8硬件IIC,弄了几天,搞得人头大,一直程序就是卡在 while((I2C_SR1&0x02))这里,数据手册和网上的各种帖子基本都看了,程序都试了,ARF位也设置了,还是调试不通,最后没办法只能使用软件模拟IIC了。 这次使用软件模拟IIC驱动PCF8563T,这个时钟芯片。其实软件模拟也不难。 我们就来直接看代码吧。具体的实验现象,没有图片,现在硬件也拆了,但是程序都是验证过了的。通过一个NOKIA5110液晶屏显示出来时间数据。 #include IOSTM8S105K4.h #define u16 unsigned int #define u8 unsigned char u8 i;
[单片机]
新型图形液晶显示驱动控制器CS0108的原理及应用
摘要:CS0108是一种新型图形液晶显示驱动控制器,该器件具有64路列驱动输出,并内含显示存储器,可与行驱动器CS0107配合使用以对液晶屏进行行、列驱动,同时可直接和单片机连接来完成图形及文字的显示。 关键词:液晶显示;驱动控制 1 CS0108的主要特点 近几年来,液晶显示技术以惊人的速度飞速发展,并以其良好的性能和广泛的应用范围日益为人们所重视并接受。本文介绍的CS0108就是一个内带显示存储器的列驱动和控制电路。 CS0108内置64%26;#215;64位显示存储器,显示屏上各像素点的显示状态与显示存储器的各位数据一一对应,显示存储器的数据可直接作为图形显示的驱动信号当显示数据为“1”时,相应的像素点显示;显
[电源管理]
基于单片机的12864液晶显示动画效果设计
该设计示效果为:12864上半屏显示静态汉字(* * *相信你会成功的!),下半屏显示动画效果(锤子砸钉子,锤子落下钉子钉入的循环效果),完整的程序源代码从这里下载 http://www.51hei.com/f/12864dh.rar ,注意这种是使用的不带字库的屏幕.电路按上面的图,程序已经测试成功。 #include reg52.h #define uchar unsigned char #define uint unsigned int sbit lcdcs1=P3^7; sbit lcdcs2=P3^6; sbit rs=P3^5; sbit rw=P3^4; sbit lcden=P3^3; uint unm,
[单片机]
基于单片机的12864<font color='red'>液晶显示</font>动画效果设计
1602液晶显示屏显示字符
本次实验的效果为实现特定字符在1602液晶显示屏上流动显示 所用开发板为普中科技开发板,电路图如下: 代码如下: #include reg51.h #define uchar unsigned char #define uint unsigned int sbit rs = P2^6; sbit rw = P2^5; sbit lcden = P2^7; unsigned char table1 = Pechin Science ; unsigned char table2 = Welcome to the world of MCU ; void delay(uchar m) { uchar n
[单片机]
基于51单片机的LCD1602实现分秒计时总结
完成要求 1、实现分秒计时。 2、按键控制分秒的调整(两个按键分别控制分秒增加)。 3、实现整分报时功能(蜂鸣器响)。 4、PCB板的绘制及焊接 设计思路及实现原理 1、首先实现分秒计时功能。为实现分秒计时功能,需要使用到单片机中的计时器功能,通过计时器来完成秒增加的运算,进而对分进行运算。 2、其次在实现分秒自动计时的基础上添加按键分别对分秒进行控制。此步骤需要使用到按键检测,及按键消抖。因为在程序中使用两个返回值,所以按键对这两个返回值进行操作,在调秒过程中,需要使两返回值一致,否则分秒进位发生不一致。 3、最后在完成整分报时功能。此步骤需要对分秒的值进行判断,因为整分时,秒位为0,分位进1,而在初始时刻(即00:00)不
[单片机]
基于51单片机的LCD<font color='red'>1602</font>实现分秒计时总结
如何在液晶显示器上显示汉字、ASCII字符和彩色图形
本文介绍了以高性能的8位单片机C8051F120作为核心处理器,接收和处理PC机键盘和触摸屏的操作信息,并将其转化成液晶显示器(TFT)可显示的点阵数据;用SRAM作为显存,FPGA接收单片机传送的显示数据,控制显存的读写操作,并产生液晶显示器的工作时序,最终完成在液晶显示器上显示字符和65 536色彩色图形的嵌入式设计方案。其中重点描述了核心处理单元C8051F120的软件设计。 嵌入式设备凭借其与使用者之间的亲和力、自然的人机交互界面,得到了迅速的发展,渗透到生活中的各个角落。本文介绍的设计方法是以高性能的8位单片机C8051F120作为核心处理器,SRAM作为系统的显存,FPGA实现时序转换,构建低温(-10℃)下嵌入式
[单片机]
如何在<font color='red'>液晶显示</font>器上显示汉字、ASCII字符和彩色图形
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved