上位机串口发送至单片机1602液晶

发布者:Howard_Sun最新更新时间:2015-04-30 来源: 51hei关键字:上位机  串口发送  单片机  1602液晶 手机看文章 扫描二维码
随时随地手机看文章
/*****************************************************************

串行通迅     LCD1602显示                                                    
*************************************************************************
* 描述:(用串口调试助手软件观察)                                                           
*   主机发送123456给单片机,单片机接收到数据后发送TX-MCU给主机。   *
*   主机发送其它数据给单片机,单片机接收到数据后,再发送给主机。   *
*   LCD1602显示接收数据的ASCII码。  波特率9600           *
*   注:当单片机收到数据只有凑够16个时才会一次在液晶上显示出来 *
************************************************************************/

#include
#include
#define uchar  unsigned char 
#define uint   unsigned int

sbit LCD_RS = P3^5;             
sbit LCD_EN = P3^4;
sbit LCD_WR = P3^6;

#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};


uchar data  RXDdata[ ] = {0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
                          0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20 };
uchar temp,buf,m,count;

bit   playflag=0;

uchar code  cdis1[ ] = {" SERILA TRANFER "};
uchar code  cdis2[ ] = {"                "};

/**********************************************************

 延时子程序

**********************************************************/
void delay1(uint ms)

{
   uchar k;
   while(ms--)
   {
     for(k = 0; k < 120; k++);
   }
}

/******************************************************************/
/*                                                                */
/*检查LCD忙状态                                                   */
/*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据。     */
/*                                                                */
/******************************************************************/ 
bit lcd_busy()
 {                          
    bit result;
    LCD_RS = 0;
//    LCD_RW = 1;
    LCD_EN = 1;
    delayNOP();
    result = (bit)(P0&0x80);
    LCD_EN = 0;
    return(result); 
 }

/*******************************************************************/
/*                                                                 */
/*写指令数据到LCD                                                  */
/*RS=L,RW=L,E=高脉冲,D0-D7=指令码。                             */
/*                                                                 */
/*******************************************************************/
void lcd_wcmd(uchar cmd)
{                          
 //  while(lcd_busy());
    LCD_RS = 0;
    LCD_WR = 0;
    LCD_EN = 0;
    _nop_();
    _nop_(); 
    P0 = cmd;
    delayNOP();
    LCD_EN = 1;
    delayNOP();
    LCD_EN = 0;  
}[page]

/*******************************************************************/
/*                                                                 */
/*写显示数据到LCD                                                  */
/*RS=H,RW=L,E=高脉冲,D0-D7=数据。                               */
/*                                                                 */
/*******************************************************************/
void lcd_wdat(uchar dat)
{                          
//   while(lcd_busy());
    LCD_RS = 1;
    LCD_WR = 0;
    LCD_EN = 0;
    P0 = dat;
    delayNOP();
    LCD_EN = 1;
    delayNOP();
    LCD_EN = 0; 
}

/*******************************************************************/
/*                                                                 */
/*  LCD初始化设定                                                  */
/*                                                                 */
/*******************************************************************/
void lcd_init()

    delay1(15);   
    lcd_wcmd(0x01);      //清除LCD的显示内容            
    lcd_wcmd(0x38);      //16*2显示,5*7点阵,8位数据
    delay1(5);
    lcd_wcmd(0x38);         
    delay1(5);
    lcd_wcmd(0x38);         
    delay1(5);

    lcd_wcmd(0x0c);      //开显示,显示光标,光标闪烁
    delay1(5);

    lcd_wcmd(0x01);      //清除LCD的显示内容
    delay1(5);
}

/*******************************************************************/
/*                                                                 */
/*  设定显示位置                                                   */
/*                                                                 */
/*******************************************************************/

void lcd_pos(uchar pos)
{                          
  lcd_wcmd(pos | 0x80);  //数据指针=80+地址变量
}

/*********************************************************

  发送数据函数

*********************************************************/
void senddata(uchar dat)
{
     SBUF =dat;
     while(!TI);
     TI = 0;
}

/*********************************************************

  串行中断服务函数

*********************************************************/
void  serial() interrupt 4 
{
   ES = 0;                //关闭串行中断
   RI = 0;                //清除串行接受标志位
   buf = SBUF;            //从串口缓冲区取得数据
     
   switch(buf)
   {
      case 0x31:  senddata('T');break;  //接受到1,发送字符'T'给计算机         
      case 0x32:  senddata('X');break;  //接受到2,发送字符'X'给计算机       
      case 0x33:  senddata('-');break;  //接受到3,发送字符'-'给计算机       
      case 0x34:  senddata('M');break;  //接受到4,发送字符'M'给计算机       
      case 0x35:  senddata('C');break;  //接受到5,发送字符'C'给计算机           
      case 0x36:  senddata('U');break;  //接受到5,发送字符'U'给计算机                  
      default:    senddata(buf);break;  //接受到其它数据,将其发送给计算机         
   }

   if(buf!=0x0D)
   {   
     if(buf!=0x0A)
     { 
       temp =buf;
       if(count<16)
       {         
         RXDdata[count]=temp;
         count++;
if(count==16)
playflag=1;
       }
     } 
   }
   ES = 1;    //允许串口中断
}

