LCD12864万年历单片机程序+实物制作+Proteus仿真

发布者:Yaqi最新更新时间:2019-11-29 来源: 51hei关键字:LCD12864  万年历  片机程序 手机看文章 扫描二维码
随时随地手机看文章

制作出来的LCD12864万年历实物图如下:
0.png 

LCD12864万年历仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
0.png 

电路原理图如下:
0.png

单片机源程序如下:

*-----------------------------------------------

  名称:12864字库液晶显示

  内容:通过显示字符、数字、汉字和图片测试液晶基本功能

------------------------------------------------*/

#include

#include

#include "delay.h"

sbit RS = P3^5;

sbit RW = P3^6;

sbit E  = P3^4;

sbit RES = P1^7;

sbit PSB = P1^6;

sbit beep = P2^3;

#define DataPort P0        //MCU P0<------> LCM

//

typedef unsigned char  U8;       /* defined for unsigned 8-bits integer variable    无符号8位整型变量  */

typedef signed   char  S8;       /* defined for signed 8-bits integer variable    有符号8位整型变量  */

typedef unsigned int   U16;      /* defined for unsigned 16-bits integer variable    无符号16位整型变量 */

typedef signed   int   S16;      /* defined for signed 16-bits integer variable    有符号16位整型变量 */

typedef unsigned long  U32;      /* defined for unsigned 32-bits integer variable    无符号32位整型变量 */

typedef signed   long  S32;      /* defined for signed 32-bits integer variable    有符号32位整型变量 */

typedef float          F32;      /* single precision floating point variable (32bits) 单精度浮点数(32位长度) */

typedef double         F64;      /* double precision floating point variable (64bits) 双精度浮点数(64位长度) */

//

#define uchar unsigned char

#define uint unsigned int

#define   Data_0_time    4

//----------------------------------------------//

//----------------IO口定义区--------------------//

//----------------------------------------------//

sbit  P2_0  = P2^0 ;

//----------------------------------------------//

//----------------定义区--------------------//

//----------------------------------------------//

U8  U8FLAG,k;

U8  U8count,U8temp;

U8  U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;

U8  U8comdata;

U8  count;

U8 flag;

U8 jishi_flag = 0,count_up = 0;

unsigned char count=0,ss=0,sg=0,fs=0,fg=0,ms=0,mg=0,m=0,f=0,s=0,yue=1,ri=1;

unsigned char str1[]={"温度:00 "},str2[2],str3[]={"湿度:00%"},str4[2],dat=1,cal[10]={"0001-01-01"};

#define uchar unsigned char

#define uint  unsigned int

//DS1302引脚定义

sbit RST=P1^0;

sbit IO=P1^1;

sbit SCK=P1^2;

//DS1302地址定义

#define ds1302_sec_add   0x80  //秒数据地址

#define ds1302_min_add   0x82  //分数据地址

#define ds1302_hr_add   0x84  //时数据地址

#define ds1302_date_add   0x86  //日数据地址

#define ds1302_month_add  0x88  //月数据地址

#define ds1302_day_add   0x8a  //星期数据地址

#define ds1302_year_add   0x8c  //年数据地址

#define ds1302_control_add  0x8e  //控制数据地址

#define ds1302_charger_add  0x90      

#define ds1302_clkburst_add  0xbe

//初始时间定义

uchar time_buf[8] = {0x20,0x16,0x12,0x31,0x22,0x16,0x00,0x06};

void Delay18ms()  //@11.0592MHz

{

unsigned char i, j, k;

_nop_();

_nop_();

i = 1;

j = 194;

k = 159;

do

{

  do

  {

   while (--k);

  } while (--j);

} while (--i);

}


void Delay10us()  //@11.0592MHz

{

unsigned char i;

_nop_();

_nop_();

_nop_();

i = 24;

while (--i);

}

//DS1302初始化函数

void ds1302_init(void)

{

RST=0;   //RST脚置低

SCK=0;   //SCK脚置低

}

//向DS1302写入一字节数据

void ds1302_write_byte(uchar addr, uchar d)

