DS1302时钟与LCD1602液晶显示

DS1302时钟

DS1302是一个实时时钟芯片,它在实时显示时间中应用。它可以对年、月、日、周、时、分、秒进行计时。

DS1302的引脚及原理图如下:

它与CPU的连接需要SCLK(7)、I/O(6)和RST(5)三个引脚,VCC2和VCC1分别为主电源和备份电源,X1和X2分别接外部振荡器。在于CPU的通信中I/O用来传输数据,RST作为复位信号,SCLK用来控制数据字节的读写。

DS1302的读写时序如下:

程序中对芯片的操作主要是参考芯片的时序状态,时序中说明只要有对数据的操作RST就需要置1,在读数据的前8个时钟中在SCLK处于高电平的过程中会获取控制字信息,此过程I/O数据不会变化,而在低电平的过程中I/O数据进行改变;而到后8个时钟会读数据,对于SCLK的控制与前8个时钟相反。对于写数据的过程与读的过程相似只是后面读写的SCLK时钟控制信号不同。

DS1302的时钟寄存器如下:

第6位用来选择时钟或RAM,第0位用来做读写的选择,对于第1、2、3为从000到111依次对应秒、分、时、日、月、周、年和控制字地址。

LCD1602液晶

LCD1602它是一种专门用来显示字母、数字、符号等的点阵型液晶模块。用它来显示需要的字母、数字和符号等会比数码管和LED点阵都要方便。

LCD1602的引脚图如下:

引脚1、2为地和电源,引脚4为RS用来控制数据和命令选择,引脚5为R/W用来控制读写的选择控制,引脚6为使能控制信号。从第7到14分别对应数据的8个位。

LCD1602的读写时序如下:

写时序:

读时序:

RS控制数据和命令的选择,读写数据时置高电平否则置低电平;R/W用来控制读写的选择,写操作时为低电平(第1个图),读操作时为高电平(第2个图);读写过程需要E给一个高脉冲。

LCD1602的状态字和相应指令:

状态字

前6位对应数据的地址,第7位为读写的使能控制位。

相应指令:

模式设定指令为:0x38。清屏显示为0x01;数据指针清零为0x02。

显示开关及光标的设置:

程序

下边是利用LCD1602显示DS1302时钟信息的例程。

程序分为4个文件信息分别如下,对于其中的内容可以参考相关注释信息:

1、1602.h文件(在1602.c中作为引用),用来定义LCD1602的相关引脚和函数声明。

typedef bit bool;sbit RS = P2^6; //复位端sbit RW = P2^5; //写数据端sbit EN = P2^7; //使能端#define uint unsigned int #define uchar unsigned charvoid delay(int i);bit lcd_bz();void lcd_wcmd(int cmd);void lcd_showstring(uchar r,uchar c,uchar *str);void lcd_wdat(uchar dat);void lcd_init();

2、1602.c文件,其中含有对LCD1602初始化和数据及命令的读写控制。

</pre><p><span style="font-size:24px"></span><pre name="code" class="cpp">#include <reg51.h>#include <intrins.h>#include "1602.h"//延时函数void delay(int i){int j;while(i–){for(j=0;j<250;j++){_nop_();_nop_();_nop_();_nop_();}}}//侧忙,判断LCD是否为忙。bool lcd_bz(){bool result;RS = 0;RW = 1;EN = 1;_nop_();_nop_();_nop_();_nop_();result = (bool)(P0 & 0x80);//检测P0最高位是否为1.EN = 0;return result;//返回判断的结果。}//写命令函数。void lcd_wcmd_8bit(int cmd){while(lcd_bz());RS = 0;RW = 0;EN = 0;//先为低电平。_nop_();_nop_();P0 = cmd; //获得数据。_nop_();_nop_();_nop_();_nop_();EN = 1; //将电平拉高。_nop_();_nop_();_nop_();_nop_();EN = 0; //再拉低。} //写命令函数。void lcd_wcmd(int cmd){while(lcd_bz());RS = 0;RW = 0;EN = 0; //先为低电平。_nop_();_nop_();P0 = cmd;//获得高四位数据。_nop_();_nop_();_nop_();_nop_();EN = 1;//拉高。_nop_();_nop_();_nop_();_nop_();EN = 0;//再拉低。P0 = (cmd & 0x0f)<<4; //再获得低四位数据。_nop_();_nop_();_nop_();_nop_();EN = 1; //将电平拉高。_nop_();_nop_();_nop_();_nop_();EN = 0; //再拉低。}void lcd_showstring(uchar r,uchar c,uchar *str){uchar i=0;code uchar DDRAM[] = {0x80,0xc0}; //设定显示的位置。lcd_wcmd(DDRAM[r] | c);for(i=0;str[i] && i<16;i++)lcd_wdat(str[i]);for(;i<16;i++)lcd_wdat(' ');}//数据写入的函数。void lcd_wdat(uchar dat){while(lcd_bz());RS = 1;RW = 0;EN = 0;//先处于低电平。P0 = dat; //获得数据高四位。_nop_();_nop_();_nop_();_nop_();EN = 1;_nop_();_nop_(); //再产生一个负脉冲。_nop_();_nop_();EN = 0;RS = 1;RW = 0;EN = 0;_nop_();_nop_();_nop_();_nop_();P0 = (dat & 0x0f)<<4;//同理获得低四位。_nop_();_nop_();_nop_();_nop_();EN = 1;_nop_();_nop_();_nop_();_nop_();EN = 0;}//LCD初始化。void lcd_init(){lcd_wcmd_8bit(0x38);delay(1);lcd_wcmd_8bit(0x38);delay(1);lcd_wcmd_8bit(0x38);delay(1);lcd_wcmd(0x38);delay(1);lcd_wcmd(0x0c);delay(1);lcd_wcmd(0x02);delay(1);lcd_wcmd(0x01);delay(1);}

3、DS1302时钟.c文件,其中含有DS1302时钟的引脚定义及时钟信息的读写等相关操作。

世界会向那些有目标和远见的人让路(冯两努——香港着名推销商

DS1302时钟与LCD1602液晶显示

相关文章:

你感兴趣的文章:

标签云: