完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
3个回答
|
|
/** * * 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 ***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 != ' |