{

uchar i;

RST=1;     //启动DS1302总线

//写入目标地址:addr

addr = addr & 0xFE;   //最低位置零,寄存器0位为0时写,为1时读

for (i = 0; i < 8; i ++) {

  if (addr & 0x01) {

   IO=1;

   }

  else {

   IO=0;

   }

  SCK=1;      //产生时钟

  SCK=0;

  addr = addr >> 1;

  }

//写入数据:d

for (i = 0; i < 8; i ++) {

  if (d & 0x01) {

   IO=1;

   }

  else {

   IO=0;

   }

  SCK=1;    //产生时钟

  SCK=0;

  d = d >> 1;

  }

RST=0;  //停止DS1302总线

}

//从DS1302读出一字节数据

uchar ds1302_read_byte(uchar addr) {

uchar i,temp;

RST=1;     //启动DS1302总线

//写入目标地址:addr

addr = addr | 0x01;    //最低位置高,寄存器0位为0时写,为1时读

for (i = 0; i < 8; i ++) {

  if (addr & 0x01) {

   IO=1;

   _nop_();

   _nop_();

   }

  else {

   IO=0;

   _nop_();

   _nop_();

   }

  SCK=1;

  SCK=0;

  addr = addr >> 1;

  }

//输出数据:temp

for (i = 0; i < 8; i ++) {

  temp = temp >> 1;

  if (IO) {

   temp |= 0x80;

   }

  else {

   temp &= 0x7F;

   }

  SCK=1;

  _nop_();

  _nop_();

  SCK=0;

  _nop_();

  _nop_();

  }

RST=0;     //停止DS1302总线

_nop_();

_nop_();

return temp;

}

//向DS302写入时钟数据

void ds1302_write_time(void)

{

ds1302_write_byte(ds1302_control_add,0x00);   //关闭写保护

ds1302_write_byte(ds1302_sec_add,0x80);    //暂停时钟

//ds1302_write_byte(ds1302_charger_add,0xa9);     //涓流充电

ds1302_write_byte(ds1302_year_add,time_buf[1]);  //年

ds1302_write_byte(ds1302_month_add,time_buf[2]); //月

ds1302_write_byte(ds1302_date_add,time_buf[3]);  //日

ds1302_write_byte(ds1302_hr_add,time_buf[4]);  //时

ds1302_write_byte(ds1302_min_add,time_buf[5]);  //分

ds1302_write_byte(ds1302_sec_add,time_buf[6]);  //秒

ds1302_write_byte(ds1302_day_add,time_buf[7]);  //周

ds1302_write_byte(0xc0,0xaa);

ds1302_write_byte(ds1302_control_add,0x80);   //打开写保护     

}

//从DS302读出时钟数据

void ds1302_read_time(void)  

{

time_buf[1]=ds1302_read_byte(ds1302_year_add);  //年

time_buf[2]=ds1302_read_byte(ds1302_month_add);  //月

time_buf[3]=ds1302_read_byte(ds1302_date_add);  //日

time_buf[4]=ds1302_read_byte(ds1302_hr_add);  //时

time_buf[5]=(ds1302_read_byte(ds1302_min_add));  //分

time_buf[6]=(ds1302_read_byte(ds1302_sec_add))&0x3f;//秒,屏蔽秒的第7位,避免超出59

time_buf[7]=ds1302_read_byte(ds1302_day_add);  //周  

}




        void  COM(void)

      {

     

         U8 i;

         

       for(i=0;i<8;i++)   

     {

  

         U8FLAG=2;

     while((!P2_0)&&U8FLAG++);

   Delay10us();

      Delay10us();

   Delay10us();

     U8temp=0;

      if(P2_0)U8temp=1;

      U8FLAG=2;

   while((P2_0)&&U8FLAG++);

     //超时则跳出for循环   

      if(U8FLAG==1)break;

     //判断数据位是0还是1  

        

  // 如果高电平高过预定0高电平值则数据位为 1

      

     U8comdata<<=1;

        U8comdata|=U8temp;        //0

      }//rof

   

}

//--------------------------------

//-----湿度读取子程序 ------------

//--------------------------------

//----以下变量均为全局变量--------

//----温度高8位== U8T_data_H------

//----温度低8位== U8T_data_L------

//----湿度高8位== U8RH_data_H-----

//----湿度低8位== U8RH_data_L-----

//----校验 8位 == U8checkdata-----

//----调用相关子程序如下----------

//---- Delay();, Delay_10us();,COM();

//--------------------------------

void RH(void)

