求lm016l与ds1302 52 单片机实现时钟显示的程序

求lm016l与ds1302 52 单片机实现时钟显示的程序,第1张

#define LCM_RW P2^4 //定义引脚

#define LCM_RS P2^3

#define LCM_E P2^5

#define LCM_Data P0

#define Busy 0x80 //用于检测LCM状态字中的Busy标识

#include <reg52h>

void WriteDataLCM (unsigned char WDLCM);

void WriteCommandLCM (unsigned char WCLCM,BuysC);

void DisplayOneChar (unsigned char X, unsigned char Y, unsigned char DData);

void DisplayListChar (unsigned char X, unsigned char Y, unsigned char code DData);

unsigned char ReadDataLCM(void);

unsigned char ReadStatusLCM(void);

void pro_timedate(void);

bit leap_year(); //判断是否为闰年

unsigned char data year=11,month=5,date=22;//年、月、日、星期

unsigned char disbuf[16];

unsigned char data hour=23,min=59,sec=55,sec20=0; //时、分、秒、百分之一秒

unsigned char code email[] = {"YEA:MON:DAT:TIME"};

void updatetime (void);

void LCMInit (void);

void pro_display(void);

void Delay400Ms (void);

void Delay5Ms (void);

void main(void)

{

Delay400Ms(); //启动等待,等LCM讲入工作状态

LCMInit(); //LCM初始化

DisplayListChar(0, 1, email);

TMOD=0X01;

TH0=0X4C;

TL0=0X00;

TR0=1;

ET0=1;

EA=1;

while(1);

}

void pro_timedate()

{

sec++;

if(sec > 59)

{sec = 0;

min++;

if(min>59)

{min=0;

hour++;

if(hour>23)

{hour=0;

date++;

if (month==1||month==3||month==5||month==7||month==8||month==10||month==12)

if (date>31)

{date=1;month++;} //大月31 天

if (month==4||month==6||month==9||month==11)

if (date>30)

{date=1;month++;} //小月30 天

if (month==2)

{if( leap_year()) //闰年的条件

{if (date>29) {date=1;month++;}} //闰年2 月为29 天

else

{if (date>28) {date=1;month++;}} //平年2 月为28 天

}

if (month>12) {month=1;year++;}

if (year>99) year=0;

}

}

}

}

bit leap_year()

{

bit leap;

if((year%4==0&&year%100!=0)||year%400==0)//闰年的条件

leap=1;

else

leap=0;

return leap;

}

//Timer0 中断处理程序,秒的产生

void timer0() interrupt 1

{

TH0=0x4C; //Timer0 置10ms 定时初值dc00H(2^16=65536D,dc00H=56320D)

TL0=0x00; //定时时间=(65536-56320)(1/110592)12=10ms (f0=110592Mhz)

sec20++;

if(sec20 >= 20) //1 秒时间 (10010ms=1000ms=1s)

{ sec20=0;

updatetime ();

pro_timedate();

pro_display ();

if(sec&0x01)

disbuf[13]=' ';

else disbuf[13]=':';

}

}

void updatetime(void)

{ disbuf[0] ='2';

disbuf[1] ='0';

disbuf[2] =year/10+48;

disbuf[3] =year%10+48;

disbuf[4] =' ';

disbuf[5] =month/10+48;

disbuf[6] =month%10+48;

disbuf[7] ='';

disbuf[8] =date/10+48;

disbuf[9] =date%10+48;

disbuf[10] =' ';

disbuf[11]=hour/10+48;

disbuf[12]=hour%10+48;

//disbuf[13]=' ';

disbuf[14]=min/10+48;

disbuf[15]=min%10+48;

}

//显示处理程序

void pro_display()

{ unsigned char f;

for (f=0;f<=15;f++)

{DisplayOneChar( f, 0, disbuf[f]);}

}

//写数据

void WriteDataLCM(unsigned char WDLCM)

