小白 第一次跟新博客

基于51单片机和LCD1602的万年历程序

可实现走时和调时功能 有简单的1602菜单制作

欢迎大家交流

LCD1602和51单片机的连接方法

RS = P3^5; //数据/命令选择端(H/L)
RW = P3^4; //数/写选择端(H/L)
EN = P3^3; //使能信号
P0 //LCD1602的数据口D0-D7

#include<reg52.h>

typedef unsigned char uChar8;
typedef unsigned int uInt16;

uChar8 TAB1[]="^_^2016-12-27^_^";
uChar8 TAB2[]=" 23:59:45 ";
uChar8 year=2016,month=12,day=27,hour=23,minute=59,second=45,count;

sbit RS = P3^5; //数据/命令选择端(H/L)
sbit RW = P3^4; //数/写选择端(H/L)
sbit EN = P3^3; //使能信号
sbit SEG_SELECT = P1^7;
sbit BIT_SELECT = P1^6;

sbit LED1 = P2^0;
sbit Key2 = P3^6;
sbit Key1 = P3^7;
sbit Key3 = P3^0;

void DelayMS(uInt16 ValMS)
{
uInt16 uiVal,ujVal;
for(uiVal = 0; uiVal < ValMS; uiVal++)
for(ujVal = 0; ujVal < 113; ujVal++);
}

void DectectBusyBit(void)
{
P0 = 0xff; // 读状态值时,先赋高电平
RS = 0;
RW = 1;
EN = 1;
DelayMS(1);
while(P0 & 0x80); // 若LCD忙,停止到这里,否则走起
EN = 0; // 之后将EN初始化为低电平
}

void WrComLCD(uChar8 ComVal)
{
DectectBusyBit();
RS = 0;
RW = 0;
EN = 1;
P0 = ComVal;
DelayMS(1);
EN = 0;
}

void WrDatLCD(uChar8 DatVal)
{
DectectBusyBit();
RS = 1;
RW = 0;
EN = 1;
P0 = DatVal;
DelayMS(1);
EN = 0;
}

void LCD_Init(void)
{
uChar8 ucVal,i;

WrComLCD(0x38); // 16*2行显示、5*7点阵、8位数据接口
WrComLCD(0x38);
WrComLCD(0x38); // 重新设置一遍
WrComLCD(0x01); // 显示清屏
WrComLCD(0x06); // 光标自增、画面不动
DelayMS(1); // 稍作延时
WrComLCD(0x0c); // 开显示、关光标并不闪烁

for(i=0;i<16;i++)
{
WrComLCD(0x80+i);
WrDatLCD(TAB1[ucVal+i]);

WrComLCD(0xC0+i);
WrDatLCD(TAB2[ucVal+i]);
}
}

void Timer_Init()
{
TMOD=0x01;
TH0=0xDC;
TL0=0x00;
EA=1;
ET0=1;
TR0=1;
}

void DisplayYear()
{
WrComLCD(0x80+5);
WrDatLCD(0x30+year/10);
WrComLCD(0x80+6);
WrDatLCD(0x30+year%10);
}

void DisplayMonth()
{
WrComLCD(0x80+8);
WrDatLCD(0x30+month/10);
WrComLCD(0x80+9);
WrDatLCD(0x30+month%10);
}

void DisplayDay()
{
WrComLCD(0x80+11);
WrDatLCD(0x30+day/10);
WrComLCD(0x80+12);
WrDatLCD(0x30+day%10);
}

void DisplayHour()
{
WrComLCD(0xc0+4);
WrDatLCD(0x30+hour/10);
WrComLCD(0xc0+5);
WrDatLCD(0x30+hour%10);
}

void DisplayMinute()
{
WrComLCD(0xc0+7);
WrDatLCD(0x30+minute/10);
WrComLCD(0xc0+8);
WrDatLCD(0x30+minute%10);
}

void DisplaySecond()
{
WrComLCD(0xc0+10);
WrDatLCD(0x30+second/10);
WrComLCD(0xc0+11);
WrDatLCD(0x30+second%10);
}

void CloseDigTube()
{
BIT_SELECT=1;
P0=0xff;
BIT_SELECT=0;
SEG_SELECT=1;
P0=0x00;
SEG_SELECT=0;

}