{

   //主机拉低18ms

       P2_0=0;

    Delay18ms();

    P2_0=1;

  //总线由上拉电阻拉高 主机延时20us

    Delay10us();

    Delay10us();

    Delay10us();

    Delay10us();

  //主机设为输入 判断从机响应信号

    P2_0=1;

  //判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行   

    if(!P2_0)   //T !   

    {

    U8FLAG=2;

  //判断从机是否发出 80us 的低电平响应信号是否结束  

    while((!P2_0)&&U8FLAG++);

    U8FLAG=2;

  //判断从机是否发出 80us 的高电平,如发出则进入数据接收状态

    while((P2_0)&&U8FLAG++);

  //数据接收状态   

    COM();

    U8RH_data_H=U8comdata;

    COM();

    U8RH_data_L=U8comdata;

    COM();

    U8T_data_H=U8comdata;

    COM();

    U8T_data_L=U8comdata;

    COM();

    U8checkdata=U8comdata;

    P2_0=1;

    }//fi

}



unsigned char code user16x16[]={ //笑脸图片

0x0F,0xF0,0x10,0x08,0x20,0x04,0x40,0x02,0x9C,0x39,0xBE,0x7D,0x80,0x01,0x80,0x01,

0x80,0x01,0x88,0x11,0x84,0x21,0x43,0xC2,0x20,0x04,0x10,0x08,0x0F,0xF0,0x00,0x00,

};

unsigned char code pic1[]=      // 图片代码

{

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

[1] [2] [3]
关键字:LCD12864  万年历  片机程序 引用地址:LCD12864万年历单片机程序+实物制作+Proteus仿真

上一篇:NRF24L01的使用方法和简单操作介绍(附参考程序)
下一篇:基于51单片机的电子音乐盒的课程设计

推荐阅读最新更新时间:2024-11-05 19:31

LCD12864液晶基本程序
#include reg52.h #include intrins.h #define uchar unsingned char #define uint unsigned int sbit rs=P2^4; sbit rw=P2^5; sbit e=P2^6; sbit psb=P2^7; uchar table ="20100419"; write_12864com(uchar com); write_12864dat(uchar dat); void initinal(void); void display1(void); void display2(void); void display3(void); void dela
[单片机]
基于STC89S52单片的电子万年历系统
目前基于单片机控制技术的微电子技术得到空前的发展。广泛应用于各种控制领域、智能领域、仿真领域。控制领域里的定时计时控制、温度控制,在生产、生活等领域已经得到了广泛的应用。液晶显示模块在各种测量仪器、测量装置、显示仪表等日用电子产品中的应用越来越广泛,并且对器件的测量精度和显示精度的要求也越来越高,尤其是对时间的测量不但要求准确,而且需要读取数值更直观更方便。本文以AT89S52单片机为主控芯片,以DALLAS公司推出的实时时钟芯片DS1302为时钟控制芯片,以1602液晶显示模块为显示器,进行电子万年历系统的设计。本系统可同屏显示年、月、日、星期、温度以及闹钟设置等功能。 1 系统总体设计 本系统以STC89S52单片机为核心,
[单片机]
基于STC89S52单片<font color='red'>机</font>的电子<font color='red'>万年历</font>系统
MSP430G2553开发板万年历加温湿度
材料:MSP430G2553开发板一块、DS1302时钟芯片、CR1220纽扣电池、CR1220纽扣电池、32.768Khz晶振、小纽扣按键三个、DHT11温湿度传感器、跳帽三个、LCD12864(自带电位器,3.3v供电需要调节对比度) 一、DS1302 DS1302 是美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周、时、分、秒进行计时。DS1302采用三线SPI接口与单片机通讯,在进行一次读写操作时,我们要先发送控制字(要进行得操作和相应寄存器地址),然后对该寄存器写入数据或者读出数据。 DS1302读时隙: 控制字在串行时钟SCLK每个上升沿将一位数据读入,将一个
[单片机]
MSP430G2553开发板<font color='red'>万年历</font>加温湿度
STM8 SPI驱动LCD12864
系统功能 利用STM8内部的SPI通讯总线来驱动LCD12864。    硬件设计 LCD12864电路原理图 软件设计 /********************************************************************* 目标系统: 基于STM8单片机 应用软件: Cosmic CxSTM8 *********************************************************************/ #include stdarg.h #include ws_spi.h void st7920LcdInit(void) {
[单片机]
STM8 SPI驱动<font color='red'>LCD12864</font>
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件
更多每日新闻

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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