{

ReadStatusLCM(); //检测忙

//WDLCM = ((WDLCM&0x01)<<7)|((WDLCM&0x02)<<5)|((WDLCM&0x04)<<3)|((WDLCM&0x08)<<1)|((WDLCM&0x10)>>1)|((WDLCM&0x20)>>3)|((WDLCM&0x40)>>5)|((WDLCM&0x80)>>7);

LCM_Data = WDLCM;

LCM_RS = 1;

LCM_RW = 0;

LCM_E = 0;

LCM_E = 0; //延时

LCM_E = 1;

}

//写指令

void WriteCommandLCM(unsigned char WCLCM,BuysC) //BuysC为0时忽略忙检测

{

if (BuysC) ReadStatusLCM(); //根据需要检测忙

//WCLCM = ((WCLCM&0x01)<<7)|((WCLCM&0x02)<<5)|((WCLCM&0x04)<<3)|((WCLCM&0x08)<<1)|((WCLCM&0x10)>>1)|((WCLCM&0x20)>>3)|((WCLCM&0x40)>>5)|((WCLCM&0x80)>>7);

LCM_Data = WCLCM;

LCM_RS = 0;

LCM_RW = 0;

LCM_E = 0;

LCM_E = 0;

LCM_E = 1;

}

//读数据

unsigned char ReadDataLCM(void)

{

LCM_RS = 1;

LCM_RW = 1;

LCM_E = 0;

LCM_E = 0;

LCM_E = 1;

return(LCM_Data);

}

//读状态

unsigned char ReadStatusLCM(void)

{

LCM_Data = 0xFF;

LCM_RS = 0;

LCM_RW = 1;

LCM_E = 0;

LCM_E = 0;

LCM_E = 1;

while (LCM_Data & Busy); //检测忙信号

return(LCM_Data);

}

void LCMInit(void) //LCM初始化

{

LCM_Data = 0;

WriteCommandLCM(0x38,0);

1

//三次显示模式设置,不检测忙信号

Delay5Ms();

WriteCommandLCM(0x38,0);

Delay5Ms();

WriteCommandLCM(0x38,0);

Delay5Ms();

WriteCommandLCM(0x38,1); //显示模式设置,开始要求每次检测忙信号

WriteCommandLCM(0x08,1); //关闭显示

WriteCommandLCM(0x01,1); //显示清屏

WriteCommandLCM(0x06,1); // 显示光标移动设置

WriteCommandLCM(0x0C,1); // 显示开及光标设置

}

//按指定位置显示一个字符

void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)

{

Y &= 0x1;

X &= 0xF; //限制X不能大于15,Y不能大于1

if (Y) X |= 0x40; //当要显示第二行时地址码+0x40;

X |= 0x80; //算出指令码

WriteCommandLCM(X, 0); //这里不检测忙信号,发送地址码

WriteDataLCM(DData);

}

//按指定位置显示一串字符

void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code DData)

{

unsigned char ListLength;

ListLength = 0;

Y &= 0x1;

X &= 0xF; //限制X不能大于15,Y不能大于1

while (DData[ListLength]>0x20) //若到达字串尾则退出

{

if (X <= 0xF) //X坐标应小于0xF

{

DisplayOneChar(X, Y, DData[ListLength]); //显示单个字符

ListLength++;

X++;

}

}

}

//50ms延时

void Delay5Ms(void)

{

unsigned int TempCyc = 5552;

while(TempCyc--);

}

//400ms延时

void Delay400Ms(void)

{

unsigned char TempCycA = 5;

unsigned int TempCycB;

while(TempCycA--)

{

TempCycB=7269;

while(TempCycB--);

};

}

lcm也就是我们所说的液晶显示模块,主要是显示屏和驱动模块组成的,驱动模块是用来驱动与控制显示屏使之显示出所需的数据图形等,而显示屏就是实现数据图像的显示。所以要知道模块的原理主要就是了解驱动模块的原理。

