单片机+lcd12864液晶万年历C程序

发布者:iota19最新更新时间:2015-06-26 来源: 51hei关键字:单片机  lcd12864  液晶万年历 手机看文章 扫描二维码
随时随地手机看文章
这个是主界面


这个是主菜单界面


这个是设置时间的子界面


这个是设置日期


设置背景光


这是设置了按键音和闹铃以后,主界面出现状态标志
[page]

闹铃的界面,喇叭出现铃声。


生日倒计时提醒功能。

 

全部完整的源代码下载:http://www.51hei.com/bbs/dpj-20391-1.html

下面是12864.h文件:/*------------------------------------
名称:LCD9012驱动模块
编写:YuMin_Dong
时间:2013.01.21
------------------------------------*/

#ifndef _LCD12864_H_
#define _LCD12864_H_

/*------------------------------------
   I/O位定义
------------------------------------*/
sbit RS=P2^0;
sbit RW=P2^1;
sbit EN=P2^2;

/*------------------------------------
   宏定义
------------------------------------*/
#define DataPort P1
#define RS_CLR RS=0
#define RS_SET RS=1
#define RW_CLR RW=0
#define RW_SET RW=1
#define EN_CLR EN=0
#define EN_SET EN=1
//#define PSB_CLR PSB=0
//#define PSB_SET PSB=1
//#define RST_CLR RST=0
//#define RST_SET RST=1

#define MENU_NUM 7  //表示有主菜单有7个选项

UINT8 guide,guide_old=1; //主菜单导航箭头定义,guide_old在有按键前等于guide,有修改后guide_old变化用来作为刷新显示的条件

/*------------------------------------
   主菜单内容
------------------------------------*/
code UINT8 *MainMenu[]={"  1.时间设置","  2.日期设置","  3.闹钟功能","  4.背光开关","  5.键音开关","  6.生日提醒","  7.返回"};

/*------------------------------------
   判忙函数
------------------------------------*/
void LCD_CheckBusy()
{
RS_CLR;
RW_SET;
EN_SET;
DataPort=0xff;
while(DataPort&0x80)
;
EN_CLR;
}

/*------------------------------------
   写命令函数
------------------------------------*/
void LCD_WriteCommand(UINT8 byte)
{
LCD_CheckBusy();
RS_CLR;
RW_CLR;
EN_SET;
DataPort=byte;
DelayUs2x(5);
EN_CLR;
DelayUs2x(5);
}

/*------------------------------------
   写数据函数 
------------------------------------*/
void LCD_WriteData(UINT8 byte)
{
LCD_CheckBusy();
RS_SET;
RW_CLR;
EN_SET;
DataPort=byte;
DelayUs2x(5);
EN_CLR;
DelayUs2x(5);
}

/*------------------------------------
   LCD初始化
------------------------------------*/
void LCD_Init()
{
//DelayMs(30);
//PSB_SET; //设置并口模式
//DelayMs(1);
//RST_CLR;
//DelayMs(1);
//RST_SET;
//DelayMs(10);
LCD_WriteCommand(0x30); //选择基础指令集
DelayUs2x(50);   //延时大于100us
//LCD_WriteCommand(0x30); //
//DelayUs2x(20);   //延时大于37us
LCD_WriteCommand(0x0c); //开始显示,无反白,无游标
DelayUs2x(50);   //延时大于100us
LCD_WriteCommand(0x01); //清屏
DelayMs(5);   
//LCD_WriteCommand(0x06); //读取或写入时,游标移动方向,设定从右向左
//DelayUs2x(50);   //延时大于100us
}

/*------------------------------------
   设置坐标
------------------------------------*/
/*void LCD_SetXY(UINT8 x,UINT8 y)
{
 switch(y)
 {
 case 0: LCD_WriteCommand(0x80+x);
   break;
 case 1: LCD_WriteCommand(0x90+x);
   break;
 case 2: LCD_WriteCommand(0x88+x);
   break;
 case 3: LCD_WriteCommand(0x98+x);
   break;
 default:break;
 }
}*/

/*------------------------------------
   写字符串
------------------------------------*/
void LCD_SendString(UINT8 *s)
{
//LCD_SetXY(x,y);
 while(*s&&s)
 {
 LCD_WriteData(*s);
 s++;
 }
}

