/**
*
* main.c
*
* Mcu : STC12C5608AD
* Freq : 12M
* Compiler : Keil C51 v9.03
* Version : 1.0
* Created on : 2011-08-08
* Author : etuMCU.taobao.com
*
* Note : 这个例子我们演示如何用字符液晶LCD1602
* : 1602液晶可以用来显示数字或者字母,是常用的显示器件
*
* : 硬件连接:
* 1. 1602的RS、R/W、E引脚分别接到单片机的P1.3、P1.4、P1.5端口
* 2. 1602的数据端口接到单片机的P2端口
*
**/
#include "STC12C5620AD.H" // 加载STC12C56系列头文件,头文件要放在工程文件夹内
#include
// 加载头文件,此头文件内含_nop_()函数
***it Buzzer = P3^4; // 定义I/O P3.4为Buzzer,增加程序可读性
***it LED_9 = P3^5;
***it SDI = P1^5;
***it SS = P1^4;
***it SCLK = P1^7;
/* 定义LCD1602驱动端口,详情请查阅原理图 */
#define LCD_DATA P2 //单片机写1602的数据端口
***it LCD_RS = P1^3;
***it LCD_RW = P1^4;
***it LCD_EN = P1^5;
***it LCD_BUSY = P2^7;
//----------------------------------------------------------------------------------------
// 函数名 : _delay_us
// 功 能 : 一个粗略的微秒级延时函数
// 输入值 : i,要延时的时间,单位是us
// 输出值 : 无
// 返回值 : 无
// 版 本 : 1.0
// 作 者 : 一优电子
// 日 期 : 2011-08-08
//----------------------------------------------------------------------------------------
void _delay_us(unsigned int i)
{
while(i--)
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
}
//----------------------------------------------------------------------------------------
// 函数名 : _delay_ms
// 功 能 : 一个粗略的毫秒级延时函数
// 输入值 : i,要延时的时间,单位是毫秒
// 输出值 : 无
// 返回值 : 无
// 版 本 : 1.0
// 作 者 : 一优电子
// 日 期 : 2011-08-08
//----------------------------------------------------------------------------------------
void _delay_ms(unsigned int i)
{
while(i--)
{
_delay_us(1000);
}
}
void LCD1602_status(void)
{
unsigned int timeout_loop = 1; // 超时变量
LCD_BUSY = 1; // 向P2.7端口写“1”,为读液晶状态做准备
LCD_RS = 0; // RS = 0;
LCD_RW = 1; // RW = 1
LCD_EN = 0; // EN = 0;
_delay_us(5);
LCD_EN = 1; // EN = 1;
_delay_us(5);
while ((LCD_BUSY == 1) && (timeout_loop != 0)) //判断LCD1602是否忙,加入一个简单的超时判断
{ //当timeout_loop == 0时,无论是否读到LCD1602
timeout_loop++; //状态均退出该循环,防止系统死锁在此处。
}
LCD_EN = 0; //EN = 0;
}
//-------------------------------------------------------------------------------------
// 函数名 : LCD1602_write_byte
// 功 能 : 向1602写入数据
// 输入值 : dat,Busy
// 输出值 : 无
// 返回值 : 无
// 说 明 : dat:要写入的数据,Busy=1,需要检查LCD忙,Busy=0不需要
// 版 本 : 1.0
// 作 者 : 一优电子/etuMcu.taobo.com
// 日 期 : 2011-03-27
//-------------------------------------------------------------------------------------
void LCD1602_write_byte(unsigned char dat, unsigned char Busy)
{
if (Busy)
{
LCD1602_status();
Busy = 0;
}
LCD_RS = 1; //RS = 1;
LCD_RW = 0; //RW = 0;
LCD_EN = 1; //EN = 1;
LCD_DATA = dat;
_delay_us(5);
LCD_EN = 0; //EN = 0;
}
//-------------------------------------------------------------------------------------
// 函数名 : LCD1602_write_CMD
// 功 能 : 向1602写入命令
// 输入值 : command,Busy
// 输出值 : 无
// 返回值 : 无
// 说 明 : command:要写入的命令,Busy=1,需要检查LCD忙,Busy=0不需要
// 版 本 : 1.0
// 作 者 : 一优电子/etuMcu.taobo.com
// 日 期 : 2011-03-27
//-------------------------------------------------------------------------------------
void LCD1602_write_CMD(unsigned char command, unsigned char Busy)
{
if (Busy)
{
LCD1602_status();
Busy = 0;
}
LCD_RS = 0; //RS = 0;
LCD_RW = 0; //RW = 0;
LCD_EN = 1; //EN = 1;
LCD_DATA = command;
_delay_us(5);
LCD_EN = 0; //EN = 0;
}
//-------------------------------------------------------------------------------------
// 函数名 : LCD1602_clean
// 功 能 : 清屏
// 输入值 : 无
// 输出值 : 无
// 返回值 : 无
// 说 明 : 无
// 版 本 : 1.0
// 作 者 : 一优电子/etuMcu.taobo.com
// 日 期 : 2011-03-27
//-------------------------------------------------------------------------------------
void LCD1602_Clean(void)
{
LCD1602_write_CMD(0x01, 1);
}
//-------------------------------------------------------------------------------------
// 函数名 : LCD1602_write_char
// 功 能 : 向指定位置写入一个字符
// 输入值 : x, y, data
// 输出值 : 无
// 返回值 : 无
// 说 明 : x:第x列;y:第y行;dat:要写入的字符
// 版 本 : 1.0
// 作 者 : 一优电子/etuMcu.taobo.com
// 日 期 : 2011-03-27
//-------------------------------------------------------------------------------------
void LCD1602_write_char(unsigned char x, unsigned char y, unsigned char dat)
{
x &= 0x0F; //每行最多显示16个字符
y &= 0x01; //最多只能显示两行。
x += 0x80;
if (y)
{
x += 0x40;
}
LCD1602_write_CMD(x, 1);
LCD1602_write_byte(dat, 1);
}
//-------------------------------------------------------------------------------------
// 函数名 : LCD1602_write_str
// 功 能 : 向指定位置写入一个字符串
// 输入值 : x, y, data
// 输出值 : 无
// 返回值 : 无
// 说 明 : x:第x列;y:第y行;sdata:要写入的字符串
// 版 本 : 1.0
// 作 者 : 一优电子/etuMcu.taobo.com
// 日 期 : 2011-03-27
//-------------------------------------------------------------------------------------
void LCD1602_write_str(unsigned char x,unsigned char y,char *sdata)
{
x &= 0x0F;
y &= 0x01;
x |= 0x80;
if (y)
{
x |= 0x40;
}
LCD1602_write_CMD(x, 1);
while (*sdata != ' ')
{
LCD1602_write_byte(*sdata++, 1);
}
}
//-------------------------------------------------------------------------------------
// 函数名 : LCD1602_write_number
// 功 能 : 向指定位置写入一个10进制数字
// 输入值 : x, y, data
// 输出值 : 无
// 返回值 : 无
// 说 明 : x:第x列;y:第y行;number:要写入的数字
// 版 本 : 1.0
// 作 者 : 一优电子/etuMcu.taobo.com
// 日 期 : 2011-03-27
//-------------------------------------------------------------------------------------
void LCD1602_write_number(unsigned char x, unsigned char y, unsigned char number)
{
x &= 0x0F;
y &= 0x01;
x |= 0x80;
if (y)
{
x |= 0x40;
}
LCD1602_write_CMD(x, 1);
LCD1602_write_byte(number+48, 1);
}
//-------------------------------------------------------------------------------------
// 函数名 : LCD1602_write_hexnum
// 功 能 : 向指定位置写入一个16进制数字
// 输入值 : x, y, hex
// 输出值 : 无
// 返回值 : 无
// 说 明 : x:第x列;y:第y行;hex:要写入的数字
// 版 本 : 1.0
// 作 者 : 一优电子/etuMcu.taobo.com
// 日 期 : 2011-03-27
//-------------------------------------------------------------------------------------
void LCD1602_write_hexnum(unsigned char x, unsigned char y, unsigned char hex)
{
unsigned char a[16]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
unsigned char tem;
x &= 0x0F;
y &= 0x01;
x |= 0x80;
if (y)
{
x |= 0x40;
}
LCD1602_write_CMD(x, 1);
tem = hex>>4;
LCD1602_write_byte(a[tem],1);
LCD1602_write_CMD(x+1, 1);
tem = hex&0x0f;
LCD1602_write_byte(a[tem],1);
}
//-------------------------------------------------------------------------------------
// 函数名 : LCD1602_init
// 功 能 : LCD1602初始化函数
// 输入值 : 无
// 输出值 : 无
// 返回值 : 无
// 版 本 : 1.0
// 作 者 : 一优电子/etuMcu.taobo.com
// 日 期 : 2011-03-27
//-------------------------------------------------------------------------------------
void LCD1602_init(void)
{
_delay_ms(15);
LCD1602_write_CMD(0x38, 0);
_delay_ms(5);
LCD1602_write_CMD(0x38, 0);
_delay_ms(5);
LCD1602_write_CMD(0x38, 0);
_delay_ms(5);
LCD1602_write_CMD(0x38, 1); //设置16x2显示,5x7点阵,8bit数据接口
LCD1602_write_CMD(0x08, 1); //关显示
LCD1602_write_CMD(0x01, 1); //清屏
LCD1602_write_CMD(0x06, 1); //写入新的数据后,光标右移,显示屏不移动
LCD1602_write_CMD(0x0C, 1); //显示功能开,无光标,
LCD1602_write_CMD(0x01, 1); //清屏
}
//----------------------------------------------------------------------------------------
// 函数名 : main
// 功 能 : 主函数
// 输入值 : 无
// 输出值 : 无
// 返回值 : 无
// 版 本 : 1.0
// 作 者 : 一优电子
// 日 期 : 2011-08-08
//----------------------------------------------------------------------------------------
void main(void)
{
Buzzer = 0; // 噤声蜂鸣器
LED_9 = 0; // 关闭D9
LCD1602_init();
LCD1602_write_str(1, 0, "etuMCU.taobao");
LCD1602_write_str(1, 1, ".com");
while(1)
{
;
}
}
这个是STC12C5608AD 开发板源码,你看看有帮助没有,参考一下吧
|