OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3276|回复: 1

通过串口接收数据并发送到LCD,LCD无显示

[复制链接]

3

主题

5

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2019-5-8
在线时间
5 小时
发表于 2019-5-20 18:39:38 | 显示全部楼层 |阅读模式
5金钱
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "lcd.h"
#include "key.h"
#include "exti.h"


//ALIENTEK 探索者STM32F407开发板 实验4
//串口通信实验 -库函数版本
//技术支持:www.openedv.com
//淘宝店铺:http://eboard.taobao.com
//广州市星翼电子科技有限公司  
//作者:正点原子 @ALIENTEK
#define Datanumber 12
int Optime[12][2];


int main(void)
{
        u8 t;
        u8 len;       
        u16 times=0;  
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
        delay_init(168);                //延时初始化
        uart_init(115200);        //串口初始化波特率为115200
        LED_Init();                                  //初始化与LED连接的硬件接口
        KEY_Init();         //初始化与按键连接的硬件接口
        LCD_Init();
        POINT_COLOR=RED;   
        LED0=0;                                            //先点亮红灯       
        EXTIX_Init();       //初始化外部中断输入
  int Data[12];       
        int number=0;       
  int length=0;               
        int thousand;
        int hundred;
        int ten;
        int one;
        while(1)
        {       
                if(USART_RX_STA&0x8000)
                {                                          
                        len=USART_RX_STA&0x3fff;//得到此次接收到的数据长度
                        printf("您发送的消息为:\r\n");
                        for(t=0;t<len;t++)
                        {
                                if(USART_RX_BUF[t]!='/')
                                {
                                        if(number!=0)
                                        {
                                                length++;
                                        }
                                }                               
                                else
                                {
                                        if(number!=0)
                                  {
                                    if(length==4)
                                    {
                                      thousand=USART_RX_BUF[t-4]-48;
                                                  hundred=USART_RX_BUF[t-3]-48;
                                                  ten=USART_RX_BUF[t-2]-48;
                                                   one=USART_RX_BUF[t-1]-48;
                                                        Data[number]=1000*thousand+100*hundred+10*ten+one;
                                    }
                                          else if(length==3)
                                          {
              hundred=USART_RX_BUF[t-3]-48;
                                            ten=USART_RX_BUF[t-2]-48;
                                                  one=USART_RX_BUF[t-1]-48;
                                                        Data[number]=100*hundred+10*ten+one;
                                          }
                                          else if(length==2)
                                          {
                                            ten=USART_RX_BUF[t-2]-48;
                                                  one=USART_RX_BUF[t-1]-48;
                                       Data[number]=10*ten+one;
                                          }
                                          else if(length==2)
                                          {
                                                  one=USART_RX_BUF[t-1]-48;
                                                        Data[number]=one;
                                          }
                                                printf("%d:%d",number,Data[number]);
                                  }
                                        else
                                        {
                                                for(int t1=0;t1<8;t1++)
                                                printf("%c",USART_RX_BUF[t1]);
                                        }
                                  length=0;
                                        number ++;
                                        printf("\r\n");//插入换行
                                }
                                while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束
                        }
                        printf("\r\n");//插入换行
                        USART_RX_STA=0;
                        number=0;
            for(int k=0;k<13;k++)
            {
                  Optime[k][0]=Data[k];
                        Optime[k][1]=k;
            }
                        int i,j,t,c;    //定义变量及数组为基本整型
      for(i=1;i<12;i++)    //变量i代表比较的趟数
          for(j=1;j<13-i;j++)    //变最j代表每趟两两比较的次数
            if(Optime[j][0]>Optime[j+1][0])
            {
                t=Optime[j][0];    //产利用中间变童实现两值互换
                Optime[j][0]=Optime[j+1][0];
                Optime[j+1][0]=t;
                                                          c=Optime[j][1];
                                                          Optime[j][1]=Optime[j+1][1];
                                                          Optime[j+1][1]=c;
            }
            printf("排序后的顺序是:\r\n");
            for(i=1;i<=12;i++)
                                                printf("%d:%d\r\n",Optime[1],Optime[0]);                          //将胃泡排序后的顺序输出
            printf("\n");                                                               
                }
                else
                {
                        times++;
                        if(times%1000==0)printf("请输入数据,以回车键结束\r\n");  
                        delay_ms(10);  
                }
                if(KEY1==0)
                {
                u8 str[20];
                sprintf((char*)str,"%d",Optime[1][0]);
                POINT_COLOR=RED;
                        printf("%s",str);
                LCD_ShowString(30,40,210,24,24,str);               
                }
        }
}

上面为程序,是通过USART1从电脑向STM32F4探索者发送一个例如300/400/500....的数据,然后在STM32中对数据进行排序,并将排序后的数据和排序之前的数据输出到串口。
现在想同时加上在LCD中显示数据的功能
                if(KEY1==0)
                {
                u8 str[20];
                sprintf((char*)str,"%d",Optime[1][0]);
                POINT_COLOR=RED;
                        printf("%s",str);
                LCD_ShowString(30,40,210,24,24,str);               
                }
用这几行代码在试验的过程中发现,如果在不用串口发数据的时候,按下KEY1正常可以在LCD中显示0,如果先将数据发送后再按下KEY1正常应该显示Opentime[1][0]的值,可是却什么都不显示,是USART1还在被占用所以无法将结果输出到LCD吗,搞不太明白了,非常感谢大家

最佳答案

查看完整内容[请看2#楼]

参考下这个代码吧:http://www.openedv.com/forum.php?mod=viewthread&tid=293434
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

31

主题

2183

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
14424
金钱
14424
注册时间
2018-8-3
在线时间
1157 小时
发表于 2019-5-20 18:39:39 | 显示全部楼层
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-12 18:03

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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