历史上的今天
今天是:2024年12月09日(星期一)
2020年12月09日 | 详细LCD1602串行或者并行数据传输51单片机程序
2020-12-09 来源:51hei
单片机串行源程序如下:
#include "reg52.h"
#include //LCD1602接口定义 #define LCD_DATA P1 //P1口(P14~P17)与LCD高四位(D4~D7)对应相接 sbit LCD1602_RS=P1^2; //数据指令 sbit LCD1602_EN=P1^3; //使能 //延时函数,12mhz 6t延迟时间10*255us void LCD_init(void); void LCD_en_write(void); void LCD_write_command(unsigned char command) ; void LCD_write_data(unsigned char Recdata); void LCD_set_xy (unsigned char x, unsigned char y); void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s); void LCD_write_char(unsigned char X,unsigned char Y,unsigned char Recdata); void delay_nus(unsigned int n); void delay_nms(unsigned int n); //以下函数用于输出字符串和数字 int LCD_PutNum(unsigned long num,int XS,int pos); int LCD_PutStr(unsigned char *DData,int pos); //-------------------------1us延时函数--------------------------------- void delay_1us(void) { _nop_(); } //------------------------N us延时函数--------------------------------- void delay_nus(unsigned int n) { unsigned int i=0; for (i=0;i } //-----------------------1ms延时函数---------------------------------- void delay_1ms(void) { unsigned int i; for (i=0;i<1140;i++); } //-----------------------N ms延时函数--------------------------------- void delay_nms(unsigned int n) { unsigned int i=0; for (i=0;i } //------------------------液晶初始化----------------------------------- void LCD_init(void) { LCD_write_command(0x28); delay_nus(40); LCD_write_command(0x28); delay_nus(40); LCD_write_command(0x28); delay_nus(40); LCD_en_write(); delay_nus(40); LCD_write_command(0x28); //4位显示 LCD_write_command(0x0c); //显示开 LCD_write_command(0x01); //清屏 delay_nms(2); } //----------------------液晶使能函数------------------------------------- void LCD_en_write(void) { //EN由高电平跳变到低电平时液晶使能 LCD1602_EN=1; delay_nus(1); LCD1602_EN=0; } //------------------------写指令函数-------------------------------------- void LCD_write_command(unsigned char command) { delay_nus(16); LCD1602_RS=0; //RS=0 LCD_DATA &=0X0f; //清高四位 LCD_DATA|=command&0xf0; //写高四位 LCD_en_write(); command=command<<4; //低四位移到高四位 LCD_DATA&=0x0f; //清高四位 LCD_DATA|=command&0xf0; //写低四位 LCD_en_write(); } //------------------------写数据函数-------------------------------------- void LCD_write_data(unsigned char Recdata) { delay_nus(16); LCD1602_RS=1; //RS=1 LCD_DATA&=0X0f; //清高四位 LCD_DATA|=Recdata&0xf0; //写高四位 LCD_en_write(); Recdata=Recdata<<4; //低四位移到高四位 LCD_DATA&=0X0f; //清高四位 LCD_DATA|=Recdata&0xf0; //写低四位 LCD_en_write(); } //-----------------------地址定位函数------------------------------------- void LCD_set_xy( unsigned char x, unsigned char y ) { unsigned char address; if (y == 0) address = 0x80 + x; else address = 0xc0 + x; LCD_write_command(address); } //----------------------在某个地址处,写一个字符---------------------------- void LCD_write_char(unsigned char X,unsigned char Y,unsigned char Recdata) //列x=0~15,行y=0,1 { LCD_set_xy(X, Y); //写地址 LCD_write_data(Recdata); } //----------------------------输出字符串------------------------------------- int LCD_PutStr(unsigned char *DData,int pos) //pos表示字符显示位置,0~31 { unsigned char i; if(pos==-1) { LCD_write_command(0x01); //清屏 delay_nms(2); pos=0; } while((*DData)!='




