LCD1602.h液晶驱动头文件下载:
- #ifndef _LCD1602_H_
- #define _LCD1602_H_
- #include <reg51.h>
- //#include <STC12C5A60S2.h>
- #define uint8 unsigned char
- #define uint16 unsigned int
- //////////////////////////////////////////////////////////
- #define IODATA P0
- sbit E =P2^2; //1602使能引脚
- sbit RW =P2^1; //1602读写引脚
- sbit RS =P2^0; //1602数据/命令选择引脚
- //////////////////////////////////////////////////////////
- void delay1602()
- {
- uint8 i=10;
- while(i--);
- }
- void del1602(uint16 delay)
- {
- uint16 i,j;
- for(i=0;i<delay;i++)
- for(j=0;j<=148;j++);
- }
- /********************************************************************
- * 名称 : bit Busy(void)
- * 功能 : 读状态函数,是否处在忙状态
- ***********************************************************************/
- void Busy(void)
- {
- bit busy_flag = 1;
- IODATA = 0xff;
- RS = 0;
- delay1602();
- RW = 1;
- delay1602();
- E = 1;
- while(1)
- {
- busy_flag = (bit)(IODATA & 0x80);
- if(busy_flag == 0)
- {
- break;
- }
- }
- E = 0;
- }
- /********************************************************************
- * 名称 : lcd1602_wcmd(uint8 tdata)
- * 功能 : 1602命令函数
- * 输入 : 输入的命令值
- ***********************************************************************/
- void lcd1602_wcmd(uint8 tdata)
- {
- RS = 0;
- delay1602();
- RW = 0;
- delay1602();
- E = 0;
- delay1602();
- IODATA = tdata;
- delay1602();
- E = 1;
- delay1602();
- E = 0;
- }
- /********************************************************************
- * 名称 : lcd1602_wdata(uint8 tdata)
- * 功能 : 1602写数据函数
- * 输入 : 需要写入1602的数据
- ***********************************************************************/
- void lcd1602_wdata(uint8 tdata)
- {
- Busy();
- delay1602();
- RS = 1;
- delay1602();
- RW = 0;
- delay1602();
- E = 0;
- delay1602();
- IODATA = tdata;
- delay1602();
- E = 1;
- delay1602();
- E = 0;
- }
- /********************************************************************
- * 名称 : lcd1602_init()
- * 功能 : 1602初始化
- ***********************************************************************/
- void lcd1602_init(void)
- {
- del1602(15);
- lcd1602_wcmd(0x38);
- del1602(5);
- lcd1602_wcmd(0x38);
- del1602(5);
- lcd1602_wcmd(0x38);
- lcd1602_wcmd(0x38);
- Busy();
- lcd1602_wcmd(0x08);
- Busy();
- lcd1602_wcmd(0x01);
- Busy();
- lcd1602_wcmd(0x06);
- Busy();
- lcd1602_wcmd(0x0c);
- }
- /********************************************************************
- * 名称 : lcd1602_char(uint8 hang,uint8 lie,char sign)
- * 功能 : lcd1602_char(1,5,'A')
- * 输入 : 行,列,需要输入1602的数据
- ***********************************************************************/
- void lcd1602_char(uint8 hang,uint8 lie,char sign)
- {
- uint8 a;
- if(hang == 1)
- {
- a = 0x80;
- }
- if(hang == 2)
- {
- a = 0xc0;
- }
- a = a + lie - 1;
- Busy();
- lcd1602_wcmd(a);
- Busy();
- lcd1602_wdata(sign);
- }
- /********************************************************************
- * 名称 : lcd1602_string(uint8 hang,uint8 lie,uint8 *p)
- * 功能 : lcd1602_string(1,5,"happy!")
- * 输入 : 行,列,需要输入1602的数据
- ***********************************************************************/
- void lcd1602_string(uint8 hang,uint8 lie,uint8 *p)
- {
- uint8 a;
- if(hang == 1)
- {
- a = 0x80;
- }
- if(hang == 2)
- {
- a = 0xc0;
- }
- a = a + lie - 1;
- while(1)
- {
- Busy();
- lcd1602_wcmd(a);
- Busy();
- lcd1602_wdata(*p);
- a++;
- p++;
- if((*p == '\0')||(a==0x90)||(a==0xd0))
- {
- break;
- }
- }
- }
- /********************************************************************
- * 名称 : lcd1602_write_pic(uint8 add,uint8 *pic_num)
- * 功能 : lcd1602_string(i,pic[i])
- * 输入 : 写入自定义字符到CGRAM
- ***********************************************************************/
- void lcd1602_write_pic(uint8 add,uint8 *pic_num)
- {
- uint8 i;
- add=add<<3;
- for(i=0;i<8;i++)
- {
- lcd1602_wcmd(0x40|add+i);
- lcd1602_wdata(*pic_num++);
- }
- }
- /********************************************************************
- * 名称 : lcd1602_wdata10(uint8 add,uint16 date);
- * 功能 : lcd1602_wdata10(0x80,5000)
- * 输入 : 写十进制到地址
- ***********************************************************************/
- void lcd1602_wdata10(uint8 add,uint16 date)
- {
- uint8 L1,L2,L3,L4,L5,a;
- L5=date/10000;
- L4=date%10000/1000;
- L3=date%10000%1000/100;
- L2=date%10000%1000%100/10;
- L1=date%10000%1000%100%10;
- if(L1!=0){a=1;};
- if(L2!=0){a=2;};
- if(L3!=0){a=3;};
- if(L4!=0){a=4;};
- if(L5!=0){a=5;};
- switch (a){
- case 5:
- lcd1602_wcmd(add);
- lcd1602_wdata(0x30+L5);
- lcd1602_wdata(0x30+L4);
- lcd1602_wdata(0x30+L3);
- lcd1602_wdata(0x30+L2);
- lcd1602_wdata(0x30+L1);break;
- case 4:
- lcd1602_wcmd(add);
- lcd1602_wdata(0x30+L4);
- lcd1602_wdata(0x30+L3);
- lcd1602_wdata(0x30+L2);
- lcd1602_wdata(0x30+L1);break;
- case 3:
- lcd1602_wcmd(add);
- lcd1602_wdata(0x30+L3);
- lcd1602_wdata(0x30+L2);
- lcd1602_wdata(0x30+L1);break;
- case 2:
- lcd1602_wcmd(add);
- lcd1602_wdata(0x30+L2);
- lcd1602_wdata(0x30+L1);break;
- case 1:
- lcd1602_wcmd(add);
- lcd1602_wdata(0x30+L1);break;
- default:break;
- }
-
- }
- /********************************************************************
- * 名称 : lcd1602_wdata16(uint16 date);
- * 功能 : lcd1602_wdata16(0x10)
- * 输入 : 写十六进制到地址
- ***********************************************************************/
- void lcd1602_wdata16(uint16 date)
- {
- uint8 dat_H,dat_L;
- dat_H=date>>8;
- dat_L=date;
- lcd1602_wdata(dat_H);
- lcd1602_wdata(dat_L);
- }
- #endif
复制代码
|