/*------------------------------------
   设置CGRAM
------------------------------------*/
void LCD_SetCGRAM(UINT8 n,UINT8 *pic) //第n个自定义字符
{
UINT8 i;
LCD_WriteCommand(0x30);
LCD_WriteCommand(0x40+n*16);
 for(i=0;i<16;i++)
 {
 LCD_WriteData(*(pic+2*i));
 LCD_WriteData(*(pic+2*i+1));
 }
}

/*------------------------------------
   显示CGRAM
------------------------------------*/
void LCD_DisplayCGRAM(UINT8 n)
{
//LCD_WriteCommand(0x30);
LCD_WriteData(0x00);
LCD_WriteData(0x02*n);
}

/*------------------------------------
   GDRAM绘16x16图
------------------------------------
void LCD_SendImg16x16(UINT8 x,UINT8 y,UINT8 *img,bit g)  //(x,y)坐标 img指向16x16字模数组,g为是否反白
{
UINT8 i,j,base_x;
LCD_WriteCommand(0x34);
LCD_WriteCommand(0x36);
 if(y==0||y==1)
 {
 base_x=0x80;
 y=y*16;
 }
 else 
 {
 base_x=0x88;
 y=(y-2)*16;
 }
 for(i=0;i<16;i++) 
 {               
  LCD_WriteCommand(0x80+y+i); 
  LCD_WriteCommand(base_x+x);  
  for(j=0;j<2;j++)  
  {
   if(g)
    LCD_WriteData(~(*img++));
   else
    LCD_WriteData(*img++);
  }
 } 
LCD_WriteCommand(0x36);
//LCD_WriteCommand(0x30);
}*/


/*------------------------------------
   GDRAM绘16x32图
------------------------------------*/
void LCD_SendImg16x32(UINT8 x,UINT8 y,UINT8 *img,bit g)//x标志表示是否反白。
{
UINT8 i,j,base_x;
LCD_WriteCommand(0x34);
LCD_WriteCommand(0x36);
switch(y)
{
case 0: base_x=0x80;break;
case 1: base_x=0x90;break;
case 2: base_x=0x88;break;
default:return;
}
 if(y==0||y==2)
 {
  for(i=0;i<32;i++)
  {
  LCD_WriteCommand(0x80+i);
  LCD_WriteCommand(base_x+x);
   for(j=0;j<2;j++)
   {
   if(!g)
   LCD_WriteData(*img++);
   else LCD_WriteData(~(*img++));
   }
  }
 }
 if(y==1)
 {
  for(i=0;i<16;i++)
  {
  LCD_WriteCommand(0x90+i);
  LCD_WriteCommand(base_x+x);
   for(j=0;j<2;j++)
   {
   if(g)
   LCD_WriteData(~(*img++));
   else
   LCD_WriteData(*img++);
   }
  }
  for(i=0;i<16;i++)
  {
  LCD_WriteCommand(0x80+i);
  LCD_WriteCommand(base_x+x+8);
   for(j=0;j<2;j++)
   {
   if(g)
   LCD_WriteData(~(*img++));
   else
   LCD_WriteData(*img++);
   }
  }
 }
LCD_WriteCommand(0x36);
//LCD_WriteCommand(0x30);
}

/*------------------------------------
   GDRAM绘制128x64
------------------------------------*/
void LCD_SendImg128x64(UINT8 *img)
{
UINT8 i,j;
//LCD_WriteCommand(0x30);
LCD_WriteCommand(0x36);
 for(i=0;i<32;i++)
 {
 LCD_WriteCommand(0x80+i);
 LCD_WriteCommand(0x80);
  for(j=0;j<16;j++)
  {
  LCD_WriteData(*img++);
  }
 }
 for(i=0;i<32;i++)
 {
 LCD_WriteCommand(0x80+i);
 LCD_WriteCommand(0x88);
  for(j=0;j<16;j++)
  {
  LCD_WriteData(*img++);
  }
 }
LCD_WriteCommand(0x36);
}

/*------------------------------------
   清除GDRAM
------------------------------------*/
void LCD_ClearGDRAM()
{
UINT8 i,j;
LCD_WriteCommand(0x30);   //一般指令
LCD_WriteCommand(0x0C);   //开启显示
LCD_WriteCommand(0x06);   //AC++
LCD_WriteCommand(0x01);   //清DDRAM
LCD_WriteCommand(0x36);   //开启绘图
//LCD_InitGDRAM();
LCD_WriteCommand(0x36);   //显示绘图
 for(i=0;i<32;i++)   //在DGRAM里写满0,表示清除GDRAM
 {
 LCD_WriteCommand(0x80+i);
 LCD_WriteCommand(0x80);
  for(j=0;j<16;j++)
  {
  LCD_WriteData(0x00);
  LCD_WriteData(0x00);
  }
 }
LCD_WriteCommand(0x36);  //绘图完毕,开启显示
}

