基于at89c51单片机的lcd电子时钟设计内容摘要:

信过程中最好保证传输的连续性不要允许中断如图 32 所示 LCD1602 流程图 程序主要实现对信息的显示包括年月日时分秒等信息在这里要注意它的读写控制指令其流程图如图 33 所示 图 33 LCD1602 初始化流程图 子程序源代码设计 详见附录一 设计原理图 详见附录二 附录一 程序名称基于单片机和时钟芯片 DS1302 的电子时钟 程序功能 时钟芯片采用 DS1302 显示采用液晶屏 LCD1602 include 包含单片机寄存器的头文件 include 包含 _nop_ 函数定义的头文件 define uchar unsigned char define uint unsigned int 以下是 DS1302 芯片的操作程序 uchar code digit[10] 0123456789 定义字符数组显示数字 sbit DATA P11 位定义 1302 芯片的接口数据输出 端定义在 P11 引脚 sbit RST P12 位定义 1302 芯片的接口复位端口定义在 P11 引脚 sbit SCLK P10 位定义 1302 芯片的接口时钟输出端口定义在 P11 引脚 函数功能延时若干微秒 入口参数 n void delaynus uchar n uchar i for i 0i ni 函数功能向 1302 写一个字节数据 入口参数 x void Write1302 uchar dat uchar i SCLK 0 拉低 SCLK 为脉冲上升沿写入数据做好准备 delaynus 2 稍微等待使硬件做好准备 for i 0i 8i 连续写 8 个二进制位数据 DATA dat0x01 取出 dat 的第 0 位数据写入 1302 delaynus 2 稍微等待使硬件做好准备 SCLK 1 上升沿写入数据 delaynus 2 稍微等待使硬件做好准备 SCLK 0 重新拉低 SCLK 形成脉冲 dat 1 将 dat的各数据位右移 1位准备写入下一个数据位 函数功能根据命令字向 1302 写一个字节数据 入口参数 Cmd 储存命令字 dat 储存待写的数据 void WriteSet1302 uchar Cmduchar dat RST 0 禁止数据传递 SCLK 0 确保写数居前 SCLK 被拉低 RST 1 启动数据传输 delaynus 2 稍微等待使硬 件做好准备 Write1302 Cmd 写入命令字 Write1302 dat 写数据 SCLK 1 将时钟电平置于已知状态 RST 0 禁止数据传递 函数功能从 1302 读一个字节数据 入口参数 x uchar Read1302 void uchar idat delaynus 2 稍微等待使硬件做好准备 for i 0i 8i 连续读 8 个二进制位数据 dat 1 将 dat 的各数据位右移 1 位因为先读出的是字节的最低位 if DATA 1 如果读出的数据是 1 dat 0x80 将 1 取出写在 dat 的最高位 SCLK 1 将 SCLK 置于高电平为下降沿读出 delaynus 2 稍微等待 SCLK 0 拉低 SCLK 形成脉冲下降沿 delaynus 2 稍微等待 return dat 将读出的数据返回 函数功能根据命令字从 1302 读取一个字节数据 入口参数 Cmd uchar ReadSet1302 uchar Cmd uchar dat RST 0 拉低 RST SCLK 0 确保写数居前 SCLK 被拉低 RST 1 启动数据传输 Write1302 Cmd 写入命令字 dat Read1302 读出数据 SCLK 1 将时钟电平置于已知状态 RST 0 禁止数据传递 return dat 将读出的数据返回 函数功能 1302 进行初始化设置 void Init_DS1302 void WriteSet1302 0x8E0x00 根据写状态寄存器命令字写入不保护指令 WriteSet1302 0x80 010 4 010 根据写秒寄存器命令字写入秒的初始值 除法运算取整取模运算取余 数据前四位为十位后四位为个位详见寄存器表 WriteSet1302 0x82 010 4 010 根据写分寄存器命令字写入分的初始值 WriteSet1302 0x84 1210 4 1210 根据写小时寄存器命令字写入小时的初始值 WriteSet1302 0x86 0110 4 0110 根据写日寄存器命令字写入日的初始值 WriteSet1302 0x88 0610 4 0610 根据写月寄存器命令字写入月的初始值 WriteSet1302 0x8c 1010 4 1010 根据写小时寄存器命令字写入小时的初始值 以下是对液晶模块的操作程序 sbit RS P20 寄存器选择位将 RS 位定义为 P20 引脚 sbit RW P21 读写选择位将 RW 位定义为 P21 引脚 sbit E P22 使能信号位将 E 位定义为 P22 引脚 sbit BF P07 忙碌标志位将 BF 位定义为 P07 引脚 函数功能延时 1ms 3j2 i 3 332 10 1010 微秒 可以认为是 1 毫秒 void delay1ms unsigned char ij for i 0i 10i for j 0j 33j 函数功能延时若干毫秒 入口参数 n void delaynms unsigned char n unsigned char i for i 0i ni delay1ms 函数功能判断液晶模块的忙碌状态 返回值 resultresult 1 忙碌 result 0 不忙 bit BusyTest void bit result RS 0 根据规定 RS 为低电平 RW 为高电平时可以读状态 RW 1 E 1 E 1 才允许读写 _nop_ 空操作 _nop_ _nop_ _nop_ 空操作四个机器周期给硬件反应时间 result BF 将忙碌标志电平赋给 result E 0 将 E 恢复低电平 return result 函数功能将模式设置指令或显示地址写入液晶模块 入口参数 dictate void WriteInstruction uchar dictate while BusyTest 1 如果忙就等待 RS 0 根据规定 RS 和 RW 同时为低电平时可以写入指令 RW 0 E 0 E 置低电平 根据表 86 写指令时 E 为高脉冲 就是让 E从 0到 1发生正跳变所以应先置0 _nop_ _nop_ 空操作两个机器周期给硬件反应时间 P0 dictate 将数据送入 P0 口即写入指令或地址 _nop_ _nop_ _nop_ _nop_。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。