搜索
bottom↓
回复: 1

51串口发送并在1602指定的位置显示

[复制链接]

出0入0汤圆

发表于 2012-2-5 16:40:30 | 显示全部楼层 |阅读模式
写的不是很好,也希望和大家交流一下

/********************************************************************
* 文件名  : 串口接收试验.c
* 描述    :  该程序从串口接收数据,通过LCD显示数据。在LCD的第一行显示出来,
                         当数据过多时(超过16个字符),LCD第一行将会被覆盖。
                         该试验使用的晶振是11.0592,如果使用12M晶振,会出现串口接收
                         不正常的情况。原因是用12M晶振,波特率9600时的误差率达 8%。                         
***********************************************************************/
#include<reg52.h>
#include<intrins.h>

#define uchar unsigned char
#define uint  unsigned int

uchar LED_Buffer[16], *q, com_dat;      //从串口接收的数据

sbit E=P2^7;                //1602使能引脚
sbit RW=P2^6;                //1602读写引脚       
sbit RS=P2^5;                //1602数据/命令选择引脚
//***************
void Delay(uint del)  //延时
{       
        while(i--);
         
}


/********************************************************************
* 名称 : Convert(uchar In_Date)
* 功能 : 因为电路设计时,P0.0--P0.7接法刚好了资料中的相反,所以设计该函数。
* 输入 : 1602资料上的值
* 输出 : 送到1602的值
***********************************************************************/
uchar Convert(uchar In_Date)
{
    uchar i, Out_Date = 0, temp = 0;
    for(i=0; i<8; i++)
    {
        temp = (In_Date >> i) & 0x01;
        Out_Date |= (temp << (7 - i));
    }
    return Out_Date;
}

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

void enable(uchar del)  //使能
{
        P0 = Convert(del);
        RS = 0;
        RW = 0;
        E = 0;
        delay();
        E = 1;
        delay();
}

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

void write(uchar del)   //写数据
{
        P0 = Convert(del);
        RS = 1;
        RW = 0;
        E = 0;
        delay();
        E = 1;
        delay();
}

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

void L1602_init(void)  //1602初始化
{
        enable(0x01);
        enable(0x38);
        enable(0x0c);
        enable(0x06);
        enable(0xd0);
}

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

void L1602_string(uchar hang,uchar lie,uchar *p)//从指定的位置开始显示
{
        uchar a;
        if(hang == 1) a = 0x80;
        if(hang == 2) a = 0xc0;
        a = a + lie - 1;
        enable(a);
        while(1)
        {
                if(*p == '\0') break;
                write(*p);
                p++;
        }
}

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

void Com_Int(void) interrupt 4 //串口中断子函数
{
        EA = 0;
        if(RI == 1)   
        {
                LED_Buffer[com_dat] = SBUF;                
                RI = 0;
                com_dat++;
                if(com_dat == 16) com_dat = 0;               
        }
        EA = 1;
}

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

void Com_Init(void) //串口初始化,晶振11.0592,波特率9600
{
     TMOD = 0x20;   
     PCON = 0x00;   
     SCON = 0x50;       
     TH1 = 0xFd;   
     TL1 = 0xFd;
     TR1 = 1;               
     ES = 1;               
     EA = 1;                       
}

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

void Main()
{
        uchar i = 0, com_dat = 0;       
        L1602_init();
        Delay(100);
        Com_Init();
        P2 = 0x00;
        while(1)
        {
                q = LED_Buffer;       
                L1602_string(1,1,q);
                com_dat = 0;       
                Delay(100);
        }
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2013-11-2 18:59:27 | 显示全部楼层
赶上了,,感谢下
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-26 05:15

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表