1602A液晶屏驱动程序 晶 振 频 率:110592M/#include <reg51h>#define uchar unsigned char#define uint unsigned int sbit LCM_E=P3^5;//定义接口sbit LCM_RW=P3^6;sbit LCM_RS=P3^7; #define LCM_Data P1//数据接口 void LCM_WriteData(uchar WDLCM);void LCM_WriteCommand(uchar WCLCM,BuysC);uchar LCM_ReadData(void);uchar LCM_ReadStatus(void);void LCM_Init(void);void DisplayOneChar(uchar X, uchar Y, uchar DData);void DisplayListChar(uchar X, uchar Y, uchar code DData);void Delay5Ms(void);void Delay400Ms(void); uchar code uctech[] = {"1602A"};uchar code net[] = {">

手把手教你学单片机

出版社 : 北京航空航天大学出版社作者 : 周兴华 出版日期:2005年4月版别版次:2005年4月第1版第1次印刷 ISBN : 7-81077-613-4字数 :486千字 印张:19印数 :5000 页数:292开本 :7871092 1/16 内容简介本书以实际编程及做实验为主线贯穿全书。完全摒弃教科书的方法,采用“程序完成后软件仿真→单片机烧录程序→试验板通电实验”的方法,以全新的方式边学边实验,将初学者领进单片机世界的大门。随书所附的光盘中提供了一些工具软件以及本书所有的实验程序文件,在学习、实验时可参考。 本书的读者对象是大中专学生、职业学校学生、广大电子制作爱好者。第1章 实验设备及器材使用介绍11 单片机的发展史及特点12 单片机入门的有效途径13 实验工具及器材第2章 Keil C51集成开发环境及TOP851多功能编程器21 Keil C51集成开发环境软件安装22 TOP851烧录软件安装23 TOP851烧录软件 *** 作第3章 初步接触KeilC51及TOP851软件并感受第一个演示程序效果31 建立一个工程项目,选择芯片并确定选项32 建立源程序文件33 添加文件到当前项目组中34 编译(汇编)文件3,5 检查并修改源程序文件中的错误36 软件模拟仿真调试37 烧录程序(编程 *** 作)38 观察程序运行的结果第4章 单片机的基本知识41 MCS51单片机的基本结构42 80C51基本特性及引脚定义43 80C51的内部结构44 80C51的存储器配置和寄存器第5章 汇编语言程序指令的学习51 MCS51单片机的指令系统52 汇编语言的特点53 汇编语言的语句格式第6章 数据传送指令的学习及实验61 按寻址方式分类的数据传送指令62 点亮/熄灭一个发光二极管的实验,自动循环工作63 点亮/熄灭一个发光二极管的实验,点亮/熄灭时间自动发生变化(分3段),自动循环工作64 P1口的8个发光二极管每隔2个右循环点亮实验65 MCS51内部的RAM和特殊功能寄存器SFR的数据传送指令66 “跑马灯”实验67 单片机的受控输出显示实验68 小结第7章 算术运算指令的学习及实验71 算术运算指令73 FFH、03H两数相乘实验,结果从P0、P1口输出74 加1指令实验,让P1口的8个发光二极管模拟二进制的加法运算75 加1指令实验(不进行二十进制调整)76 加1指令实验(进行二十进制调整)77 小结第8章 逻辑运算指令的学习及实验81 逻辑运算指令82 逻辑运算举例一83 逻辑运算举例二84 逻辑运算举例三85 小结第9章 控制转移类指令的学习及实验91 控制转移类指令92 散转程序实验93 统计含58H关键字的实验84第10章 位 *** 作指令的学习101 位 *** 作指令102 将P10的状态传送到P20的实验103 比较输入数大小的实验104 将累加器A中的立即数移出的实验105 实现逻辑函数的实验第11章 栈 *** 作指令、空 *** 作指令、伪指令及字节交换指令的学习111 栈 *** 作指令112 空 *** 作指令113 伪指令114 字节交换指令115 查0~9平方表实验116 利用NOP指令产生精确方波实验117 MCS51指令分类表第12章 定时器/计数器及实验121 定时器/计数器的结构及工作原理122 定时器/计数器方式寄存器和控制寄存器123 定时器/计数器的工作方式124 定时器/计数器的初始化125 蜂鸣器发音实验126 定时器T1方式2计数实验127 定时器T1方式1定时实验第13章 中断系统及实验131 中断的种类132 MCS51单片机的中断系统133 令LED输出试验板上的蜂鸣器发出1 kHz音频的实验134 利用外中断方式进行数据采集实验135 中断嵌套实验136 交通灯控制器实验137 键控计数实验第14章 汇编语言的程序设计及实验141 单片机应用系统的设计过程142 汇编语言程序设计步骤143 顺序程序设计144 右移循环流水灯实验145 循环程序设计146 找数据块中最大数的实验147 延时子程序的结构148 寻找ASCII码“$”的实验149 子程序设计、调用及返回1410 使P0口的8个LED闪烁20次实验1411 分支程序设计1412 做简单的+、-、×、÷实验1413 查表程序设计1414 单片机演奏音乐的实验1415 数据排序实验第15章 键盘接口技术及实验151 独立式键盘152 行列式键盘153 独立式键盘接口的编程模式154行列式键盘接口的编程模式155 键盘工作方式156 独立式键盘输入实验157 行列式键盘输入实验158 扫描方式的键盘输入实验159 定时中断方式的键盘输入实验第16章 LED显示器接口技术及实验161 LED数码显示器的构造及特点162 LED数码显示器的显示方法163 静态显示实验164 慢速动态显示实验165 快速动态显示实验166 实时时钟实验第17章 字符型液晶(LCD)模块原理及设计学习171 液晶显示器概述172 16×2字符型液晶显示模块(LCM)特性173 16×2字符型液晶显示模块(LCM)引脚及功能174 16×2字符型液晶显示模块(LCM)的内部结构175 液晶显示控制驱动集成电路HD44780特点176 HD44780工作原理177 LCD控制器的指令178 LCM工作时序179 单片机驱动LCM的电路第18章 体验第一个液晶程序的效果并建立模块化设计的相关子程序181 体验第一个液晶程序的效果182 查询忙碌标志信号子程序183 写指令到LCM(IR寄存器)子程序184 写数据到LCM(DR寄存器)子程序185 清除显示屏子程序186 启动LCM子程序187 让字母“F”在显示屏的第2行第10列显示188 使LCM显示2行字符串(英文信息)189 使LCM显示2行字符串(英文信息)并循环移动第19章 简单的液晶显示型自动化仪器的设计学习及实验191 工业生产自动计数器192 设备运行状态自动显示器193 液晶显示计时时钟194 让液晶显示屏显示自制图形“中”195 液晶显示屏显示复杂的自制图形第20章 Keil C51集成开发环境的设置及调试方法201 工程项目的建立、源程序文件的建立及加载202 工程的详细设置203 编译、连接204 Keil C51集成开发环境软件的调试方法205 外围接口工具单片机有

C51单片机(全都用C语言写程序)

还有

ASM单片机(全用汇编写程序)

如C51点亮一个数码管程序如下:

#include<reg52h>

sbit D1=P1^0;

void main()

{

D1=0;

}

用C51写简单多了

我在学C51有兴趣一起研究一下……

以上就是关于求lm016l与ds1302 52 单片机实现时钟显示的程序全部的内容,包括:求lm016l与ds1302 52 单片机实现时钟显示的程序、lcm模组原理、单片机液晶显示驱动程序(用C语言写的)等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/9708677.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-01
下一篇2023-05-01

发表评论

登录后才能评论

评论列表(0条)

    保存