/************************************************************************************** * LCD1602液晶显示实验 * 实现现象:下载程序后插上LCD1602液晶在开发板上,即可显示 注意事项:如果不想让点阵模块显示,可以将74HC595模块上的JP595短接片拔掉。 ***************************************************************************************/ #include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器 #include "lcd.h" typedef unsigned int u16; //对数据类型进行声明定义 typedef unsigned char u8; u8 Disp[]=" Pechin Science "; /******************************************************************************* * 函 数 名 : main * 函数功能 : 主函数 * 输 入 : 无 * 输 出 : 无 *******************************************************************************/ void main(void) { u8 i; LcdInit(); for(i=0;i<16;i++) { LcdWriteData(Disp[i]); } while(1); }
1 #include "lcd.h" 2 3 /******************************************************************************* 4 * 函 数 名 : Lcd1602_Delay1ms 5 * 函数功能 : 延时函数,延时1ms 6 * 输 入 : c 7 * 输 出 : 无 8 * 说 名 : 该函数是在12MHZ晶振下,12分频单片机的延时。 9 *******************************************************************************/ 10 11 void Lcd1602_Delay1ms(uint c) //误差 0us 12 { 13 uchar a,b; 14 for (; c>0; c--) 15 { 16 for (b=199;b>0;b--) 17 { 18 for(a=1;a>0;a--); 19 } 20 } 21 22 } 23 24 /******************************************************************************* 25 * 函 数 名 : LcdWriteCom 26 * 函数功能 : 向LCD写入一个字节的命令 27 * 输 入 : com 28 * 输 出 : 无 29 *******************************************************************************/ 30 #ifndef LCD1602_4PINS //当没有定义这个LCD1602_4PINS时 31 void LcdWriteCom(uchar com) //写入命令 32 { 33 LCD1602_E = 0; //使能 34 LCD1602_RS = 0; //选择发送命令 35 LCD1602_RW = 0; //选择写入 36 37 LCD1602_DATAPINS = com; //放入命令 38 Lcd1602_Delay1ms(1); //等待数据稳定 39 40 LCD1602_E = 1; //写入时序 41 Lcd1602_Delay1ms(5); //保持时间 42 LCD1602_E = 0; 43 } 44 #else 45 void LcdWriteCom(uchar com) //写入命令 46 { 47 LCD1602_E = 0; //使能清零 48 LCD1602_RS = 0; //选择写入命令 49 LCD1602_RW = 0; //选择写入 50 51 LCD1602_DATAPINS = com; //由于4位的接线是接到P0口的高四位,所以传送高四位不用改 52 Lcd1602_Delay1ms(1); 53 54 LCD1602_E = 1; //写入时序 55 Lcd1602_Delay1ms(5); 56 LCD1602_E = 0; 57 58 LCD1602_DATAPINS = com << 4; //发送低四位 59 Lcd1602_Delay1ms(1); 60 61 LCD1602_E = 1; //写入时序 62 Lcd1602_Delay1ms(5); 63 LCD1602_E = 0; 64 } 65 #endif 66 /******************************************************************************* 67 * 函 数 名 : LcdWriteData 68 * 函数功能 : 向LCD写入一个字节的数据 69 * 输 入 : dat 70 * 输 出 : 无 71 *******************************************************************************/ 72 #ifndef LCD1602_4PINS 73 void LcdWriteData(uchar dat) //写入数据 74 { 75 LCD1602_E = 0; //使能清零 76 LCD1602_RS = 1; //选择输入数据 77 LCD1602_RW = 0; //选择写入 78 79 LCD1602_DATAPINS = dat; //写入数据 80 Lcd1602_Delay1ms(1); 81 82 LCD1602_E = 1; //写入时序 83 Lcd1602_Delay1ms(5); //保持时间 84 LCD1602_E = 0; 85 } 86 #else 87 void LcdWriteData(uchar dat) //写入数据 88 { 89 LCD1602_E = 0; //使能清零 90 LCD1602_RS = 1; //选择写入数据 91 LCD1602_RW = 0; //选择写入 92 93 LCD1602_DATAPINS = dat; //由于4位的接线是接到P0口的高四位,所以传送高四位不用改 94 Lcd1602_Delay1ms(1); 95 96 LCD1602_E = 1; //写入时序 97 Lcd1602_Delay1ms(5); 98 LCD1602_E = 0; 99 100 LCD1602_DATAPINS = dat << 4; //写入低四位 101 Lcd1602_Delay1ms(1); 102 103 LCD1602_E = 1; //写入时序 104 Lcd1602_Delay1ms(5); 105 LCD1602_E = 0; 106 } 107 #endif 108 /******************************************************************************* 109 * 函 数 名 : LcdInit() 110 * 函数功能 : 初始化LCD屏 111 * 输 入 : 无 112 * 输 出 : 无 113 *******************************************************************************/ 114 #ifndef LCD1602_4PINS 115 void LcdInit() //LCD初始化子程序 116 { 117 LcdWriteCom(0x38); //开显示 118 LcdWriteCom(0x0c); //开显示不显示光标 119 LcdWriteCom(0x06); //写一个指针加1 120 LcdWriteCom(0x01); //清屏 121 LcdWriteCom(0x80); //设置数据指针起点 122 } 123 #else 124 void LcdInit() //LCD初始化子程序 125 { 126 LcdWriteCom(0x32); //将8位总线转为4位总线 127 LcdWriteCom(0x28); //在四位线下的初始化 128 LcdWriteCom(0x0c); //开显示不显示光标 129 LcdWriteCom(0x06); //写一个指针加1 130 LcdWriteCom(0x01); //清屏 131 LcdWriteCom(0x80); //设置数据指针起点 132 } 133 #endif
#ifndef __LCD_H_ #define __LCD_H_ /********************************** 当使用的是4位数据传输的时候定义, 使用8位取消这个定义 **********************************/ #define LCD1602_4PINS /********************************** 包含头文件 **********************************/ #include<reg52.h> //---重定义关键词---// #ifndef uchar #define uchar unsigned char #endif #ifndef uint #define uint unsigned int #endif /********************************** PIN口定义 **********************************/ #define LCD1602_DATAPINS P0 sbit LCD1602_E=P2^7; sbit LCD1602_RW=P2^5; sbit LCD1602_RS=P2^6; /********************************** 函数声明 **********************************/ /*在51单片机12MHZ时钟下的延时函数*/ void Lcd1602_Delay1ms(uint c); //误差 0us /*LCD1602写入8位命令子函数*/ void LcdWriteCom(uchar com); /*LCD1602写入8位数据子函数*/ void LcdWriteData(uchar dat) ; /*LCD1602初始化子程序*/ void LcdInit(); #endif