/*********************************************************

  数据显示函数

*********************************************************/
void  play()
{
   if(playflag)
   { 
     lcd_pos(0x40);           //设置位置为第二行
     for(m=0;m<16;m++) 
     {
lcd_wdat(cdis2[m]);      //清LCD1602第二行
delay1(5);
}
lcd_pos(0x40);           //设置位置为第二行
     for(m=0;m<16;m++)
     {
    //   lcd_pos(0x40+m);       //设置显示位置为第二行
       lcd_wdat(RXDdata[m]);  //显示字符 
  delay1(5);
     }

     playflag=0;              
     count=0x00;

     for(m=0;m<16;m++)      
     {
RXDdata[m]=0x20;         //清显存单元    
delay1(5);
}
   }               
}

/*********************************************************

  主函数

*********************************************************/
void main(void) 
{
    P0 = 0xff;
    P2 = 0xff;         
    
    SCON=0x50;           //设定串口工作方式
    PCON=0x00;           //波特率不倍增
    TMOD=0x20;           //定时器1工作于8位自动重载模式, 用于产生波特率
    EA=1;
    ES = 1;              //允许串口中断
    TL1=0xfd;
    TH1=0xfd;             //波特率9600
    TR1=1;

    lcd_init();
    lcd_pos(0x00);        //设置显示位置为第一行
    for(m=0;m<16;m++) 
    {
lcd_wdat(cdis1[m]);   //显示字符
delay1(5);
}
    lcd_pos(0x40);        //设置显示位置为第二行
    for(m=0;m<16;m++) 
    {
lcd_wdat(cdis2[m]);   //显示字符            
  delay1(5);
}
    while(1)        
    {
      play();       
    }
}

/*********************************************************/

关键字:上位机  串口发送  单片机  1602液晶 引用地址:上位机串口发送至单片机1602液晶

上一篇:测试漏电保护线圈
下一篇:DS18B20-64位序列码读取程序

推荐阅读最新更新时间:2024-03-16 14:00

汽车MCU研究:“缺芯”大环境下国产供应商寻求自主替代
产能集中、疫情反复,MCU缺货情况暂难缓解 MCU是用于汽车控制的核心芯片,应用范围涉及车身动力、行车控制、信息娱乐、辅助驾驶等。 MCU芯片市场成熟,格局较为稳定,恩智浦、英飞凌、瑞萨电子、意法半导体、德州仪器长期占据全球汽车MCU市场TOP5的位置。2020年全球车规级MCU市场CR7(由国际大厂占据)市场占有率超过95%。 汽车MCU规格多,制程技术多为40/45/65纳米,产线营运成本高,因此恩智浦、瑞萨、英飞凌、德州仪器及微芯科技等IDM厂多采取晶圆委外代工策略。而车规级MCU代工领域集中度较高,全球70%的汽车MCU都由台积电生产,但是MCU芯片整体的产能只占到了台积电全部产能的3%。 2020年受疫情影
[汽车电子]
汽车<font color='red'>MCU</font>研究:“缺芯”大环境下国产供应商寻求自主替代
意法推出配备1MB闪存的STM32微控制器
    意法半导体扩大STM32 微控制器产品阵容,增加更多特性和最高1MB的片上闪存。新增闪存容量让STM32开发人员可用存储容量增加一倍以上,可支持未来的产品升级,可提高系统性能,并提供先进的应用特性,如消费电子和工业产品的下一代图形用户界面。     随着STM32 XL高密度产品的发布,意法半导体现有STM32微控制器达99款 ,是业内产品型号最多的ARM Cortex-M3 32位微控制器,提供各种存储密度和操作速度,并集成多种功能特性,以满足各种的应用需求。。所有的STM32产品的引脚和软件都相互兼容,共用同一个外设资源库。这种平台共用性让开发人员只需少量的设计即可升级产品,将相同的知识产权、工具和硬件用于多
[单片机]
用PIC单片机实现50Hz锁相信号发生器
    摘要: 在UPS不间断电源系统的设计中,与外部交流电压锁相的50Hz正弦信号发生器是十分关键的一部分,本文介绍了一种利用数字信号处理技术通过PIC单片机实现此电路的方法。     关键词: 单片机 信号发生器 数字信号处理 引言 不间断电源(UPS)通过逆变向用电设备提供纯净、稳定的电能,保证设备的正常运行,50Hz锁相正弦信号发生器则是其中的关键部分,作为系统输出电压的基准,不但要求它的输出信号频率和幅度稳定,还要与外部交流电的电压相位同步。 传统的交流信号发生方式采用反馈振荡电路,利用电路的自激振荡和选频作用输出正弦波,但是低频模拟振荡器有一个缺点:受电压和温度影响大,输出信号的频率和幅度
