为了进一步了解STC系列单片机,故通过杜洋工作室的1602液晶显示案例进行学习,该文介绍的是对其1602液晶屏时钟源程序的复现。
品名 | 型号 | 数量 |
---|---|---|
单片机 | STC12C2052 | 1 |
显示屏 | LCD1602 | 1 |
USB转TTL | CH340G | 1 |
电位器 | B10K | 1 |
面包板 | MB-102 | 1 |
晶振 | 12MHZ | 1 |
电容 | 30pf | 2 |
接线方式与上图略有不同,其实就是在V0口加了一个电位器来控制屏幕的灰度。
STC12C2052 | LCD1602 | 电位器 |
---|---|---|
P1.0—P1.7 | D0—D7 | * |
GND | LED_K | * |
VCC | VCC | * |
INT0/P3.2 | RS | * |
INT1/P3.3 | RW | * |
P3.4 | E | * |
* | VSS | 1 |
* | V0 | 2 |
目前该程序实现的时钟是固定的,如果想进一步改成实时的话,还需要另加上DS1302时钟芯片进行辅助,或者是通过利用_DATE_和_TIME_宏在keil中添加编译日期和时间到C51程序中,不过该方法暂未验证,有兴趣的朋友可以自行验证交流。
/********************************************************************************************
程序名: 1602液晶屏时钟程序
编写人: 杜洋
编写时间: 2009年7月6日
硬件支持: LCD1602液晶屏 STC12C2052 外部12MHZ晶振
说明备注: 使用2402液晶屏程序,与1602液晶屏程序完全兼容
/********************************************************************************************/
#include <AT89X52.h> // 包含头文件 //
#include <REGX52.H>/********************************************************************************************/
typedef unsigned char uint8; // 无符号8位整型变量 ///********************************************************************************************
// 引脚定义 // (使用者根据实际更改)
/********************************************************************************************/
#define LCM2402_DB0_DB7 P1 // 定义LCM2402的数据总线
sbit LCM2402_RS = P3 ^ 2; // 定义LCM2402的RS控制线
sbit LCM2402_RW = P3 ^ 3; // 定义LCM2402的RW控制线
sbit LCM2402_E = P3 ^ 4; // 定义LCM2402的E控制线
sbit LCM2402_Busy = P1 ^ 7; // 定义LCM2402的测忙线(与LCM2402_DB0_DB7关联)
data unsigned char TIME_DD,TIME_MO,TIME_YY,TIME_WW,TIME_HH,TIME_MM,TIME_SS;//设置日、月、年、周、时、分、秒和温度存放区
data bit DAY_BIT = 0;//天数增加标志位(用于日期进位的启动)
data unsigned char DIS_BIT = 0; //多种信息的切换显示
data unsigned char cou = 0; // 软计数器,对10ms时基信号累加到1s
/********************************************************************************************
// 定义LCM2402指令集 // (详细请见技术手册)
/********************************************************************************************/
#define CMD_clear 0x01 // 清除屏幕
#define CMD_back 0x02 // DDRAM回零位
#define CMD_dec1 0x04 // 读入后AC(指针)减1,向左写
#define CMD_add1 0x06 // 读入后AC(指针)加1,向右写
#define CMD_dis_gb1 0x0f // 开显示_开光标_开光标闪烁
#define CMD_dis_gb2 0x0e // 开显示_开光标_关光标闪烁
#define CMD_dis_gb3 0x0c // 开显示_关光标_关光标闪烁
#define CMD_OFF_dis 0x08 // 关显示_关光标_关光标闪烁
#define CMD_set82 0x38 // 8位总线_2行显示
#define CMD_set81 0x30 // 8位总线_1行显示(上边行)
#define CMD_set42 0x28 // 4位总线_2行显示
#define CMD_set41 0x20 // 4位总线_1行显示(上边行)
#define lin_1 0x80 // 4位总线_1行显示(上边行)
#define lin_2 0xc0 // 4位总线_1行显示(上边行)/********************************************************************************************
// 读LCM忙程序 [底层协议] // (所有底层协议都无需关注)
// LCM2402测忙,若LCM2402处于忙状态,本函数将等待至非忙状态 //
/********************************************************************************************/
void LCM2402_TestBusy(void){LCM2402_DB0_DB7 = 0xff; //设备读状态LCM2402_RS = 0;LCM2402_RW = 1;LCM2402_E = 1;while(LCM2402_Busy); //等待LCM不忙LCM2402_E = 0; //
}
/********************************************************************************************
// 写指令程序 //
// 向LCM2402写命令 本函数需要1个指令集的入口参数 //
/********************************************************************************************/
void LCM2402_WriteCMD(uint8 LCM2402_command) { LCM2402_TestBusy();LCM2402_DB0_DB7 = LCM2402_command;LCM2402_RS = 0;LCM2402_RW = 0;LCM2402_E = 1;LCM2402_E = 0;
}
/********************************************************************************************
// 写数据程序 //
// 向LCM2402写数据 //
/********************************************************************************************/
void LCM2402_WriteData(uint8 LCM2402_data){ LCM2402_TestBusy();LCM2402_DB0_DB7 = LCM2402_data;LCM2402_RS = 1;LCM2402_RW = 0;LCM2402_E = 1;LCM2402_E = 0;
}
/********************************************************************************************
// 打印字符串程序 // (本函数调用指针函数)
// 向LCM发送一个字符串,长度48字符之内
// 第一行位置 0x00~0x17 第二行位置 0x40~0x57
// 应用举例:print(0x80,"doyoung"); //在第一行第一位处从左向右打印doyoung字符串
/********************************************************************************************/
void print(uint8 a,uint8 *str){LCM2402_WriteCMD(a | 0x80);while(*str != '