历史上的今天
返回首页

历史上的今天

今天是:2025年05月14日(星期三)

正在发生

2021年05月14日 | 51单片机串口通信1602显示

2021-05-14 来源:eefocus

简介:本文章是关于51单片机串口通信1602显示。


/*-----------------------------------------------

名称:LCD1602

论坛:

编写:

日期:2009.5

修改:无

内容:通过标准程序静态显示字符

引脚定义如下:1-VSS 2-VDD 3-V0 4-RS 5-R/W 6-E 7-14 DB0-DB7 15-BLA 16-BLK

------------------------------------------------*/

#include //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义

#include


void SendStr(unsigned char *s);


sbit RS = P2^6; //定义端口

sbit RW = P2^5; //写数据端

sbit EN = P2^7; //使能端


#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


#define DataPort P0

/*------------------------------------------------

uS延时函数,含有输入参数 unsigned char t,无返回值

unsigned char 是定义无符号字符变量,其值的范围是

0~255 这里使用晶振12M,精确延时请使用汇编,大致延时

长度如下 T=tx2+5 uS

------------------------------------------------*/

void DelayUs2x(unsigned char t)

{

while(--t);

}

/*------------------------------------------------

mS延时函数,含有输入参数 unsigned char t,无返回值

unsigned char 是定义无符号字符变量,其值的范围是

0~255 这里使用晶振12M,精确延时请使用汇编

------------------------------------------------*/

void DelayMs(unsigned char t)

{


while(t--)

{

//大致延时1mS

DelayUs2x(245);

DelayUs2x(245);

}

}

/*------------------------------------------------

判忙函数

------------------------------------------------*/

bit LCD_Check_Busy(void)

{

DataPort= 0xFF;

RS_CLR;

RW_SET;

EN_CLR;

_nop_();

EN_SET;

return (bit)(DataPort & 0x80);

}

/*------------------------------------------------

写入命令函数

------------------------------------------------*/

void LCD_Write_Com(unsigned char com)

{

while(LCD_Check_Busy()); //忙则等待

RS_CLR;

RW_CLR;

EN_SET;

DataPort= com;

_nop_();

EN_CLR;

}

/*------------------------------------------------

写入数据函数

------------------------------------------------*/

void LCD_Write_Data(unsigned char Data)

{

while(LCD_Check_Busy()); //忙则等待

RS_SET;

RW_CLR;

EN_SET;

DataPort= Data;

_nop_();

EN_CLR;

}


/*------------------------------------------------

清屏函数

------------------------------------------------*/

void LCD_Clear(void)

{

LCD_Write_Com(0x01);

DelayMs(5);

}

/*------------------------------------------------

写入字符串函数

------------------------------------------------*/

void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s)

{

if (y == 0)

{

LCD_Write_Com(0x80 + x); //表示第一行

}

else

{

LCD_Write_Com(0xC0 + x); //表示第二行

}

while (*s)

{

LCD_Write_Data( *s);

s ++;

}

}

/*------------------------------------------------

写入字符函数

------------------------------------------------*/

void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data)

{

if (y == 0)

{

LCD_Write_Com(0x80 + x);

}

else

{

LCD_Write_Com(0xC0 + x);

}

LCD_Write_Data( Data);

}

/*------------------------------------------------

初始化函数

------------------------------------------------*/

void LCD_Init(void)

{

LCD_Write_Com(0x38); /*显示模式设置*/

DelayMs(5);

LCD_Write_Com(0x38);

DelayMs(5);

LCD_Write_Com(0x38);

DelayMs(5);

LCD_Write_Com(0x38);

LCD_Write_Com(0x08); /*显示关闭*/

LCD_Write_Com(0x01); /*显示清屏*/

LCD_Write_Com(0x06); /*显示光标移动设置*/

DelayMs(5);

LCD_Write_Com(0x0C); /*显示开及光标设置*/

}




/*------------------------------------------------

串口初始化

------------------------------------------------*/

void InitUART (void)

{

SCON = 0x50; // SCON: 模式 1, 8-bit UART, 使能接收

TMOD |= 0x20; // TMOD: timer 1, mode 2, 8-bit 重装

TH1 = 0xFD; // TH1: 重装值 9600 波特率 晶振 11.0592MHz

TR1 = 1; // TR1: timer 1 打开

EA = 1; //打开总中断

// ES = 1; //打开串口中断

}


/*------------------------------------------------

发送一个字节

------------------------------------------------*/

void SendByte(unsigned char dat)

{

SBUF = dat;

while(!TI);

TI = 0;

}

/*------------------------------------------------

发送一个字符串

------------------------------------------------*/

void SendStr(unsigned char *s)

{

while(*s!='') // 表示字符串结束标志,通过检测是否字符串末尾

{

SendByte(*s);

s++;

}

}

/*------------------------------------------------

串口中断程序

------------------------------------------------*/

void UART_SER (void) interrupt 4 //串行中断服务程序

{

unsigned char Temp; //定义临时变量

if(RI) //判断是接收中断产生

{

RI=0; //标志位清零

Temp=SBUF; //读入缓冲区的值

P1=Temp; //把值输出到P1口,用于观察

SBUF=Temp; //把接收到的值再发回电脑端

//LCD_Write_String(0,0,SBUF); //把从串口接收到的值输出到1602屏上

//问题1:要实现把接收到的值输出到1602屏上

// 正确代码应该怎样写

//问题2:电脑串口调试工具输入的汉字

// 1602上是不能显示的,该怎样处理

}

if(TI)

{ //如果是发送标志位,清零

TI=0;

}

}


/*------------------------------------------------

主函数

------------------------------------------------*/

void main(void)

