6068|4

2

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

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<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#include<intrins.h>

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!='\0')         // \0 表示字符串结束标志,通过检测是否字符串末尾
  {
   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....");
 }
}

 

7-Mao-51MPU.rar

18.35 KB, 下载次数: 129

Keil uVision3 51C源代码

此帖出自单片机论坛

最新回复

//问题1:要实现把接收到的值输出到1602屏上    //       正确代码应该怎样写    //问题2:电脑串口调试工具输入的汉字    //       1602上是不能显示的,该怎样处理  详情 回复 发表于 2016-4-16 00:00
点赞 关注(1)
 

回复
举报

2

帖子

0

TA的资源

一粒金砂(中级)

沙发
 

请教 前辈指导 两个问题

//问题1:要实现把接收到的值输出到1602屏上
   //       正确代码应该怎样写
   //问题2:电脑串口调试工具输入的汉字
   //       1602上是不能显示的,该怎样处理


代码和源文件在 楼上
此帖出自单片机论坛
 
 

回复

304

帖子

0

TA的资源

一粒金砂(高级)

板凳
 
能实现吗????
此帖出自单片机论坛
 
 
 

回复

12

帖子

0

TA的资源

一粒金砂(中级)

4
 
谢谢分享。
此帖出自单片机论坛
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

5
 
//问题1:要实现把接收到的值输出到1602屏上
   //       正确代码应该怎样写
   //问题2:电脑串口调试工具输入的汉字
   //       1602上是不能显示的,该怎样处理
此帖出自单片机论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表