c 串口发送数据2数据发送结果显示在LCD实验求助

求大神指点下,我用串口助手发送十六进制数据,为何液晶屏上没显示,谢谢,(发送字符串可以正常显示) - STM32/STM8技术论坛 -
中国电子技术论坛 -
最好最受欢迎电子论坛!
后使用快捷导航没有帐号?
求大神指点下,我用串口助手发送十六进制数据,为何液晶屏上没显示,谢谢,(发送字符串可以正常显示)
09:42:21  
13855&查看
下面是代码:望大神指点,谢谢了
void USART1_IRQHandler(void)& && && && && & & & & & //?(R)??1????·??????ò
& & & & u16 i,R
#ifdef OS_TICKS_PER_SEC& & & &&&& & & & //?????±?? 1/2 ??????¨????,?u?÷??????ucosII??.
& & & & OSIntEnter();& &
& & & & if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)&&// 1/2 ???????( 1/2 ???u 1/2 u??? 3/4 ?±?????0x0d 0x0a 1/2 á??)
& & & & & & & & {
& & & & & & & & USART_ClearITPendingBit(USART1,&&USART_IT_RXNE);
& & & & & & & & USART_RX_BUF[i]=USART_ReceiveData(USART1);//(USART1-&DR);& & & & //???? 1/2 ???u 1/2 u??? 3/4 ?
& & & & & & & & USART_SendData(USART1,USART_RX_BUF[i]);
& & & & & & & & & & & &
& & & & //& & & & write_pos(3,i);
& & & & & & & & //write_data(USART_ReceiveData(USART1));
& & & & & & & & //i++
& & & & & & & & & & & &
& & & & /*& & & & if((USART_RX_STA&0x8000)==0)// 1/2 ??????ê??
& & & & & & & & & & & & {
& & & & & & & & & & & & if(USART_RX_STA&0x4000)// 1/2 ???u 1/2 ??0x0d
& & & & & & & & & & & & & & & & {
& & & & & & & & & & & & & & & & if(Res!=0x0a)USART_RX_STA=0;// 1/2 ????í?ó,??????? 1/4
& & & & & & & & & & & & & & & & else USART_RX_STA|=0x8000;& & & & // 1/2 ????ê????
& & & & & & & & & & & & & & & & }
& & & & & & & & & & & & else //>>??>>??u 1/2 0X0D
& & & & & & & & & & & & & & & & {& & & &
& & & & & & & & & & & & & & & & if(Res==0x0d)USART_RX_STA|=0x4000;
& & & & & & & & & & & & & & & & else
& & & & & & & & & & & & & & & & & & & & {
& & & & & & & & & & & & & & & & & & & & USART_RX_BUF[USART_RX_STA&0X3FFF]=R
& & & & & & & & & & & & & & & & & & & & USART_RX_STA++;
& & & & & & & & & & & & & & & & & & & & if(USART_RX_STA&(USART_REC_LEN-1))USART_RX_STA=0;// 1/2 ????? 3/4 ??í?ó,??????? 1/4
1/2 ???& & & && &
& & & & & & & & & & & & & & & & & & & & }& & & & & & & &&&
& & & & & & & & & & & & & & & & }
& & & & & & & & & & & & }& && &*/
#ifdef OS_TICKS_PER_SEC& & & &&&& & & & //?????±?? 1/2 ??????¨????,?u?÷??????ucosII??.
& & & & OSIntExit();&&& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & &&&
#endif& & & &
void busy_search(void)//
& & & & & & & & & & & & & & & & GPIO_InitTypeDef& &GPIO_InitS
& & & & & & & & & & & & & & & & GPIO_InitStructure.GPIO_Pin=GPIO_Pin_A
& & & & & & & & & & & & & & & & GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
& & & & & & & & & & & & & & & & GPIO_Init(GPIOF,&GPIO_InitStructure);
& & & & & & & &
& & & & & & & & & & & & & & & & reset_
& & & & & & & & & & & & & & & & set_
& & & & & & & & & & & & & & & & reset_
& & & & & & & & & & & & & & & & //Delay(5);
& & & & & & & & & & & & & & & & set_
& & & & & & & & & & & & & & & & // Delay(25);
& & & & & & & &&&
& & & & & & & & & & & & & & & & while(GPIO_ReadInputDataBit(GPIOF,GPIO_Pin_15)==1);
& & & & & & & & & & & & & & & & reset_
& & & & & & & & & & & & & & & & GPIO_InitStructure.GPIO_Pin=GPIO_Pin_A
& & & & & & & & & & & & & & & & GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
& & & & & & & & & & & & & & & & GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
& & & & & & & & & & & & & & & & GPIO_Init(GPIOF,&GPIO_InitStructure);& & & &
void write_cmd(uchar cmd)//????? cmd??????
& & & & & & & &
& & & & & & & &
& & & & & & & & & & & & & & & & busy_search();
& & & & & & & & & & & & & & & & reset_
& & & & & & & & & & & & & & & & reset_
& & & & & & & & & & & & & & & & reset_
& & & & & & & & & & & & & & & & GPIO_Write(GPIOF,(0xff00&(cmd&&8)));
& & & & & & & & & & & & & & & & delay_us(5);
& & & & & & & & & & & & & & & & set_
& & & & & & & & & & & & & & & & delay_us(5);
& & & & & & & & & & & & & & & & reset_
& & & & & & & &
& & & & & & & &
void write_data(u16 dat)//?????, dat??????
& & & && &&&
& & & & & & & & & & & & & & & & busy_search();
& & & & & & & & & & & & & & & & set_
& & & & & & & & & & & & & & & & reset_
& & & & & & & & & & & & & & & & reset_
& & & & & & & && &&&GPIO_Write(GPIOF,(0xff00&(dat&&8)));
& & & & & & & & & & & & & & & & delay_us(5);
& & & & & & & & & & & & & & & & set_
& & & & & & & & & & & & & & & & delay_us(5);
& & & & & & & && &&&reset_
void lcd12864_Config()//?????
& & & & & & & & write_cmd(0x30);
& & & & & & & & write_cmd(0x0c);
& & & & & & & & write_cmd(0x01);
void&&write_pos(uchar x,uchar y)
& & & & & & & & & & & &
& & & & & & & & & & & & if(x==0)
& & & & & & & & & & & & & & & & {
& & & & & & & & & & & & & & & & & & & & x=0x80;
& & & & & & & & & & & & & & & & }
& & & & & & & & & & & & if(x==1)
& & & & & & & & & & & & & & & & {
& & & & & & & & & & & & & & & & & & & & x=0x90;
& & & & & & & & & & & & & & & & }
& & & & & & & & & & & & if(x==2)
& & & & & & & & & & & & & & & & {
& & & & & & & & & & & & & & & & & & & & x=0x88;
& & & & & & & & & & & & & & & & }
& & & & & & & & & & & & if(x==3)
& & & & & & & & & & & & & & & & {
& & & & & & & & & & & & & & & & & & & & x=0x98;
& & & & & & & & & & & & & & & & }
& & & & & & & & & & & & pos=x+y;
& & & & & & & & & & & & & & & & write_cmd(pos);
#include &usart.h&
#include &gpio.h&
#include &lcd12864.h&
#include &sys.h&
char str1[]={&u±?°?è±,:&};
char str2[]={&?¤×÷×???: ?ì??&};
char str3[]={&??±ê?? 3/4 ?: 99 99&};
char *str4;
int a=0x05;
int num,i,j,len,t;
int main(void )
& & & & {&&
& & & & & & & & & & & & gpio_init();//IO????? 1/4 >>?
& & & & & & & && &uart_init(9600);//?(R)????? 1/4 >>?????
& & & & & & & & & & & & delay_init();//???±??????? 1/4 >>?
& & & & & & & & & & & & lcd12864_Config();//?? 3/4 §??? 1/4 >>?????
& & & & & & & &
& & & & & & & &
& & & & & & & && &write_pos(0,0);//??×?±ê??u??>>????u??>>,?
& & & && && & & & num=0;
& & & & & & & && &while(str1[num]!='\0')
& & & & & & & & & & & & & & & & & & & & {
& & & & & & & & & & & & & & & & & & & &&&write_data(str1[num]);
& & & & & & & & & & & & & & & & & & & & & & & & num++;
& & & & & & & & & & & & & & & & & & & & }
& & & & & & & & & & & & & & & & & & & &
& & & & & & & & & & & & & & & & & & & &
& & & & & & & & & & & & write_pos(1,0);//??×?±ê??u??>>????u??>>,?
& & & & & & & && &num=0;
& & & & & & & && &while(str2[num]!='\0')
& & & & & & & & & & & & & & & & & & & & {
& & & & & & & & & & & & & & & & & & & &&&write_data(str2[num]);
& & & & & & & & & & & & & & & & & & & & & & & & num++;
& & & & & & & & & & & & & & & & & & & & }
& & & & & & & & & & & & & & & & & & & &
& & & & & & & & & & & & & & & & & & & &
& & & & & & & & & & & & & & & & & & & &
& & & & & & & & & & & & write_pos(2,0);//??×?±ê??u??>>????u??>>,?
& & & & & & & && &num=0;
& & & & & & & && &while(str3[num]!='\0')
& & & & & & & & & & & & & & & & & & & & {
& & & & & & & & & & & & & & & & & & & &&&write_data(str3[num]);
& & & & & & & & & & & & & & & & & & & & & & & & num++;
& & & & & & & & & & & & & & & & & & & & }
& & & & & & & & & & & & & & & & & & & &
& & & & & & & & while(1)
& && &if(USART_RX_STA&0x8000)
& && && &&&{& &&&len=USART_RX_STA&0x3f;
& && && && && && &write_pos(3,0);
& && && && && &&&for(i=0;i&=i++)
& && && && && & write_data(USART_RX_BUF[i]);
& & & & }& & & &
& & & & & & & & & & & & & & & & & & & &
}& & & & & & & & & & & & & & & &
}& & & & & & & & & & & & & & & & & & & &
18:23:37  
麻烦楼主将源代码打包,然后上传我才好帮你查看
10:21:18  
PCB在线计价下单
板子大小:
板子数量:
PCB 在线计价
好多乱码呀,楼主你能不能打包上传呀
09:52:16  
串口调试助手有没有勾选“以十六进制显示”
等待验证会员
13:37:48  
如果可以进入调试状态,可以在调试状态看看两个收到的数据是不是一样的。如果不可以进入调试状态尝试着把发送的数据返回串口调试助手,确认两次单片机收的的数据是一致的!
工程师职场
Powered by
供应链服务
版权所有 (C) 深圳华强聚丰电子科技有限公司第81节:液晶屏显示串口发送过来的任意汉字和字符 - 其他技术 - 电子工程世界网
第81节:液晶屏显示串口发送过来的任意汉字和字符
16:49:31来源: eefocus
通过上一节的学习,我们发现汉字的识别本质是机内码,字符的识别本质是ASCII码。不管是机内码还是ASCII码,这些都是16进制的数字,也就是我们手机平时接收和发送的信息本质都是这些数字编码,但是机内码是2个字节,ASCII码是1个字节,如果在一串随机的信息中,同时包含汉字和字符两种数字信息,我们的程序又该如何能筛选和识别它们,会不会把机内码和ASCII码搞混乱了?这一节要教大家三个知识点:
第一个:ASCII码与汉字机内码不一样的规律是,ASCII码都是小于128(0x80)的,根据这个特点可以编程序把它们区分开来。
第二个:当任意一串信息中既包含汉字机内码,又包含字符ASCII码时,并且当ASCII码左右相邻个数是以奇数存在的时候,如何巧妙地插入填充空格字符0x20使它们能够符合一个坐标点显示2个字符的要求。
第三个:本节程序串口部分是在第39节内容基础上移植修改而成,本节程序中多添加了如何通过结束标志0x0D 0x0A来提取有效数据的内容,读者可以学习一下其中的框架。
具体内容,请看源代码讲解。
(1)硬件平台:基于朱兆祺51。
(2)实现功能:
开机上电后,第1行显示&请发送信息&。 任意时刻,从电脑&助手&根据以下协议要求,发送一串不超过24个汉字或者字符的信息,液晶屏就实时把这些信息显示在第2,3,4行。并且蜂鸣器会鸣叫一声表示数据接收正确。
波特率是:9600 。
通讯协议:EB 00 55 XX XX XX XX &XX XX 0D 0A
最前面3个字节EB 00 55 表示数据头。
最后面2个字节0D 0A表示信息的结束标志。
中间的XX是机内码和ASCII码信息。比如:要发送&曹健1人学习&的信息,它们对应的指令是:
EB 00 55 B2 DC BD A1 31 C8 CB D1 A7 CF B0 35 31 B5 A5 C6 AC BB FA 0D 0A
(3)源代码讲解如下:
#include "REG52.H"
/* 注释一:
* 本程序的串口那部分内容是从《第三十九节:判断数据头来接收一串数据的串口通用程序框架。》
* 移植过来的,但是以下要把接收缓冲区的数据从10改成60.同时,协议后面多增加了数据结束标志0x0d 0x0a。
#define const_rc_size 60 //接收串口中断数据的缓冲区数组大小
#define const_receive_time 5 //如果超过这个时间没有串口数据过来,就认为一串数据已经全部接收完,这个时间根据实际情况来调整大小
#define const_voice_short 40 //蜂鸣器短叫的持续时间
sbit LCDCS_dr = P1^6; //片选线
sbit LCDSID_dr = P1^7; //串行数据线
sbit LCDCLK_dr = P3^2; //串行时钟线
sbit LCDRST_dr = P3^4; //复位线
sbit beep_dr=P2^7; //蜂鸣器的驱动IO口
void initial_myself(void);
void initial_peripheral(void);
void delay_long(unsigned int uiDelaylong);
void T0_time(void); //定时中断函数
void usart_receive(void); //串口接收中断函数
void usart_service(void); //串口服务程序,在main函数里
void display_service(void); //显示服务程序,在main函数里
void empty_dlay_buffer(void); //把显示缓冲区全部填充空格字符0x20
void diaplay_all_buffer(void); //显示第2,3,4行全部缓冲区的内容
void SendByteToLcd(unsigned char ucData); //发送一个字节数据到液晶模块
void SPIWrite(unsigned char ucWData, unsigned char ucWRS); //模拟SPI发送一个字节的命令或者数据给液晶模块的底层驱动
void WriteCommand(unsigned char ucCommand); //发送一个字节的命令给液晶模块
void LCDWriteData(unsigned char ucData); //发送一个字节的数据给液晶模块
void LCDInit(void); //初始化 函数内部包括液晶模块的复位
void display_clear(void); // 清屏。4行8列的坐标点全部显示2个空字符相当于清屏了。
void display_double_code(unsigned int x,unsigned int y,const unsigned char ucArray1,const unsigned char ucArray2); //在一个坐标点显示1个汉字或者2个字符的函数
void delay_short(unsigned int uiDelayshort); //延时
code unsigned char ucAddrTable[]= //调用内部字库时,液晶屏的坐标体系,位置编码,是驱动内容,读者可以不用深究它的含义。
0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,
0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,
0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,
0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f,
code unsigned char JN1616_qing[]= //机内码 请
0xC7,0xEB, //请
code unsigned char JN1616_fa[]= //机内码 发
0xB7,0xA2,
code unsigned char JN1616_song[]= //机内码 送
0xCB,0xCD,
code unsigned char JN1616_xin[]= //机内码 信
0xD0,0xC5,
code unsigned char JN1616_xi[]= //机内码 息
0xCF,0xA2,
unsigned int uiSendCnt=0; //用来识别串口是否接收完一串数据的计时器
unsigned char ucSendLock=1; //串口服务程序的自锁变量,每次接收完一串数据只处理一次
unsigned int uiRcregTotal=0; //代表当前缓冲区已经接收了多少个数据
unsigned char ucRcregBuf[const_rc_size]; //接收串口中断数据的缓冲区数组
unsigned int uiRcMoveIndex=0; //用来解析数据协议的中间变量
unsigned int uiVoiceCnt=0; //蜂鸣器鸣叫的持续时间计数器
unsigned char ucWd1Update=1; //窗口1的整屏更新显示变量 1代表更新显示,响应函数内部会清零
unsigned char ucWd1Part1Update=0; //窗口1的第1个局部更新显示变量 1代表更新显示,响应函数内部会清零
unsigned char ucDispplayBuffer[48]; //第2,3,4行显示内容的缓冲区
void main()
initial_myself();
delay_long(100);
initial_peripheral();
usart_service(); //串口服务程序
display_service(); //显示服务程序
/* 注释二:在一个坐标点显示1个汉字或者2个字符的函数
* 第1,2个参数x,y是坐标体系。x的范围是0至8,y的范围是0至3.
* 第3个参数ucArray1是第1个汉字机内码或者ASCII码。
* 第4个参数ucArray2是第2个汉字机内码或者ASCII码。
void display_double_code(unsigned int x,unsigned int y,const unsigned char ucArray1,const unsigned char ucArray2)
WriteCommand(0x30); //基本指令集
WriteCommand(ucAddrTable[8*y+x]); //起始位置
LCDWriteData(ucArray1);
LCDWriteData(ucArray2);
void display_clear(void) // 清屏。4行8列的坐标点全部显示2个空字符相当于清屏了。
unsigned int i,j;
for(i=0;i<4;i++)
for(j=0;j<8;j++)
display_double_code(j,i,0x20,0x20); //0x20是空格的ASCII码
void SendByteToLcd(unsigned char ucData) //发送一个字节数据到液晶模块
for ( i = 0; i < 8; i++ )
if ( (ucData << i) & 0x80 )
LCDSID_dr = 1;
LCDSID_dr = 0;
LCDCLK_dr = 0;
LCDCLK_dr = 1;
void SPIWrite(unsigned char ucWData, unsigned char ucWRS) //模拟SPI发送一个字节的命令或者数据给液晶模块的底层驱动
SendByteToLcd( 0xf8 + (ucWRS << 1) );
SendByteToLcd( ucWData & 0xf0 );
SendByteToLcd( (ucWData << 4) & 0xf0);
void WriteCommand(unsigned char ucCommand) //发送一个字节的命令给液晶模块
LCDCS_dr = 0;
LCDCS_dr = 1;
SPIWrite(ucCommand, 0);
delay_short(90);
void LCDWriteData(unsigned char ucData) //发送一个字节的数据给液晶模块
LCDCS_dr = 0;
LCDCS_dr = 1;
SPIWrite(ucData, 1);
void LCDInit(void) //初始化 函数内部包括液晶模块的复位
LCDRST_dr = 1; //复位
LCDRST_dr = 0;
LCDRST_dr = 1;
void empty_diaplay_buffer(void) //把显示缓冲区全部填充空格字符0x20
for(i=0;i<48;i++)
ucDispplayBuffer[i]=0x20; //第2,3,4行显示内容的缓冲区全部填充0x20空格字符
void diaplay_all_buffer(void) //显示第2,3,4行全部缓冲区的内容
unsigned int i,j;
for(i=0;i<3;i++) //i代表行数
for(j=0;j<8;j++) //j代表某行的某个坐标在第几列
display_double_code(j,i+1,ucDispplayBuffer[i*16+j*2],ucDispplayBuffer[i*16+j*2+1]); //这里的16代表一行可以显示16个字符
void display_service(void) //显示服务程序,在main函数里
if(ucWd1Update==1) //窗口1整屏更新,里面只放那些不用经常刷新显示的内容
ucWd1Update=0; //及时清零,避免一直更新
ucWd1Part1Update=1; //激活窗口1的第1个局部更新显示变量
display_clear(); // 清屏。4行8列的坐标点全部显示2个空字符相当于清屏了。
//显示第一行固定的内容:请发送信息
display_double_code(1,0,JN1616_qing[0],JN1616_qing[1]); //请
display_double_code(2,0,JN1616_fa[0],JN1616_fa[1]); //发
display_double_code(3,0,JN1616_song[0],JN1616_song[1]); //送
display_double_code(4,0,JN1616_xin[0],JN1616_xin[1]); //信
display_double_code(5,0,JN1616_xi[0],JN1616_xi[1]); //息
if(ucWd1Part1Update==1) //窗口1的第1个局部更新显示变量,里面放一些经常需要刷新显示的内容
ucWd1Part1Update=0; //及时清零,避免一直更新
diaplay_all_buffer(); //显示第2,3,4行全部缓冲区的内容
/* 注释三:
* 以下有效信息截取和如何判断机内码与ASCII码是本程序的核心,请仔细看讲解。
* 凡是ASCII码都是小于0x80(128)的,根据这个特点可以把ASCII码和机内码分离出来,
* 同时,由于液晶屏的1个坐标必须显示2个编码,对于单个存在的ASCII码,我们要在
* 它的右边多插入一个空格字符0x20。至于如何插入空格0x20字符,请看以下代码。
void usart_service(void) //串口服务程序,在main函数里
unsigned int uiCodeC //统计接收的有效编码数量
unsigned int uiCodeYu; //对uiCodeCnt求2的余数,方便识别是否是1个ASCII码相邻
if(uiSendCnt>=const_receive_time&&ucSendLock==1) //说明超过了一定的时间内,再也没有新数据从串口来
ucSendLock=0; //处理一次就锁起来,不用每次都进来,除非有新接收的数据
uiRcMoveIndex=0; //由于是判断数据头,所以下标移动变量从数组的0开始向最尾端移动 这个变量是用来抗干扰处理的
while(uiRcregTotal>=6&&uiRcMoveIndex<=(uiRcregTotal-6)) //这里的6表示有3个字节的数据头,至少1个有效数据,2个数据结束标志0x0d 0x0a
if(ucRcregBuf[uiRcMoveIndex+0]==0xeb&&ucRcregBuf[uiRcMoveIndex+1]==0x00&&ucRcregBuf[uiRcMoveIndex+2]==0x55) //数据头eb 00 55的判断
empty_diaplay_buffer(); //把显示缓冲区全部填充空格字符0x20
uiCodeCnt=0; //统计接收的有效编码数量清零
for(i=0;i<(uiRcregTotal-uiRcMoveIndex-3)&&i<48;i++)//这里的3表示有3个字节的数据头。48表示最大只能接收24个汉字,一共48个字节的机内码.
if(ucRcregBuf[uiRcMoveIndex+3+i]==0x0d&&ucRcregBuf[uiRcMoveIndex+4+i]==0x0a) //结束标志0x0d 0x0a的判断
uiVoiceCnt=const_voice_ //蜂鸣器发出声音,表示数据接收正确完毕
ucWd1Part1Update=1; //及时更新显示第2,3,4行内容的信息
//退出for循环
else //收集有效信息编码进入显示缓冲区
uiCodeYu=uiCodeCnt%2; //对2求余数,用来识别相信的2个是否是机内码,否则要进行插入填充0x20处理
if(uiCodeYu==1)
if(ucRcregBuf[uiRcMoveIndex+3+i]>=0x80&&ucRcregBuf[uiRcMoveIndex+3+i-1]<0x80) //如果当前的是机内码,而上一个不是机内码
ucDispplayBuffer[uiCodeCnt]=0x20; //当前的先填充插入空格字符0x20
uiCodeCnt++; //统计接收的有效编码数量
ucDispplayBuffer[uiCodeCnt]=ucRcregBuf[uiRcMoveIndex+3+i]; //收集有效信息编码进入显示缓冲区
uiCodeCnt++; //统计接收的有效编码数量
//退出while循环
uiRcMoveIndex++; //因为是判断数据头,游标向着数组最尾端的方向移动
uiRcregTotal=0; //清空缓冲的下标,方便下次重新从0下标开始接受新数据
void T0_time(void)
1 //定时中断
TF0=0; //清除中断标志
TR0=0; //关中断
if(uiSendCnt
uiSendCnt++; //表面上这个数据不断累加,但是在串口中断里,每接收一个字节它都会被清零,除非这个中间没有串口数据过来
ucSendLock=1; //开自锁标志
if(uiVoiceCnt!=0)
uiVoiceCnt--; //每次进入定时中断都自减1,直到等于零为止。才停止鸣叫
beep_dr=0; //蜂鸣器是PNP控制,低电平就开始鸣叫。
; //此处多加一个空指令,想维持跟if括号语句的数量对称,都是两条指令。不加也可以。
beep_dr=1; //蜂鸣器是PNP三极管控制,高电平就停止鸣叫。
TH0=0 //重装初始值()=65035=0xfe0b
TR0=1; //开中断
void usart_receive(void) interrupt 4 //串口接收数据中断
++uiRcregT
if(uiRcregTotal>const_rc_size) //超过缓冲区
uiRcregTotal=const_rc_
ucRcregBuf[uiRcregTotal-1]=SBUF; //将串口接收到的数据缓存到接收缓冲区里
uiSendCnt=0; //及时喂狗,虽然main函数那边不断在累加,但是只要串口的数据还没发送完毕,那么它永远也长不大,因为每个中断都被清零。
else //我在其它上都不用else这段代码的,可能在51单片机上多增加" TI = 0;"稳定性会更好吧。
void delay_short(unsigned int uiDelayShort)
void delay_long(unsigned int uiDelayLong)
for(j=0;j<500;j++) //内嵌循环的空指令数量
; //一个分号相当于执行一条空语句
void initial_myself(void) //第一区 初始化单片机
beep_dr=1; //用PNP三极管控制蜂鸣器,输出高电平时不叫。
//配置定时器
TMOD=0x01; //设置定时器0为工作方式1
TH0=0 //重装初始值()=65035=0xfe0b
//配置串口
SCON=0x50;
TMOD=0X21;
IP =0x10; //把串口中断设置为最高优先级,必须的。
TH1=TL1=-(/32/9600); //这段配置代码具体是什么意思,我也不太清楚,反正是跟有关。
void initial_peripheral(void) //第二区 初始化外围
EA=1; //开总中断
ES=1; //允许串口中断
ET0=1; //允许定时中断
TR0=1; //启动定时中断
LCDInit(); //初始化 内部包含液晶模块的复位
WriteCommand(0x0C); //命令字0x0c表示用内部字库模式。命令字0x36表示用自构字库模式。
empty_diaplay_buffer(); //把显示缓冲区全部填充空格字符0x20
总结陈词:
我们现在是调用液晶屏内部字库来显示内容,如果要某行内容反显或者光标闪烁改怎么编程?欲知详情,请听下回分解-----如何在调用液晶屏内部字库时让某行内容反显或者光标闪烁。
关键字:&&
编辑:什么鱼 引用地址:
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。
微信扫一扫加关注 论坛活动 E手掌握
微信扫一扫加关注
芯片资讯 锐利解读
大学堂最新课程
汇总了TI汽车信息娱乐系统方案、优质音频解决方案、汽车娱乐系统和仪表盘参考设计相关的文档、视频等资源
热门资源推荐
频道白皮书
何立民专栏
北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。查看: 1251|回复: 26
求助 我想做一个电脑通过串口发送字符串给单片机,LCD显示的实验
主题帖子精华
初级会员, 积分 132, 距离下一级还需 68 积分
在线时间129 小时
LCD_ShowString(30,130,200,12,16,USART_RX_BUF);& & & & 就是把LCD实验和串口实验结合了一下,让LCD显示单片机接收到的内容USART_RX_BUF【】;
但是比如说我发送的是AAAAA; 显示屏会显示AAAAA;
但是当我下一次发送BBB时,显示屏显示的BBBAA;
怎么才能解决这个问题呀?好苦恼。。。
在你的LCD显示程序中增加一个清除功能就行了了,
设定一个最大的字符串长度, 然后, 做一个空格字符串
两种方法实现
每次收到新的显示数据前, 都先调用显示程序显示这个空格字符串,然后再显示收到的字符串就行了, 这就是先清除再显示
多用一个数组, 大于与空格字符串多一个字节就行, 每次收到数据后, 先次空格字符串复制到数组中, 然后再复制收到的数据到数组,这个数组前面的空格字符就会被你复制进去 ...
主题帖子精华
金牌会员, 积分 2235, 距离下一级还需 765 积分
在线时间230 小时
本帖最后由 likunxue 于
22:23 编辑
在你的LCD显示程序中增加一个清除功能就行了了,
设定一个最大的字符串长度, 然后, 做一个空格字符串
两种方法实现
1&&每次收到新的显示数据前, 都先调用显示程序显示这个空格字符串,然后再显示收到的字符串就行了, 这就是先清除再显示
2&&多用一个数组, 大于与空格字符串多一个字节就行, 每次收到数据后, 先次空格字符串复制到数组中, 然后再复制收到的数据到数组,这个数组前面的空格字符就会被你复制进去的有效字符代替, 后面的依然是空格字符, 这样现把这个数组当字符串去显示就行了,
两数方法, 第一种简单,但需要调用两次显示, 第二种软件有点复杂,但只调用一次显示就行了,速度比第一种快很多。
主题帖子精华
初级会员, 积分 132, 距离下一级还需 68 积分
在线时间129 小时
顶& && && && &
主题帖子精华
新手上路, 积分 21, 距离下一级还需 29 积分
在线时间2 小时
因为BBB把原来的前三个A覆盖了。所以显示的是BBBAA
主题帖子精华
初级会员, 积分 132, 距离下一级还需 68 积分
在线时间129 小时
因为BBB把原来的前三个A覆盖了。所以显示的是BBBAA
我知道。。。。我的意思是怎么才不显示后面AA,只显示BBB。。。我想在显示之前先把USART_RX_BUF先清零,但是没成功,是不是应该从LCD部分下手?
主题帖子精华
高级会员, 积分 761, 距离下一级还需 239 积分
在线时间124 小时
屏幕显示区域得重新刷新才可以清除原来的显示数据
主题帖子精华
初级会员, 积分 132, 距离下一级还需 68 积分
在线时间129 小时
屏幕显示区域得重新刷新才可以清除原来的显示数据
void LCD_Clear(u16 Color);& & & & 用这个?
主题帖子精华
初级会员, 积分 132, 距离下一级还需 68 积分
在线时间129 小时
AAAAA的数据还存在USART_RX_BUF以后,下次发送BBB,里面的数据会变成BBBAA,在此之前应该先把USART_RX_BUF清空一下?
主题帖子精华
初级会员, 积分 132, 距离下一级还需 68 积分
在线时间129 小时
顶& && & 啊啊啊啊啊还是不行& &救命啊。。。。
主题帖子精华
初级会员, 积分 132, 距离下一级还需 68 积分
在线时间129 小时
&&原子哥哥在不在
主题帖子精华
初级会员, 积分 132, 距离下一级还需 68 积分
在线时间129 小时
想到一种很蠢的办法,每收到一次数据就初始化一下LDC;& & 这种方法会不会影响程序运行速度啊,我确实不知道该怎么清除我需要显示接收到的字符串的那一行的数据,求个大神告诉我!!!
(145.25 KB, 下载次数: 38)
15:28 上传
主题帖子精华
高级会员, 积分 651, 距离下一级还需 349 积分
在线时间29 小时
串口接收肯定有长度的,那你直接显示你要的字符串的长度就可以了
主题帖子精华
初级会员, 积分 132, 距离下一级还需 68 积分
在线时间129 小时
串口接收肯定有长度的,那你直接显示你要的字符串的长度就可以了
我每次接受的字符串为放在USART_RX_BUF这里,长度为len,我用LCD_ShowString(30,130,200,12,16,USART_RX_BUF);& &这个语句怎么设定显示长度为len?
主题帖子精华
初级会员, 积分 132, 距离下一级还需 68 积分
在线时间129 小时
ding& && &
主题帖子精华
初级会员, 积分 132, 距离下一级还需 68 积分
在线时间129 小时
在你的LCD显示程序中增加一个清除功能就行了了,
设定一个最大的字符串长度, 然后, 做一个空格字符串 ...
额 原谅我C语言学的不好,,,我先试了一下第一种方法在收到数据后先显示空格字符,我是直接这样写的(不知道这样对不对。。。):
& & & & & & & & if(USART_RX_STA&0x8000)
& & & & & & & & {& & & &
& & & & & & & & LCD_ShowString(30,130,200,12,16,&& && && && && && && && && && & &);//空格字符串?这样写对不对?
然后再显示收到的数据,好像还是不行,是不是因为USART_RX_BUF里的数据还没清除呀?
主题帖子精华
初级会员, 积分 132, 距离下一级还需 68 积分
在线时间129 小时
在你的LCD显示程序中增加一个清除功能就行了了,
设定一个最大的字符串长度, 然后, 做一个空格字符串 ...
你说的把空格字符串复制到数组中是把空格的ASCII码放到数组中的意思吗?
主题帖子精华
金牌会员, 积分 2235, 距离下一级还需 765 积分
在线时间230 小时
额 原谅我C语言学的不好,,,我先试了一下第一种方法在收到数据后先显示空格字符,我是直接这样写的(不 ...
你在串口发送的字符串的结层加上一上0, 记住是0 不是&0& 的字符, 这个显示程序在显示字符串时,遇到0就会自动退出显示,这个在写显示程序时,一般人都会这样做的, 如果你的显示例程是原子哥的,哪就不用担收, 在发送字符串的结尾加一个0就行了, 或都如你所说, 是你没有清除接收缓存区的数据的结果, 有个简单的办法就是每次显示结束后,清零接收缓存区的数组为0值.就行了
主题帖子精华
高级会员, 积分 591, 距离下一级还需 409 积分
在线时间174 小时
擦除了,重新显示啊
主题帖子精华
初级会员, 积分 132, 距离下一级还需 68 积分
在线时间129 小时
在你的LCD显示程序中增加一个清除功能就行了了,
设定一个最大的字符串长度, 然后, 做一个空格字符串 ...
用第二种是可以的!!谢谢!我定义了一个跟USART_RX_BUF一样长度的数组word[200];
if(USART_RX_STA&0x8000)
& & & & & & & & {& & & & & & & & & & & & & & & & & & & &
& && && && &for(i=0;i&200;i++)
& & & & & & & & & & & & {
& & & & & & & & & & & & & & & & word=0x20;//每一个字节都是空格
& & & & & & & & & & & & }
& & & & & & & & & & & & len=USART_RX_STA&0x3FFF;//
& & & & & & & & & & & & for(t=0;t&t++)
& & & & & & & & & & & & {
& & & & & & & & & & & & & & & & USART1-&DR=USART_RX_BUF[t];
& & & & & & & & & & & & & & & & while((USART1-&SR&0X40)==0);
& & & & & & & & & & & & & & & & for(j=0;j&j++)
& & & & & & & & & & & & & & & & {
& & & & & & & & & & & & & & & & & & & & word[j]=USART_RX_BUF[j];//把收到数据放到word里
& & & & & & & & & & & & & & & & }
& & & & & & & & & & & & }
& & & & & & & & & & & & printf(&\r\n\r\n&);//
& & & & & & & & & & & & USART_RX_STA=0;
& & & & & & & & & & & & LCD_ShowString(30,130,200,12,16,word);
& & & & & & & & }& & & & & & & & & & & &
主题帖子精华
金牌会员, 积分 2235, 距离下一级还需 765 积分
在线时间230 小时
用第二种是可以的!!谢谢!我定义了一个跟USART_RX_BUF一样长度的数组word[200];
if(USART_RX_STA&0x80 ...
主题帖子精华
初级会员, 积分 132, 距离下一级还需 68 积分
在线时间129 小时
在你的LCD显示程序中增加一个清除功能就行了了,
设定一个最大的字符串长度, 然后, 做一个空格字符串 ...
如果说我只定义一个比空格字符串多一个字节的数组,好像还是不行,假如说这个数组word只有2字节(u8 word[2]),但是我收到的数据有5个字节(AAAAA),在赋值的过程中,word的第3、4、5个字节位也会被赋值?下一次我只发送一个字节(B),这时会显示成:B空格AAA;
主题帖子精华
金牌会员, 积分 2235, 距离下一级还需 765 积分
在线时间230 小时
如果说我只定义一个比空格字符串多一个字节的数组,好像还是不行,假如说这个数组word只有2字节(u8 word ...
你的空格字符串当然要大于你所收到显示数据的最大值嘛, 这个只能由你自已的情况来定, 多一个字节就是要放我说的哪个结束符 '\0'& &一般情况我都直接用0代替了
主题帖子精华
初级会员, 积分 132, 距离下一级还需 68 积分
在线时间129 小时
你的空格字符串当然要大于你所收到显示数据的最大值嘛, 这个只能由你自已的情况来定, 多一个字节就是要放 ...
谢谢大神,,,睡觉之前总算把白天的事情弄好了&&
主题帖子精华
金牌会员, 积分 2235, 距离下一级还需 765 积分
在线时间230 小时
谢谢大神,,,睡觉之前总算把白天的事情弄好了
不用谢, 5分给我就行! 我就冲你哪5分来的,笑!!!!!1
主题帖子精华
在线时间225 小时
在数组后面加’\0'
主题帖子精华
初级会员, 积分 132, 距离下一级还需 68 积分
在线时间129 小时
你的空格字符串当然要大于你所收到显示数据的最大值嘛, 这个只能由你自已的情况来定, 多一个字节就是要放 ...
早上起来再想想,在后面一个字节加0的方法:
就是说我接收到USART_RX_BUF[]是5个字节,然后我给word赋值6个字节,前五个字节等于USART_RX_BUF[4],最后一个字节是八个0,是这个意思吗?
主题帖子精华
初级会员, 积分 69, 距离下一级还需 131 积分
在线时间9 小时
我也在做这个,能参考下程序吗
Powered by

我要回帖

更多关于 单片机串口发送数据 的文章

 

随机推荐