51单片机通过DHT11温度传感器读取温度(3)
一.LCD1602的初始化
1.延时15ms
2.写指令38H(不检测忙信号)
3.延时5ms
4.以后每次写指令,读/写数据操作均需要检测忙信号
5.写指令38h:显示模式设置
6.写指令08h:显示关闭
7.写指令01h:显示清屏
8.写指令06h:显示光标移动设置
9.写指令0ch:显示开及光标设置
相关代码
1 #include <REGX52.H> 2 #include "intrins.h" 3 sbit RS = P1^0; 4 sbit RW = P1^1; 5 sbit E = P1^2; 6 #define data_buffer P0 7 /* 8 用于读取LCD1602的忙碌状态 9 */ 10 11 void Delay15ms() //@11.0592MHz 12 { 13 unsigned char i, j; 14 15 i = 27; 16 j = 226; 17 do 18 { 19 while (--j); 20 } while (--i); 21 } 22 void Delay5ms() //@11.0592MHz 23 { 24 unsigned char i, j; 25 26 i = 9; 27 j = 244; 28 do 29 { 30 while (--j); 31 } while (--i); 32 } 33 34 void check_lcd_busy() 35 { 36 char tep = 0x80; 37 data_buffer = 0x80; 38 while(tep & 0x80) 39 { 40 RS = 0; 41 RW = 1; 42 E = 0; 43 _nop_(); 44 E = 1; 45 _nop_(); 46 tep = data_buffer; 47 } 48 } 49 void lcd_write_cmd(char cmd) 50 { 51 check_lcd_busy(); 52 RS = 0; 53 RW = 0; 54 E = 0; 55 data_buffer = cmd; 56 _nop_(); 57 E = 1; 58 _nop_(); 59 E = 0; 60 _nop_(); 61 } 62 void lcd_write_data(char datashow) 63 { 64 check_lcd_busy(); 65 RS = 1; 66 RW = 0; 67 E = 0; 68 data_buffer = datashow; 69 _nop_(); 70 E = 1; 71 _nop_(); 72 E = 0; 73 _nop_(); 74 } 75 void lcd_start() 76 { 77 Delay15ms(); 78 lcd_write_cmd(0x38); 79 Delay5ms(); 80 lcd_write_cmd(0x38); 81 lcd_write_cmd(0x08); 82 lcd_write_cmd(0x01); 83 lcd_write_cmd(0x06); 84 lcd_write_cmd(0x0c); 85 }
二.通过lcd1602显示一个字符
要求通过lcd1602显示字符“A”
分析:需要在屏幕上显示出资格字符,需要将显示的位置、显示的内容给屏幕,所以可以写出如下的代码
#include "reg52.h" #include "intrins.h" /* RS -- P1.0 RW -- P1.1 E -- P1.4 */ #define databuffer P0 //定义8位数据线,Po端口组 sbit RS = P1^0; sbit RW = P1^1; sbit EN = P1^4; void check_busy() { char tmp = 0x80; databuffer = 0x80; while(tmp & 0x80){//1000 0000 RS = 0; RW = 1; EN = 0; _nop_(); EN = 1; _nop_(); _nop_(); tmp = databuffer; EN = 0; _nop_(); } } void Write_Cmd_Func(char cmd) { check_busy(); RS = 0; RW = 0; EN = 0; _nop_(); databuffer = cmd; _nop_(); EN = 1; _nop_(); _nop_(); EN = 0; _nop_(); } void Write_Data_Func(char dataShow) { check_busy(); RS = 1; RW = 0; EN = 0; _nop_(); databuffer = dataShow; _nop_(); EN = 1; _nop_(); _nop_(); EN = 0; _nop_(); } void Delay15ms() //@11.0592MHz { unsigned char i, j; i = 27; j = 226; do { while (--j); } while (--i); } void Delay5ms() //@11.0592MHz { unsigned char i, j; i = 9; j = 244; do { while (--j); } while (--i); } void LCD1602_INIT() { //(1)延时 15ms Delay15ms(); //(2)写指令 38H(不检测忙信号) Write_Cmd_Func(0x38); //(3)延时 5ms Delay5ms(); //(4)以后每次写指令,读/写数据操作均需要检测忙信号 //(5)写指令 38H:显示模式设置 Write_Cmd_Func(0x38); //(6)写指令 08H:显示关闭 Write_Cmd_Func(0x08); //(7)写指令 01H:显示清屏 Write_Cmd_Func(0x01); //(8)写指令 06H:显示光标移动设置 Write_Cmd_Func(0x06); //(9)写指令 0CH:显示开及光标设置} Write_Cmd_Func(0x0c); } void main() { char position = 0x80 + 0x05; char dataShow = 'C'; LCD1602_INIT(); Write_Cmd_Func(position);//选择要显示的地址 Write_Data_Func(dataShow);//发送要显示的字符 }
三.通过lcd1602显示一行字符
分析:如果需要通过LCD1602显示一行字符,则需要定义出每一行的开始字符位置,比如,第一行从第五列开始显示,第二行开始从第一列显示,这样就可以通过LCD1602显示不同的字符串,根据以上要求可以写出如下的代码
#include <REGX52.H> #include "intrins.h" sbit RS = P1^0; sbit RW = P1^1; sbit E = P1^2; #define data_buffer P0 /* 用于读取LCD1602的忙碌状态 */ void Delay15ms() //@11.0592MHz { unsigned char i, j; i = 27; j = 226; do { while (--j); } while (--i); } void Delay5ms() //@11.0592MHz { unsigned char i, j; i = 9; j = 244; do { while (--j); } while (--i); } void check_lcd_busy() { char tep = 0x80; data_buffer = 0x80; while(tep & 0x80) { RS = 0; RW = 1; E = 0; _nop_(); E = 1; _nop_(); tep = data_buffer; } } void lcd_write_cmd(char cmd) { check_lcd_busy(); RS = 0; RW = 0; E = 0; data_buffer = cmd; _nop_(); E = 1; _nop_(); E = 0; _nop_(); } void lcd_write_data(char datashow) { check_lcd_busy(); RS = 1; RW = 0; E = 0; data_buffer = datashow; _nop_(); E = 1; _nop_(); E = 0; _nop_(); } void lcd_start() { Delay15ms(); lcd_write_cmd(0x38); Delay5ms(); lcd_write_cmd(0x38); lcd_write_cmd(0x08); lcd_write_cmd(0x01); lcd_write_cmd(0x06); lcd_write_cmd(0x0c); } void lcd1602_showlines(char row,char line ,char *string) //定义三个形式参数,分别表示行、列和字符串 { switch(row) { case 1: lcd_write_cmd(0x80 + line); while(*string) { lcd_write_data(*string); string++; } break; case 2: lcd_write_cmd(0x80 + 0x04 + line); while(*string) { lcd_write_data(*string); string++; } break; } } void main() { lcd_start(); lcd1602_showlines(1,3,"NO.1"); //通过第一行第三列开始显示内容“NO.1” lcd1602_showlines(2,0,"UP handsome"); //通过第二行第一列开始显示内容“UP handsome” }
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号