stm32毕业设计 电子时钟设计与实现( 二 )


【stm32毕业设计 电子时钟设计与实现】.c 最终向外提供出与具体时钟芯片寄存器位置无关的、由时间结构类型 sTime 作为接口的实时时间的读取和设置函数 , 如此处理体现了我们前面提到过的层次化编程的思想 。应用层可以不关心底层实现细节 , 底层实现的改变也不会对应用层造成影响 , 比如说日后你可能需要换一款时钟芯片 , 而它与的操作和时间寄存器顺序是不同的 , 那么你需要做的也仅是针对这款新的时钟芯片设计出底层操作函数 , 最终提供出同样的以 sTime 为接口的操作函数即可 , 应用层无需做任何的改动 。

stm32毕业设计 电子时钟设计与实现

文章插图
/***************************Lcd1602.c 文件程序源代码*****************************/#include #define LCD1602_DB P0sbit LCD1602_RS = P1^0;sbit LCD1602_RW = P1^1;sbit LCD1602_E = P1^5;/* 等待液晶准备好 */void LcdWaitReady(){unsigned char sta;LCD1602_DB = 0xFF;LCD1602_RS = 0;LCD1602_RW = 1;do {LCD1602_E = 1;sta = LCD1602_DB; //读取状态字LCD1602_E = 0;} while (sta & 0x80); //bit7 等于 1 表示液晶正忙 , 重复检测直到其等于 0 为止}/* 向 LCD1602 液晶写入一字节命令 , cmd-待写入命令值 */void LcdWriteCmd(unsigned char cmd){LcdWaitReady();LCD1602_RS = 0;LCD1602_RW = 0;LCD1602_DB = cmd;LCD1602_E = 1;LCD1602_E = 0;}/* 向 LCD1602 液晶写入一字节数据 , dat-待写入数据值 */void LcdWriteDat(unsigned char dat){LcdWaitReady();LCD1602_RS = 1;LCD1602_RW = 0;LCD1602_DB = dat;LCD1602_E = 1;LCD1602_E = 0;}/* 设置显示 RAM 起始地址 , 亦即光标位置 , (x,y)-对应屏幕上的字符坐标 */void LcdSetCursor(unsigned char x, unsigned char y){unsigned char addr;if (y == 0){ //由输入的屏幕坐标计算显示 RAM 的地址addr = 0x00 + x; //第一行字符地址从 0x00 起始}else{addr = 0x40 + x; //第二行字符地址从 0x40 起始}LcdWriteCmd(addr | 0x80); //设置 RAM 地址}/* 在液晶上显示字符串 , (x,y)-对应屏幕上的起始坐标 , str-字符串指针 */void LcdShowStr(unsigned char x, unsigned char y, unsigned char *str){LcdSetCursor(x, y); //设置起始地址while (*str != '\0'){ //连续写入字符串数据 , 直到检测到结束符LcdWriteDat(*str++);}}/* 打开光标的闪烁效果 */void LcdOpenCursor(){LcdWriteCmd(0x0F);}/* 关闭光标显示 */void LcdCloseCursor(){LcdWriteCmd(0x0C);}/* 初始化 1602 液晶 */void InitLcd1602(){LcdWriteCmd(0x38); //16*2 显示 , 5*7 点阵 , 8 位数据接口LcdWriteCmd(0x0C); //显示器开 , 光标关闭LcdWriteCmd(0x06); //文字不动 , 地址自动+1LcdWriteCmd(0x01); //清屏}
实现效果