[工业控制]
基于单片机的快速代码生成方法
随着软硬件技术的不断发展,系统的开发周期显得越来越重要,但开发的时间与系统安全性之间又有一定的冲突。假如依旧采用传统的编写代码的方式,显然企业将会失去很多的机会。文中介绍一种基于模型的快速代码生成的方法,可以满足这种高性能和快节奏研发的需求。MATLAB集成了各类应用领域的专用库函数和模块,用于数值计算、系统建模的软件包。 Simulink工具可以对分系统或单个仿真模型进行设计。RTW(Real Time Workshop)是MATLAB提供的自动化代码生成工具,将Simulink模型框图转化为标准的C语言代码。学会利用 MATLAB/Simulink创建仿真模型,利用MATLABRTW工具,通过这种方式在IAR环境中对Simuli
[单片机]
基于<font color='red'>单片机</font>的快速代码生成方法
AVR单片机i/o(输入/输出)端口详解
通过前面示例的讲解,已基本知道了单片机I/O端口的用法。为了更好、更深入地运用好I/O端口,下面再来详细讨论一下AVR单片机ATMega16的端口结构。 输入/输出端口(I/O端口)是单片机所能依赖进行控制的唯一通道,如果把单片机内核比作人的大脑,那I/O端口就相当于人的五官和四肢,负责着信息的获取和动作的执行,如果没有I/O端口单片机本身就变得毫无意义,因此很有必要来详细了解它们的内部结构。ATMega16的端口为具有可选上拉电阻的双向I/O端口,下面是其中某一位I/O口的内部结构图(来自于Datasheet)。 在上图中,Pxn就是这一位的输入/输出端口,也就是单片机的某个外部引脚。它通过PORTxn寄存器和数据总线(DA
[单片机]
单片机MSP430入门-理论⑦--定时器模块-定时器A②
上期大概给大家汇总介绍了,定时器模块中比较重要并且常用的定时器A,大概说了下定时器A的两种常用模式,比较模式和捕获模式 本期将继续介绍定时器A,这次将整理一些关于定时器A的,各寄存器的用法以及功能 1.0 首先说一下TACTL控制寄存器 先大概解释下这几个位的作用: Unused bits 15-10 未定义 TASSELx bits 9-8 选择Timer_A的时钟源, 00为TACLK(用于特定的外部引脚信号),01为ACLK(辅助时钟),10为SMCLK(子系统时钟),11为INCLK(见器件说明) IDx bits 7-6 给时钟源确定分频因子, 00为不分频,01为时钟源的二分之一,10为时钟源的四分
[单片机]
<font color='red'>单片机</font>MSP430入门-理论⑦--定时器模块-定时器A②
STM8单片机GPIO操作
设置GPIO的寄存器包括:输出寄存器(ODR),输入寄存器(IDR),方向寄存器(DDR),控制寄存器1(CR1)和控制寄存器2(CR2),可以利用后面三个寄存器组配置GPIO的8种模式。 固件库函数给出了GPIO 8种模式的定义,在上面的基础上加入了输出高/输出低电平的状态。 GPIO_Mode_In_FL_No_IT 浮空输入,无外部中断 GPIO_Mode_In_PU_No_IT 上拉输入,无外部中断 GPIO_Mode_In_FL_IT 浮空输入,有外部中断 GPIO_Mode_Out_OD_Low_Fast 开漏输出低电平 10MHZ GPIO_Mode_Out_PP_Low_Fast 推挽输出低电平
[单片机]
英飞凌推出全新MCU系列产品 进军摩托车引擎控制应用领域
英飞凌科技股份公司(FSE/NYSE: IFX)近日推出了全新微控制器系列,瞄准不断增长的全球摩托车引擎控制市场。 具有32位性能的XC2700系列微控制器以其卓越的性能将助力全球系统制造商打造经济高效的摩托车电子引擎装置,并满足即将颁布的排放标准要求。中国和印度是世界上最大的摩托车市场,将在明年推出更加严格的排放控制标准,这进一步推动了市场对经济高效的电子引擎管理系统的需求。 预计到2010年,印度的摩托车产量将达到1500万辆,远高于2005年的670万辆。中国到2010年的摩托车产量更将高达2100万辆,而2005年则为1700万辆。尽管当前对摩托车的油耗和排放方面的要求越来越高,但是这些地区的消费者要求摩托车的销售价格
[新品]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved