我给你来个程序试试
- //LCD1602.h
- #ifndef _LCD1602_H_
- #define _LCD1602_H_
- /**********************************
- 包含头文件
- **********************************/
- #include <reg51.h>
- #include <string.h>
- //---重定义关键词---//
- #ifndef uchar
- #define uchar unsigned char
- #endif
- #ifndef uint
- #define uint unsigned int
- #endif
- /**********************************
- 当使用的是4位数据传输的时候定义,
- 使用8位取消这个定义
- **********************************/
- //#define LCD1602_4PINS
- /**********************************
- PIN口定义
- **********************************/
- #define LCD1602_DATAPINS P0
- sbit LCD1602_E =P2^2;
- sbit LCD1602_RW=P2^1;
- sbit LCD1602_RS=P2^0;
- /**********************************
- 函数声明
- **********************************/
- /*在51单片机12MHZ时钟下的延时函数*/
- void Lcd1602_Delay1ms(uint c); //误差 0us
- /*LCD1602写入8位命令子函数*/
- void LcdWriteCom(uchar com);
- /*LCD1602写入8位数据子函数*/
- void LcdWriteData(uchar dat);
- /*LCD1602初始化子程序*/
- void LCD_init();
- //设定显示行位置子程序
- void LCD_row(unsigned char row);
- //写字符函数
- void LCD_disp_char(uchar Y, uchar X, uchar DData);
- //写字符串函数
- void LCD_DispString(unsigned char *lcd_string);
- //显示位置和写字符串函数
- //void DisplayStr(uchar Y, uchar X, uchar code *DData);
- /*******************************************************************************
- * 函 数 名 : Lcd1602_Delay1ms
- * 函数功能 : 延时函数,延时1ms
- * 输 入 : c
- * 输 出 : 无
- * 说 名 : 该函数是在12MHZ晶振下,12分频单片机的延时。
- *******************************************************************************/
- void Lcd1602_Delay1ms(uint c) //误差 0us
- {
- uchar a,b;
- for (; c>0; c--)
- {
- for (b=199;b>0;b--)
- {
- for(a=1;a>0;a--);
- }
- }
-
- }
- /*******************************************************************************
- * 函 数 名 : LcdWriteCom
- * 函数功能 : 向LCD写入一个字节的命令
- * 输 入 : com
- * 输 出 : 无
- *******************************************************************************/
- #ifndef LCD1602_4PINS //当没有定义这个LCD1602_4PINS时
- void LcdWriteCom(uchar com) //写入命令
- {
- LCD1602_E = 0; //使能
- LCD1602_RS = 0; //选择发送命令
- LCD1602_RW = 0; //选择写入
-
- LCD1602_DATAPINS = com; //放入命令
- Lcd1602_Delay1ms(1); //等待数据稳定
- LCD1602_E = 1; //写入时序
- Lcd1602_Delay1ms(5); //保持时间
- LCD1602_E = 0;
- }
- #else
- void LcdWriteCom(uchar com) //写入命令
- {
- LCD1602_E = 0; //使能清零
- LCD1602_RS = 0; //选择写入命令
- LCD1602_RW = 0; //选择写入
- LCD1602_DATAPINS = com; //由于4位的接线是接到P0口的高四位,所以传送高四位不用改
- Lcd1602_Delay1ms(1);
- LCD1602_E = 1; //写入时序
- Lcd1602_Delay1ms(5);
- LCD1602_E = 0;
- // Lcd1602_Delay1ms(1);
- LCD1602_DATAPINS = com << 4; //发送低四位
- Lcd1602_Delay1ms(1);
- LCD1602_E = 1; //写入时序
- Lcd1602_Delay1ms(5);
- LCD1602_E = 0;
- }
- #endif
- /*******************************************************************************
- * 函 数 名 : LcdWriteData
- * 函数功能 : 向LCD写入一个字节的数据
- * 输 入 : dat
- * 输 出 : 无
- *******************************************************************************/
- #ifndef LCD1602_4PINS
- void LcdWriteData(uchar dat) //写入数据
- {
- LCD1602_E = 0; //使能清零
- LCD1602_RS = 1; //选择输入数据
- LCD1602_RW = 0; //选择写入
- LCD1602_DATAPINS = dat; //写入数据
- Lcd1602_Delay1ms(1);
- LCD1602_E = 1; //写入时序
- Lcd1602_Delay1ms(5); //保持时间
- LCD1602_E = 0;
- }
- #else
- void LcdWriteData(uchar dat) //写入数据 //写数据函数
- {
- LCD1602_E = 0; //使能清零
- LCD1602_RS = 1; //选择写入数据
- LCD1602_RW = 0; //选择写入
- LCD1602_DATAPINS = dat; //由于4位的接线是接到P0口的高四位,所以传送高四位不用改
- Lcd1602_Delay1ms(1);
- LCD1602_E = 1; //写入时序
- Lcd1602_Delay1ms(5);
- LCD1602_E = 0;
- LCD1602_DATAPINS = dat << 4; //写入低四位
- Lcd1602_Delay1ms(1);
- LCD1602_E = 1; //写入时序
- Lcd1602_Delay1ms(5);
- LCD1602_E = 0;
- }
- #endif
- /*******************************************************************************
- * 函 数 名 : LcdInit()
- * 函数功能 : 初始化LCD屏
- * 输 入 : 无
- * 输 出 : 无
- *******************************************************************************/
- #ifndef LCD1602_4PINS
- void LCD_init() //LCD初始化子程序
- {
- LcdWriteCom(0x38); //开显示
- LcdWriteCom(0x0c); //开显示不显示光标
- LcdWriteCom(0x06); //写一个指针加1
- LcdWriteCom(0x01); //清屏
- LcdWriteCom(0x80); //设置数据指针起点
- }
- #else
- void LCD_init() //LCD初始化子程序
- {
- LcdWriteCom(0x32); //将8位总线转为4位总线
- LcdWriteCom(0x28); //在四位线下的初始化
- LcdWriteCom(0x0c); //开显示不显示光标
- LcdWriteCom(0x06); //写一个指针加1
- LcdWriteCom(0x01); //清屏
- LcdWriteCom(0x80); //设置数据指针起点
- }
- #endif
- /*****************************************************************************
- 函数功能:设定显示行位置子程序
- 入口参数:row
- 出口参数:
- *****************************************************************************/
- void LCD_row(unsigned char row)
- {
- if(row == 1)
- LcdWriteCom( 0x80);
- else if(row == 2)
- LcdWriteCom( 0x80 + 0x40);
- }
- void LCD_disp_char(uchar Y, uchar X, uchar DData) //写字符函数
- {
- Y -=1;
- Y &= 0x01;
- X &= 0x0F; //限制X不能大于15,Y不能大于1
- if(Y) X |= 0x40; //当要显示第二行时地址码+0x40;
- X |= 0x80; //算出指令码
- LcdWriteCom(X); //发送地址码
- LcdWriteData(DData);
- }
- /*输出字符串*/
- void LCD_DispString(unsigned char *lcd_string) //写字符串函数
- {
- unsigned char i=0;
- while(lcd_string[i]!=0x00)
- {
- LcdWriteData(lcd_string[i]); //显示单个字符
- i++;
- }
- }
- /*
- void DisplayStr(uchar Y, uchar X, uchar code *DData) //显示位置和写字符串函数
- {
- uchar ListLength,j;
- ListLength = strlen(DData);
- Y -=1;
- Y &= 0x01;
- X &= 0x0F; //限制X不能大于15,Y不能大于1
- if (X <= 0x0F) //X坐标应小于0xF
- {
- for(j=0;j<ListLength;j++)
- {
- LCD_disp_char(X, Y, DData[j]); //显示单个字符
- X++;
- }
- }
- }
- */
- #endif
复制代码 |