打印
[CAN-bus/DeviceNet]

串口控制液晶

[复制链接]
1797|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ljt4810|  楼主 | 2007-6-5 11:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  我想通过串口向液晶里写字,但不知道如何从串口读数据.
如:uint8 str[]={0x30,0x31,0x32}    
  for(i=0;i<3;i++);
  wr_lcd (dat,str]);液晶上显012,如果从EasyARM(上位机软件)上发送0x30,0x31,0x32 该怎样编程呢? 麻烦提示一下! 

相关帖子

沙发
ljt4810|  楼主 | 2007-6-5 20:56 | 只看该作者

杂没人回呢?

typedef struct UartMode
{
    uint8 datab;    // 字长度,5/6/7/8可选
    uint8 stopb;    // 停止位,1/2可选
    uint8 parity;    // 奇偶校验位,0-无校验,1-奇校验,2-偶校验
}UARTMODE;

uint8 rcv_buf[8];        // UART0数据接收缓冲区
volatile uint8 rcv_new;    // 接收新数据标志

/*
*********************************************************************************************************
** 函数名称 :IRQ_UART0()
** 函数功能 :串口0接收中断服务程序
** 入口参数 :无
** 出口参数 :无
*********************************************************************************************************
*/
void __irq IRQ_UART0 (void)
{
    uint8 i;
    
    if ((U0IIR & 0x0F) == 0x04)    
        rcv_new = 1;    // 设置接收到新的数据标志
    for (i=0; i<8; i++)
    {
    rcv_buf = U0RBR;  // 读取FIFO的数据,并清除中断    
    }
    VICVectAddr = 0x00;    // 中断处理结束
}

/*
*********************************************************************************************************
** 函数名称 :UART0_SendByte()
** 函数功能 :向串口0发送1字节数据
** 入口参数 :dat    要发送的数据
** 出口参数 :无
*********************************************************************************************************
*/
void UART0_SendByte (uint8 dat)
{
    U0THR = dat;    // 要发送的数据
}

/*
*********************************************************************************************************
** 函数名称 :UART0_SendBuf()
** 函数功能 :向串口发送8字节数据
** 入口参数 :无
** 出口参数 :无
*********************************************************************************************************
*/
void UART0_SendBuf (void)
{
    uint8 i;
    
    for (i=0; i<8; i++)
        UART0_SendByte(rcv_buf);
    while ((U0LSR & 0x20) == 0);    // 等待数据发送完毕
}

/*
*********************************************************************************************************
** 函数名称 :UART0_Init()
** 函数功能 :串口初始化,设置工作模式和波特率。
** 入口参数 :baud    波特率
**              set    模式设置(UARTMODE数据结构)
** 出口参数 :1-初始化成功,  0-初始化失败
*********************************************************************************************************
*/
int8 UART0_Init (uint32 baud, UARTMODE set)
{
    uint32 bak;
    
    /* 参数过滤 */
    if ((baud ==0 ) || (baud > 115200))    return (0);
    if ((set.datab <5) || (set.datab > 8))    return (0);
    if ((set.stopb == 0) || (set.stopb > 2))     return (0);
    if (set.parity > 4)    return (0);
    
    /* 设置串口波特率 */
    U0LCR = 0x80;                        // DLAB = 1    
    bak   = (Fpclk >> 4) / baud;
    U0DLM = bak >> 8;
    U0DLL = bak & 0xFF;
    
    /* 设置串口模式 */
    bak   = set.datab - 5;                // 设置字长
    if (set.stopb == 2)    bak |= 0x04;    // 判断是否为2位停止位
    
    if (set.parity != 0)
    {
        set.parity = set.parity - 1;
        bak |= 0x08;
    }
    bak |= set.parity << 4;                // 设置奇偶校验
    
    U0LCR = bak;
    
    return (1);
}


/*
*********************************************************************************************************
** 函数名称 :main()
** 函数功能 :从串口UART0接收字符串"ABCDEFGH",并发送回上位机显示。
** 调试说明 :需要PC串口显示终端软件如EasyARM.exe。
*********************************************************************************************************
*/
int main (void)
{
    UARTMODE set;

    set.datab  = 8;
    set.stopb  = 1;
    set.parity = 0;
    
    rcv_new = 0;
    
    PINSEL0 = 0x00000005;    // 设置I/O连接到UART0
    
    UART0_Init(115200, set);     // 串口初始化
    U0FCR = 0x81;        // 使能FIFO,并设置触发点为8字节
    U0IER = 0x01;        // 允许RBR中断,即接收中断
    
    IRQEnable();        // 使能IRQ中断
    /* 使能UART0中断 */
 VICIntSelect = 0x00000000;          // 设置所有的通道为IRQ中断
 VICVectCntl0 = 0x20 | 0x06;    // UART0分配到IRQ slot0,即最高优先级
 VICVectAddr0 = (uint32)IRQ_UART0;    // 设置UART0向量地址
 VICIntEnable = 1 << 0x06;          // 使能UART0中断

  init_lcd();                   //液晶初始化
   delay1 (10) ;
  clrram ();          //清屏
  delay1 (50) ;
 wr_lcd (comm,0x80);      //液晶起始行
 delay1 (10) ;
if (rcv_new == 1)
 rcv_new =0;
  for(i=0;i<8;i++)
  {  
 wr_lcd (dat,rcv_buf);
 delay1 (10) ; 
}
}
大家过来看看什么地方错了!


使用特权

评论回复
板凳
ljt4810|  楼主 | 2007-6-8 15:02 | 只看该作者

没人做过串口吗?

  难道没人做过串口吗?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

19

帖子

0

粉丝