热度 18
2014-11-13 20:47
1011 次阅读|
0 个评论
LCD1602.h /*********************************************************** 文件名称: LCD1602.h 作 者: 终神晓 时间: 2014/11/12/22:48 版 本: V1.0 说 明: LCD1602的头文件 修改记录: 无 ***********************************************************/ #ifndef __LCD1602_H__ #define __LCD1602_H__ #include sbit RS = P1^3; /* RS=1,命令;RS=0,数据 */ sbit RW = P1^4; /* RW=1,读;RW=0,写 */ sbit EN = P1^5; sbit wx = P2^6; /* 数码管与LCD1602管脚冲突 */ sbit dx = P2^7; #define DataPort P0 #define RS_CLR RS = 0 #define RS_SET RS = 1 #define RW_CLR RW = 0 #define RW_SET RW = 1 #define EN_CLR EN = 0 #define EN_SET EN = 1 void DelayUs2x(unsigned char t); void DelayMs(unsigned char t); void SMG_Clear_Display(void); bit LCD1602_Check_Busy(void); void LCD1602_Write_Command(unsigned char command); void LCD1602_Write_Data(unsigned char Data); void LCD1602_Write_Char(unsigned char x,unsigned char y,unsigned char Data); void LCD1602_Write_String(unsigned char x,unsigned char y,unsigned char *s); void LCD1602_Clear_Screen(void); void LCD1602_Init(void); #endif LCD1602.c /*********************************************************** 文件名称: LCD1602.c 作 者: 终神晓 时间: 2014/11/12/22:48 版 本: V1.0 说 明: LCD1602的驱动函数 基本操作时序: 读状态 输入:RS=L,RW=H,E=H 输出:DB0~DB7=状态字 写指令 输入:RS=L,RW=L,E=下降沿脉冲,DB0~DB7=指令码 输出:无 读数据 输入:RS=H,RW=H,E=H 输出:DB0~DB7=数据 写数据 输入:RS=H,RW=L,E=下降沿脉冲,DB0~DB7=数据 输出:无 修改记录: 无 ***********************************************************/ #include"LCD1602.h" #include"intrins.h" /******************us延时函数*******************/ void DelayUs2x(unsigned char t) { while(--t); /* T = t x 2 + 5 uS*/ } /******************ms延时函数*******************/ void DelayMs(unsigned char t) { while(t--) /*1ms*/ { DelayUs2x(245); DelayUs2x(245); } } /********清除数码管的显示*********************/ void SMG_Clear_Display(void) { P0 = 0x00; wx = 1; wx = 0; P0 = 0x00; dx = 1; dx = 0; } /****************判忙函数**********************/ bit LCD1602_Check_Busy(void) { DataPort = 0xFF; RS_CLR; RW_SET; EN_CLR; _nop_(); EN_SET; return (bit) (DataPort 0x80); } /************写命令函数***********************/ void LCD1602_Write_Command(unsigned char command) { while(LCD1602_Check_Busy()); /*忙则等待*/ RS_CLR; RW_CLR; EN_SET; DataPort = command; _nop_(); EN_CLR; } /***************写数据函数********************/ void LCD1602_Write_Data(unsigned char Data) { while(LCD1602_Check_Busy()); /*忙则等待*/ RS_SET; RW_CLR; EN_SET; DataPort = Data; _nop_(); EN_CLR; } /***************写字符函数*******************/ void LCD1602_Write_Char(unsigned char x,unsigned char y,unsigned char Data) { if(y == 0) { LCD1602_Write_Command(0x80 + x); /*LCD1602第一行*/ } else { LCD1602_Write_Command(0xC0 + x); /*LCD1602第二行*/ } LCD1602_Write_Data(Data); } /***************写字符串函数*******************/ void LCD1602_Write_String(unsigned char x,unsigned char y,unsigned char *s) { if(y == 0) { LCD1602_Write_Command(0x80 + x); /*LCD1602第一行*/ } else { LCD1602_Write_Command(0xC0 + x); /*LCD1602第二行*/ } while(*s) { LCD1602_Write_Data( *s ); s++; } } /***************清屏函数*******************/ void LCD1602_Clear_Screen(void) { LCD1602_Write_Command(0x01); DelayMs(5); } /***************LCD1602初始化函数*******************/ void LCD1602_Init(void) { SMG_Clear_Display(); /*清除数码管上的乱码*/ LCD1602_Write_Command(0x38); /*显示模式设置*/ DelayMs(5); LCD1602_Write_Command(0x38); DelayMs(5); LCD1602_Write_Command(0x38); DelayMs(5); LCD1602_Write_Command(0x38); LCD1602_Write_Command(0x08); /*显示关闭*/ LCD1602_Write_Command(0x01); /*显示清屏*/ LCD1602_Write_Command(0x06); /*显示光标移动设置*/ DelayMs(5); LCD1602_Write_Command(0x0C); /*显示开及光标设置*/ LCD1602_Clear_Screen(); /*清屏*/ } main.c /*********************************************************** 文件名称: main.c 作 者: 终神晓 时间: 2014/11/12/22:48 版 本: V1.0 说 明: 在LCD1602第一行上显示LCD1602 Display,第二行显示 By Croesus ^_^. 修改记录: 无 ***********************************************************/ #include"reg52.h" #include"LCD1602.h" void main(void) { LCD1602_Init(); while(1) { LCD1602_Write_String(0,0,"LCD1602 Display"); LCD1602_Write_String(1,1,"By Croesus"); LCD1602_Write_Char(13,1,'^'); LCD1602_Write_Char(14,1,'_'); LCD1602_Write_Char(15,1,'^'); while(1); } }