void Keyscan()
{
static uChar8 i=0,j=0; //static静态变量 每按下一次Key1(停止计时键)i++; 每按下一次Key2(调位键)j++;
if(Key1==0) //每按下一次Key1(停止计时键)i++;
{
DelayMS(5); //消抖
if(Key1==0)
i++;
}
if(i%2==1) //判断i的奇偶性决定TR的状态
{
LED1=0;
TR0=0;
}
if(i%2==0)
{
LED1=1;
TR0=1;
WrComLCD(0xc0+5); //确定位置 第二行第五位
WrComLCD(0xc0+8); //确定位置 第二行第八位
WrComLCD(0xc0+11); //确定位置 第二行第十一位
WrComLCD(0x0c); //光标不闪烁
}
if(Key2==0) //每按下一次Key2(调位键)j++;
{
DelayMS(5); //消抖
if(Key2==0)
j++;
}
if(j%7==1)
{
WrComLCD(0x0f); //光标闪烁
WrComLCD(0xc0+11); //哪一位光标闪烁
if(Key3==0)
{
second++;
if(second==60)
second=0;
DisplaySecond();
}
}
if(j%7==2)
{
WrComLCD(0x0f); //光标闪烁
WrComLCD(0xc0+8); //哪一位光标闪烁
if(Key3==0)
{
minute++;
if(minute==60)
minute=0;
DisplayMinute();
}
}
if(j%7==3)
{
WrComLCD(0x0f); //光标闪烁
WrComLCD(0xc0+5); //哪一位光标闪烁
if(Key3==0)
DelayMS(5);
if(Key3==0)
{
hour++;
if(hour==24)
hour=0;
DisplayHour();
}
}
if(j%7==4)
{
WrComLCD(0x0f); //光标闪烁
WrComLCD(0x80+12); //哪一位光标闪烁
if(Key3==0)
DelayMS(5);
if(Key3==0)
{
day++;
if(day==31)
day=1;
DisplayDay();
}
}
if(j%7==5)
{
WrComLCD(0x0f); //光标闪烁
WrComLCD(0x80+9); //哪一位光标闪烁
if(Key3==0)
DelayMS(5);
if(Key3==0)
{
month++;
if(month==12)
month=1;
DisplayMonth();
}
}
if(j%7==6)
{
WrComLCD(0x0f); //光标闪烁
WrComLCD(0x80+6); //哪一位光标闪烁
if(Key3==0)
DelayMS(5);
if(Key3==0)
{
year++;
if(year==99)
year=0;
DisplayYear();
}
}
if(j%7==0)
{
WrComLCD(0x0c); //光标不闪烁
}

}

void main(void)
{
LCD_Init();
Timer_Init();
CloseDigTube();
DelayMS(5);
while(1)
{
Keyscan(); //按键扫描 菜单制作
}

}

void Timer0(void) interrupt 1
{

TH0=0xDC;
TL0=0x00;
count++;
if(count==100)
{
count=0;
second++;

if(second==60)
{

second=0;
minute++;

if(minute==60)
{

minute=0;
hour++;
if(hour==24)
{
hour=0;
}
DisplayHour();
}
DisplayMinute();
}
DisplaySecond();
}

}