/*------------------------------------
   清除1,2,3行屏
------------------------------------*/
void LCD_ClearScreen123()
{
LCD_WriteCommand(0x30);
 LCD_WriteCommand(0x90);
 LCD_SendString("                ");
 LCD_WriteCommand(0x88);
 LCD_SendString("                ");
 LCD_WriteCommand(0x98);
 LCD_SendString("                ");
}

/*------------------------------------
   菜单选择更新
------------------------------------*/
void LCD_RefreshMenu()
{
LCD_ClearScreen123();
 LCD_WriteCommand(0x90);
 if(0+(guide/3)*3  LCD_SendString(*(MainMenu+(guide/3)*3));
 
 LCD_WriteCommand(0x88);
 if(1+(guide/3)*3  LCD_SendString(*(MainMenu+(guide/3)*3+1));
 
 LCD_WriteCommand(0x98);
 if(2+(guide/3)*3  LCD_SendString(*(MainMenu+(guide/3)*3+2));
 
 switch(guide%3)
 {
 case 0: LCD_WriteCommand(0x90);break;
 case 1: LCD_WriteCommand(0x88);break;
 case 2: LCD_WriteCommand(0x98);break;
 default:return ;
 }
 LCD_DisplayCGRAM(1);
}

#endif

关键字:单片机  lcd12864  液晶万年历 引用地址:单片机+lcd12864液晶万年历C程序

上一篇:51单片机驱动ds1302程序(12864液晶显示)
下一篇:51单片机驱动1602液晶(4线串行)

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

爱特梅尔在IIC China 2011上展示MCU和触摸解决方案
触摸及微控制器解决方案的领导厂商爱特梅尔公司(Atmel® Corporation) 将在2月24至26日于深圳会展中心2号展馆举办的IIC China 2011展会中参展,展台号为 J11。 爱特梅尔凭借最新技术和专业能力创造无限的可能性,将设计理念变为现实。爱特梅尔将在展会上演示最新技术和产品,参观者可与公司管理人员和技术专家会面,深入讨论爱特梅尔的技术和功能,演示包括: • 适用于现今平板电脑和智能手机的电容式触摸解决方案 - QTouch 套件 • 爱特梅尔 AVR® 8位 及 32位 微控制器 - AVR UC3C;AVR 高质音频参考设计;Atmel picoPower®;Atmel AV
[半导体设计/制造]
AVR相比51系列单片机的优势特征
单片机又称单片微控制器,它是把一个计算机系统集成到一个芯片上,概括的讲:一块芯片就成了一台计算机。单片机技术是计算机技术的一个分支,是简易机器人的核心元件。 1997年,由ATMEL公司挪威设计中心的A先生与V先生利用ATMEL公司的Flash新技术, 共同研发出RISC精简指令集的高速8位单片机,简称AVR。 AVR单片机的优势特征 单片机已广泛地应用于军事、工业、家用电器、智能玩具、便携式智能仪表和机器人制作等领域,使产品功能、精度和质量大幅度提升,且电路简单,故障率低,可靠性高,成本低廉。单片机种类很多,在简易机器人制作和创新中,为什么选用AVR单片机呢? 一、简便易学
[单片机]
基于PIC单片机的智能化逆变电源控制系统
  随着科学技术的进步,电源质量越来越成为各种电气设备正常和良好工作的基础。电源技术领域的一个持续的研究课题即是研究作为电子信息产业命脉的电源的可靠性和稳定性。   而逆变器作为电源的核心部分,其调制技术很大程度上决定了电源输出电压的质量。目前最常用的调制技术是正弦脉宽调制(SPWM)。随着 单片机 的出现及其广泛应用,智能化控制方法已经逐渐替代传统的分立元件电路产生方法或是专用芯片产生方法。智能化 逆变电源 的优势在于它不仅能实现调制信号的输出,还为系统数据参数的监控、处理及显示提供接口。同时它与现代计算机技术更好地结合产生了故障自诊断和自我保护功能,可提高系统的稳定性。   在充分考虑工业控制成本及稳定性要求的前提下,本设计采
[电源管理]
基于PIC<font color='red'>单片机</font>的智能化逆变电源控制系统
基于AT89C51型单片机的号音自动播放器设计
1 引言 机关、院校日常作息需要计时和号音提示,笔者利用AT89C51型单片机和LM386型音频功率放大器构成了自动计时和号音播放器,成本低,效果好,值得推广。 2 AT89C51的主要特性和引脚功能 AT89C51是带4K字节闪烁可编程可擦除只读存储器(EPEROM)的低电压、高性能CMOS 8位微处理器(俗称单片机)。该单片机与工业标准的MCS-51型机的指令集和输出引脚兼容。AT89C51将多功能8位CPU和闪烁存储器组合在单个芯片中,为很多嵌入式控制提供了灵活性高且价格低廉的方案。 AT89C51的主要特性如下: 寿命达1000写/擦循环; 数据保留时间:10年; 全静态工作:0Hz-24MHz; 三
[应用]
基于C8051f060单片机的数据采集系统
随着测控系统自动化、智能化的发展,要求传感器及仪表的准确度更高,可靠性更强,并具有一定的数据处理能力及自检、自校验、自补偿等功能。传统测控方式已不能满足这些要求。近几年来,由微计算机、传感器和通讯等技术结合而产生的功能强大的传感器数据采集系统可以准确、及时地获得并处理信息,提高了收集环境信息的有效性和速度。智能化、数字化数据采集系统己成为当今科技界研究的热门课题。 1 总体方案设计 该系统是以C8051f060单片机为核心,对数据进行放大滤波采集,经过单片机内部A/D转换,最后将数据存入FLASH, 同时可以通过串口将数据传送到PC机上显示。采集系统硬件框图如图1所示。 1.1 信号放大电路设计 本系统所用Ad62
[单片机]
基于C8051f060<font color='red'>单片机</font>的数据采集系统
MCS-51单片机内部结构——CPU结构 单片机原理学习笔记(二)
CPU结构 8051内部CPU是一个字长为二进制8位的中央处理单元,也就是说它对数据的处理是按字节为单位进行的。与微型计算机CPU类似,8051内部CPU也是由算术逻辑部件(ALU)、控制器(定时控制部件等)和专用寄存器组三部分电路构成。 1.算术逻辑部件 8051的算术逻辑部件ALU是一个性能极强的运算器,既可以进行加、减、乘、除四则运算,还可以进行与、或、非、异或等逻辑运算,还具有数据传送、移位、判断和程序转移等功能。 8051算术逻辑部件ALU由一个加法器、两个8位暂存器(TMP1和TMP2)和一个性能卓越的布尔处理器组成。虽然TMP1和TMP2对用户并不开放,但可用来为加法器和布尔处理器暂存两个8位二进制操
[单片机]
MCS-51<font color='red'>单片机</font>内部结构——CPU结构 <font color='red'>单片机</font>原理学习笔记(二)
51单片机C51毫秒级(ms)精确延时
如下程序能实现ms毫秒级的比较精确的延时 void Delayms(unsigned int n) { unsigned int i,j; for(j=n;j 0;j--) for(i=112;i 0;i--); } 用keil可以看出这个延时的时间,我们先延时1ms(Delayms(1))。 进入Delayms前,sec=0.00042209s 延时后,sec=0.00142253s 可以知道Delayms(1)实际延时0.00142253s—0.00042209s=0.00100044s≈1ms 同样如果想延时15ms的话,用Delayms(15),实际延时0.01480903s≈15m
[单片机]
瑞萨为下一代汽车架构推28纳米MCU 内置自测试功能增强
据外媒报道,当地时间2月19日,日本瑞萨电子株式会社(Renesas Electronics Corporation)宣布研发,并成功运行验证了一款汽车测试芯片,可实现采用28纳米(nm)低功耗工艺的下一代汽车控制闪存微控制器(MCU)。瑞萨电子是全球领先的先进半导体解决方案供应商。 该MCU有4个600兆赫(MHz)CPU(中央处理器),具备锁步机制和16MB闪存容量以及: 1、支持MCU虚拟化的虚拟化辅助功能:该技术允许多个软件组件在一个MCU上运行,互不干扰,从而满足道路车辆ISO 26262功能安全标准规定的最高汽车安全完整性级别ASIL D的要求。 2、内置的自测试功能(BIST)得以增强,可用于MCU自诊断故障检测,这
[汽车电子]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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