{

LCD_Init();

LCD_Clear();//清屏

LCD_Write_String(1,0,"1602 Good! OK!");

InitUART();

SendStr("串口通信单片机测试 电脑串口调试工具发送信息 显示到1602显示屏上");

ES = 1;

while (1)

{

LCD_Write_Char(7,1,'o'); //写一个字符到显示屏上 前面的数字是坐标

LCD_Write_Char(8,1,'k');

//LCD_Write_String(2,0,"test....");

}

}


推荐阅读

史海拾趣

Echelon公司的发展小趣事

尽管Echelon在能源管理领域取得了显著的成绩,但公司也面临着一些挑战。随着数字化、智能化技术的不断发展,传统能源管理市场正在发生深刻变革。为了应对这些挑战,Echelon积极调整战略方向,加大在数字化、智能化技术方面的投入。同时,公司还加强了对新兴市场的关注和布局,寻找新的增长点。未来,Echelon将继续秉承创新、合作、共赢的理念,推动能源管理行业的持续发展和进步。

ELESTA GmbH公司的发展小趣事

2013年,ELESTA公司更名为ELESTA GmbH,这一品牌重塑标志着公司进入了新的发展阶段。同时,ELESTA也开始实施全球化战略,积极拓展国际市场,通过不断提升产品质量和服务水平,赢得了全球客户的信赖和认可。

Babcock Inc公司的发展小趣事

Babcock深知技术创新是公司发展的核心动力。因此,公司始终保持着对技术研发的持续投入。通过不断引进先进设备、优化研发流程、加强团队建设等措施,Babcock的技术实力得到了不断提升。同时,公司还注重与高校和研究机构的合作,共同推动电子技术的创新发展。

Armel Electronics Inc公司的发展小趣事

随着公司产品的不断升级和市场的逐步扩大,Armel Electronics Inc公司开始寻求更广阔的市场空间。公司积极与国内外知名企业展开合作,共同开发新产品,开拓新市场。通过国际合作,Armel不仅提升了自身的技术水平,还进一步扩大了市场份额,实现了公司的快速发展。

Bridgelux公司的发展小趣事

Bridgelux在LED照明技术方面取得了重要突破。公司研发出了一种新型的LED芯片结构,提高了光效和稳定性,降低了成本。这一创新使得Bridgelux的产品在市场上更具竞争力,也为其赢得了众多客户的青睐。同时,公司还注重知识产权保护,积极申请专利,确保自身技术的领先地位。

Ememory Technology Inc公司的发展小趣事

eMemory自1989年成立以来,始终致力于半导体硅智财(IP)的研发与创新。公司凭借其独特的可编程非挥发性内存(NVM)技术,如NeoFuse和NeoPUF,迅速在半导体IP领域崭露头角。eMemory不仅将这些技术应用于自家的芯片产品中,还通过IP授权的方式,与全球众多芯片设计厂商建立了紧密的合作关系,推动了整个电子行业的发展。

问答坊 | AI 解惑

关于memcpy函数的使用问题

/*函数名: memcpy 功  能: 从源source中拷贝n个字节到目标destin中 用  法: void *memcpy(void *destin, void *source, unsigned n); */   有的资料说是从源source中拷贝n个字符,或者元素 到目标中 究竟是字节呢 还是字符 ...…

查看全部问答>

请教外部存储器件e2prom的问题

24c04可以存储512个字节,如果存满了,有没有一个返回信息? 还是什么时候存满必须程序员自己计算? 谢谢~~…

查看全部问答>

问题分析,大家来研究一个图纸。

紧急求助 各位: 大家好,附件产品就是水位传感器,那位仁兄能帮我解释下,附件的原理,是怎么来运动的, 另外还有上电自检2.5S ,靠什么来自检的。 另外可变电阻R10,是来起什么作用的。 具体原理图和要求见下。…

查看全部问答>

关于运放发热

接通电源后,运放开始发热,但电源供电正常,且运放能正常工作。请问这是为什么啊?…

查看全部问答>

申请MSP-EXP430FR5739实验板套件团购

申请一块 [ 本帖最后由 hero245 于 2011-11-19 00:00 编辑 ]…

查看全部问答>

8051单片机彻底研究

前几天,琳子问我有没有那种写如何从一个毕业的学生成为合格的单片机设计师的书   其实各种单片机操作方式不一样,所以一般书都是针对一种单片机去讲的,作为单片机最基础的51, 一般在大学里都有教授,最近正好看到一套讲解51的书,共四册 ...…

查看全部问答>

IAR下MSP430的启动代码到底是怎么回事?

之前已在网上搜索过相关的资料,IAR下MSP430的启动文件有很多人说是  C:\\Program Files\\IAR Systems\\Embedded Workbench 6.0 Evaluation\\430\\src\\lib\\430下的cstartup.s43(IAR5.3,似乎相近版本也是)。但昨天在开始学习启动代码时 ...…

查看全部问答>

印刷电路板设计(PCB)问题 (ADI电路设计)

印刷电路板设计(PCB)问题  书籍推荐 …

查看全部问答>

【TI首届低功耗设计大赛】CCS6.0.0环境搭建

              本人系统是WIN8,由于WIN8默认不安装.net framework 3.5。但是,CCS6.0在.net framework 3.5才能正常安装。所以大家在win8下安装CCS6.0后会提示出现inter错误,这时可以看看自己的 ...…

查看全部问答>

AD7606采集语音信号出现诡异杂波,请大神们帮忙看看

小弟最近在做DSP从AD7606同步采集6路语音信号,代码是使用一个定时器去定时开启中断,进入中断去启动AD转换,然后拿取数据。采集出来的语音信号有电流声。转换成语谱图如下: 横坐标时间,2s,纵坐标频率。 \0\0\0eeworldpostqq…

查看全部问答>