基于51单片机个LCD1602的万年历程序的更多相关文章

  1. 基于51单片机的CAN通讯协议C语言程序

      //-----------------------函数声明,变量定义-------------------------------------------------------- #includ ...

  2. ET 与RETI 基于51单片机中断跳出指令“RETI”浅议

    最近在基于51单片机编程的过程中出现了个很奇怪的问题“程序执行中在寄存器EA=1,ET0=1,TR0=1条件下,单TF0=1时并没有执行中断”.在有过单片机中断编程经历者都知道当EA=1,ET0=1的 ...

  3. 基于51单片机IIC通信的PCF8591学习笔记

    引言 PCF8591 是单电源,低功耗8 位CMOS 数据采集器件,具有4 个模拟输入.一个输出和一个串行I2C 总线接口.3 个地址引脚A0.A1 和A2 用于编程硬件地址,允许将最多8 个器件连接 ...

  4. ESP8266 AT指令开发(基于STC89C52单片机): 测试下诱人的程序(51单片机,8266,MQTT远程通信控制)

    前言 实现的功能,APP通过SmartConfig给Wi-Fi模块配网并绑定设备,然后通过MQTT远程控制开发板的继电器, 简而言之: 51单片机+ESP8266用AT指令实现实现MQTT,(连接的本 ...

  5. 基于51单片机+DAC0832的信号发生器

    最近帮别人设计一个毕业设计,做一个多种信号发生器(四种波形:方波.三角波.锯齿波.梯形波),现在贴上来给大家参考,如果有错误的地方,望指出~ 下面先贴上仿真的电路图(仿真的软件是Protuse,上传一 ...

  6. 基于51单片机IIC通信的AT24C02学习笔记

    引言 最近在学习几种串行通信协议,感觉收获很多,这篇文章是学习IIC总线协议的第一篇文章,以后还会再写一篇关于PCF8591 IIC通信的ADDA转换芯片的文章. 关于IIC总线 IIC 即Inter ...

  7. 如何编写51单片机超声波测距SR04_lcd1602显示程序

    超声波测距在我们日常生活中很常见,比如说车在倒退的时候,为了防止车撞到障碍物,会在车尾加上一个超声波测距模块.在智能车比赛中,也有超声波测距模块等等.可见超声波非常的重要,接下来,我们上代码研究一下如 ...

  8. 3.7 基于51单片机+MC20的路径显示【使用STC15W内核】

    需要准备的硬件 MC20开发板 1个 https://item.taobao.com/item.htm?id=562661881042 GSM/GPRS天线 1根 https://item.taoba ...

  9. [51单片机] SPI nRF24L01 无线简单程序 1

    main.c #include <reg51.h> #include <api.h> #define uchar unsigned char /**************** ...

随机推荐

  1. WebBrowser内嵌页面的跨域调用问题

    很早之前我写过一篇Blog:网页通过External接口与WebBrowser交互,文中的交互其实只介绍了JS调用C++的部分,而C++调用JS由于微软自己的例子太多,那篇文章就没介绍,不过我最近遇到 ...

  2. 2.11-2.12 HBase的数据迁移常见方式

    一.importtsv 把hdfs中数据抽取到HBase表中: 1.准备数据 ##student.tsv [root@hadoop-senior datas]# cat student.tsv 100 ...

  3. Unity2D研究院之自动生成动画、AnimationController、Prefab(一)

    http://www.xuanyusong.com/archives/3243 国庆了,回家了.时刻还是要吃一颗学习的心,在家了也要抽出时间好好学习一下.之前MOMO一直没研究过Unity2D,今天研 ...

  4. C++函数调用过程深入分析

    http://blog.csdn.net/dongtingzhizi/article/details/6680050 0. 引言 函数调用的过程实际上也就是一个中断的过程,那么C++中到底是怎样实现一 ...

  5. [Xcode 实际操作]一、博主领进门-(4)设置项目的属性

    目录:[Swift]Xcode实际操作 本文将演示如何设置项目的属性. 点击项目名称[DemoApp],打开项目信息面板. [Identity识别]设置区域 [Display Name]:DemoAp ...

  6. 覆盖equals方法时请遵守通用约定

    覆盖equals方法时请遵守通用约定   覆盖equals方法看起来很简单,但是有许多覆盖方式会导致错误,并且后果很严重.最容易避免这种类问题的方法就是不覆盖equals方法,在这种情况下,类的每个实 ...

  7. 区间质数查询 luoguP1865

    原题 https://www.luogu.org/problemnew/show/P1865 本来get到了一个很好的判断素数的方法 O(玄学常数)https://www.luogu.org/blog ...

  8. sql索引的作用

    转https://www.cnblogs.com/hyd1213126/p/5828937.html (一)深入浅出理解索引结构 实际上,您可以把索引理解为一种特殊的目录.微软的SQL SERVER提 ...

  9. Qt 进程和线程之二:启动线程

    Qt提供了对线程的支持,这包括一组与平台无关的线程类.一个线程安全的发送事件的方式,以及跨线程的信号槽的关联.这些使得可以很容易地开发可移植的多线程Qt应用程序,可以充分利用多处理器的机器.多线程编程 ...

  10. 532 K-diff Pairs in an Array 数组中差为K的数对

    详见:https://leetcode.com/problems/k-diff-pairs-in-an-array/description/ C++: class Solution { public: ...