LCD1602使用问题解决,stm32入门基本问题_第1页
LCD1602使用问题解决,stm32入门基本问题_第2页
LCD1602使用问题解决,stm32入门基本问题_第3页
LCD1602使用问题解决,stm32入门基本问题_第4页
LCD1602使用问题解决,stm32入门基本问题_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、12015 年 6 月 2 日 13:45:561.LCD_Write(LCD_COMMAND,0 x82);/设置光标闪烁地址LCD_SetDisplay(LCD_SHOW|LCD_CURSOR|LCD_FLASH);/光标闪烁我 lcd1602 中明明有,为什么说没有?我知道了,宏定义的内容应该放到头文件里面。问题解决了,果然是宏定义放错地方了。现在能有一点切屏的感觉了,但是有很多残余字符。起始界面,省得刚开始什么也没有空空的看着不好看。起始界面的字母还留在下面检测界面中, 而且因为判定条件是有按键中断才能数据更新,所以数据无法实时变动变动2现在按键改变值的界面出现的问题是,切换输入区域后

2、,其他值消失,而且也存在字符残留,看来在显示下一个界面前,要清屏一次。加一句LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);解决问题还有一个问题就是按键修改值界面进入的判断条件,必须按数字,这是错误的。由此看来合并问题最多的地方就出在逻辑上,出在判断条件上。思路有问题就编不出理想的程序, 头脑必须要清醒, 最好是先列一个流程图,算法要先于程序的编写。现在又出问题了,将按键修改值界面进入的判断条件中的是否为数字按键条件删除以后,程序无法进入修改界面。现在切换界面已经很流畅了,达到了想要的目的。我发现检测界面的判断条件根本不需要判断按键值。现在最大的问题是只有按键中

3、断产生一切才可以执行,这是最大的问题,最外围的条件不能是按键中断,否则不按键,检测值就无法实时的发生变化。我感觉按键中断不要和检测产生交集。现在最新的状态是屏幕显示相当不清楚,我怀疑是每显示一次都清屏,这样可能不好。还没稳定下来,就被清屏了,如下图所示。非常模糊,对吧。既然上电默认显示检测界面,那么刚开始的欢迎界面也可以省掉了。否则见下图。3现在的问题是没办法切屏了,仅仅停留在检测界面。现在在检测界面感觉屏幕的反应速度比原来慢了,刷新的速度降下来了。下一步我的解决方案是,按键中断不作为最外层函数,而是分别写入到检测界面部分和修改界面代码中,而且要放到代码部分的最后,不要进行的时候就中断他。既然

4、要切换界面,那就清一下屏吧,清中。现在检测界面没屏语句直接放到翻页函数问题,切换也很成功,不过就是按键修改界面无法显示修改值,一个数也不显示。2015 年 6 月 3 日 5:59:571.现在修改界面仅仅修改值第一位有光标,而且光标在闪动,按键后光标不会移动,按下切换位置键,位置不会发生切换。而且屏幕有些抖动。2.看来屏幕的闪动只能出现一次看来这里得去掉了。2F:和 S:既然都显示,那么就都放在外面吧,省得占位置,占运算量。经过实践表明,不能提取出来,否则检测界面会出错,不仅 F:显示变成了kg,而且 S:无法显示。4这是修改界面,原来是有三个空格的,我怀疑正是因为存在空格的原因导致无法正常

5、显示,可以看到 S:后面依然存在空格,冒号后面去掉空格就可以了,但是人家的程序就没有问题我也不知道是为什么。终于找到原因了。4.现在基本满足课题的需要了,但是有一点小小的瑕疵,就是光标闪动的位置在第二排第七个位置上,也就是 0 xc7 上。而且刚开始没有起始光标闪动,所以在把原来的相关语句加上。经过实践表明,这样处理也会出错,每一次的输入都会导致第一行第二位上的数闪动。5.我现在怀疑起始通道,没有置 1.不是这个问题。6.如果牵引力的检测值大于等于设定值,继电器 1 吸合,继电器 2 断开,如果检测值小于设定值,继电器 1 断开,继电器 2 吸合7.加了一个判断是否为第一次的标志,解决了光标闪

6、烁的问题。if (i=1)LCD1602_DispString(0,0,F:);/0 行显示提示信息LCD1602_DispString(5,0,kg);LCD1602_DispString(8,0,T:);LCD1602_DispString(13,0,min);LCD1602_DispString(0,1,S:);/1 行显示提示信息LCD1602_DispString(5,1,mm);LCD_Write(LCD_COMMAND,0 x82);LCD_SetDisplay(LCD_SHOW|LCD_CURSOR|LCD_FLASH|LCD_AC_UP);Delay_ms(10);/延时等待

7、稳定i+=1;5if(i=1)LCD1602_DispString(0,0,F:);/0 行显示提示信息LCD1602_DispString(5,0,kg);LCD1602_DispString(8,0,T:);LCD1602_DispString(13,0,min);LCD1602_DispString(0,1,S:);/1 行显示提示信息LCD1602_DispString(5,1,mm);Delay_ms(10);/延时等待稳定8.既然要控制继电器,那么设定值一定要保存住,还有就是不能切换完界面,设定值都消失了, 这可不行。 切换回来必须还能看到设定的值。 看来高兴的有点早。9.越来越感

8、觉现在做的东西和市场上的电子表好像啊。10.加上继电器程序以后,继电器反复快速的切换开关状态。if(force!=0)if(force=force1)relay1=0;relay2=1;else if(forceforce1)relay1=1;relay2=0;11.我怀疑需要用到 EEPROM,感觉上面(10)的方法不可靠。12.如果要用 EEPROM 那么,I2C 的线有不够用了,也就是说又得去造线了。一分为二。 感觉加上 EEPROM,论文立马显得高大上了, 有没有。 又得去补 EEPROM的知识了。13.如果 I2C 总线上带两个地址不一样的器件,这块单片机开发板能带的动吧。14.P2

9、 口内部自带上拉电阻,所以可以挂两根 I2C 总线。2015 年 6 月 4 日 14:06:3461.这里应该是 0 才对啊。数组里面只有一个元素啊?2015 年 6 月 4 日 21:20:291./设置 NVIC 分组/NVIC_Group:NVIC 分组 04 总共 5 组void MY_NVIC_PriorityGroupConfig(u8 NVIC_Group)temp1=(NVIC_Group)&0 x07;/取后三位这个取反还是很有意思的,因为他的分组值的二进制数取反即为欲设置的AIRCR10:8。以后编辑能省的就省了,只对重点进行解释,不解释的就不用出现了,除非有必要。201

10、5 年 6 月 7 日 22:09:531./设置 NVIC/NVIC_SubPriority 和 NVIC_PreemptionPriority 的原则是,数值越小,越优先voidMY_NVIC_Init(u8NVIC_PreemptionPriority,u8NVIC_SubPriority,u8NVIC_Channel,u8 NVIC_Group)/上面的函数中提到了 NVIC_channel,在定时器初始化的函数定义中可以看到他的调用地方,以下计算均采用本例子。/现在又看到一个新的量,TIM3_IRQn,这个得去 stm32f10 x.h 中去找,7temp=NVIC_Preempti

11、onPriorityNVIC_Group);/NVIC_SubPriority=3=(0011)B,0 x0f2=0X03,temp|=(0011)B,temp=0111temp&=0 xf;/取低四位/ temp&0 xf=0111NVIC-ISERNVIC_Channel/32|=(1NVIC_Channel%32);/使能中断位(要清除的话,相反操作就 OK)/NVIC_Channel/32=29/32=0,1NVIC_Channel%32=129%32=1IPNVIC_Channel|=temp4;/设置响应优先级和抢断优先级/temp0,执行指令sbit SDA=P22; /指定 S

12、DA 连接端口,应根据实际连接更改sbit SCL=P23; /指定 SCL 连接端口,应根据实际连接更改4.整理一下程序,把没用的都删除掉。5.既然时间和位移的设定值不需要计算,那就删除掉。6.原来继电器还会动作,现在都不会动作了。7.为什么上电后,我硬生生的让继电器显示一个状态他都不显示,但是拔掉线之后继电器又会显示需要的状态?8.难道继电器打开以后就关不掉了吗?9.我咋感觉延时函数好像有问题,延时时间我不确定。10.继电器这玩意的工作原理是什么,把我搞得很晕啊。不就是像 LED 灯一样的开关量吗?#includesbit relay1=P00;sbit relay2=P01;void D

13、elay10ms(unsigned int c)/误差 0usunsigned char a, b;/-c 已经在传递过来的时候已经赋值了,所以在 for 语句第一句就不用赋值了-/for (;c0;c-)for (b=38;b0;b-)for (a=130;a0;a-);void main()while(1)9relay1=1;relay2=0;Delay10ms(50);Delay10ms(50);relay1=relay1;relay2=1;Delay10ms(50);Delay10ms(50);以上程序是可以用的,难道是延时时间不够?relay1=relay1;取反这句话也可以用,跟

14、LED 灯是一样的。11.通过不停地不止一次地分别地往检测和设置函数中放置相应的继电器动作的语句,最终我看到了继电器动作切换的现象。看来只执行一次还是不够。要么就是放置的位置有问题。难不成我还需要继续加一个标志位,继续判断。12.把设定值干脆改成一位,因为就使用一位吗嘛。13.只检测一路信号,只设定一路信号,先把最小系统研究好。14.控制继电器时判断条件还得使用指针指向数组元素, 也许这次又是指针把我救了。15.最后果然是指针把我救了,用了两个指针。没想到指针竟然是如此的强大。16.现在程序还有点小问题,就是在设定值时原来的数还没有删除,他会继续保存在数组中,这样控制会很不稳定。不过好像没关系

15、。17.现在又有新的要求了, 现在新的任务是输入小数。 就像检测值一样的小数。小数要求是几点几。18.感觉判断的地方还需要再加几遍,因为感觉判断少了系统变得不敏感了,输入完了以后没现象。19.刚开始可能需要动一下旋转电位器,否则可能没有值存进去。20.代码是让系统运行,而且也是让别人看懂的,否则你的程序可读性太差,为什么不多动动脑子,为变量起一些非常好理解的名字呢?2015 年 6 月 10 日 7:25:461.编写设定值带有小数点的程序,首先需要激活矩阵键盘里面的小数点键。以后比较检测值时不能只比较个位数了,是所有的包括百分位。2.现在小数也能控制了,不过小数点显示的有些异常,显示的是,不

16、是小数点。原因出在小数点加了 0 x30。3.判断语句放对了地方就不需要调用很多次。4.现在的问题是第一次设定以后没有反应。5.检测界面最好还是放一边判断语句,因为这样的话,如果检测值发生变化,继电器会发生相应动作。6.按键的时候一定要干脆,果断,因为程序中好像没有消抖的地方,而且第一次10输入数据后继电器没有反应,连续输入第二遍时候继电器才会动作。2015 年 6 月 11 日 19:19:481./外部中断配置函数/只针对 GPIOAG;不包括 PVD,RTC 和 USB 唤醒这三个/参数:/GPIOx:06,代表 GPIOAG/BITx:需要使能的位;/TRIM:触发模式,1,下升沿;2

17、,上降沿;3,任意电平触发/这里应该是上升沿吧?/该函数一次只能配置 1 个 IO 口,多个 IO 口,需多次调用/该函数会自动开启对应中断,以及屏蔽线void Ex_NVIC_Config(u8 GPIOx,u8 BITx,u8 TRIM)EXTADDR=BITx/4;/得到中断寄存器组的编号EXTOFFSET=(BITx%4)*4;/上面这两句话编的非常巧妙RCC-APB2ENR|=0 x01;/使能 io 复用时钟void USART1_IRQHandler(void)if(USART1-SR&(1DR;11if(USART_RX_STA&0 x8000)=0)/接收未完成if(USAR

18、T_RX_STA&0 x4000)/接收到了 0 x0dif(res!=0 x0a)USART_RX_STA=0;/接收错误,重新开始else USART_RX_STA|=0 x8000; /接收完成了else /还没收到 0X0Dif(res=0 x0d)USART_RX_STA|=0 x4000;elseUSART_RX_BUFUSART_RX_STA&0X3FFF=res;USART_RX_STA+;if(USART_RX_STA(USART_REC_LEN-1)USART_RX_STA=0;/接收数据错误,重新开始接收#ifdef OS_CRITICAL_METHOD/如果 OS_CR

19、ITICAL_METHOD 定义了,说明使用 ucosII 了.OSIntExit();#endif/初始化 IO 串口 1/pclk2:PCLK2 时钟频率(Mhz)/bound:波特率/CHECK OK/091209void uart_init(u32 pclk2,u32 bound)12float temp;u16 mantissa;/u16 代表 unsigned short intu16 fraction;temp=(float)(pclk2*1000000)/(bound*16);/得到 USARTDIVmantissa=temp;/得到整数部分fraction=(temp-man

20、tissa)*16; /得到小数部分mantissaAPB2ENR|=1APB2ENR|=1CRH&=0XFFFFF00F;/IO 状态设置/先清零GPIOA-CRH|=0X000008B0;/IO 状态设置/再设置SET PORTAPIN 10 IN INPUT MODE(input with pull up/pull down)Set port a pin 9 in output mode ,max speed 2MHz(alternate function output push pull )RCC-APB2RSTR|=1APB2RSTR&=(1BRR=mantissa; / 波特率设置

21、USART1-CR1|=0X200C;/1 位停止,无校验位.#if EN_USART1_RX/如果使能了接收/使能接收中断USART1-CR1|=1CR1|=1APB1ENR|=1ARR=arr;/设定计数器自动重装值TIM4-PSC=psc;/预分频器 7200,得到 10Khz 的计数时钟TIM4-DIER|=1CR1|=0 x01;/使能定时器 2MY_NVIC_Init(3,3,TIM4_IRQn,2);/抢占 3,子优先级 3,组 2(组 2 中优先级最低的)5.想学英语也不能挑这个时候吧。2015 年 6 月 22 日 9:14:581.我是用 V3.5 的库函数,是不是 v2.

22、x 的库函数的参考书就没有参考价值了。是不是用什么库,看什么书。2.结构体变量名前面加一个“&”是啥意思?比如下面:GPIO_Init(GPIOA, &GPIO_InitStructure);去掉这个&行吗?也许结构体类型和数组不一样。C 语言规定数组名代表数组中首元素的地址。3.变量的定义要放在可执行语句的前面,declaration may not appear after executable statementin block.204.Stm32 的端口重映射跟 C8051 的交叉开关很像啊。5.这个斜杠是什么意思?去掉行不行?去掉“”之后,出现了这样的错误。去掉是不行的,因为预处理器

23、指令必须在一个逻辑行上,但是可以用续行符“”将他分成很多行。注意必须是这一行的最后一个字符,其后是回车符。网友说:反斜杠符号起到长代码分行书写功能。C 语言里以反斜杠()表示断行。编译器会将反斜杠剔除掉,跟在反斜杠后面的字符自动接续到前一行。但是注意:反斜杠之后不能有空格,反斜杠的下一行之前也不能有空格。但是 printf 这样的标识符和关键字不可以分行写,反斜杠可以被用作接续符。6.assert_param 是啥意思?实际上 assert_param 是一个宏定义;在固件库中,它的作用就是检测传递给函数的参数是否是有效的参数。 所谓有效的参数是指满足规定范围的参数, 比如某个参数的取值范围只

24、能是小于 3 的正整数,如果给出的参数大于 3,则这个 assert_param()可以在运行的程序调用到这个函数时报告错误, 使程序员可以及时发现错误, 而不必等到程序运行结果的错误而大费周折。 这是一种常见的软件技术, 可以在调试阶段帮助程序员快速地排除那些明显的错误。它确实在程序的运行上牺牲了效率(但只是在调试阶段),但在项目的开发上却帮助你提高了效率。当你的项目开发成功,使用 release 模式编译之后,或在 stm32f10 x_conf.h 文件中注释掉对 USE_FULL_ASSERT 的宏定义,所有的 assert_param()检验都消失了,不会影响最终程序的运行效率。20

25、15 年 6 月 23 日 10:22:541.#defineassert_param(expr)(expr)?(void)0:assert_failed(uint8_t*)_FILE_,_LINE_)中的(void)0 是什么意思?网友:宏里面这样用的目的是防止该宏被用作右值, (void)0 本身也不能作右值, 因为 void 非实际的类型!2.为什么有的 int main 函数没有 return 0.int main 与 void main 的区别, stm32 的程序中可以用 int main 吗?我去掉 int 后出现了下图的情况3.#define GPIOA(GPIO_TypeDe

26、f *) GPIOA_BASE)#define GPIOA_BASE(APB2PERIPH_BASE + 0 x0800)21#defineAPB2PERIPH_BASE(PERIPH_BASE + 0 x10000)#define PERIPH_BASE(uint32_t)0 x40000000) /*!SR&0X40)=0);/循环发送,直到发送完毕USART1-DR = (u8) ch;return ch;#endif在独立应用程序中,您不太可能支持半主机操作。 因此,必须确保您的应用程序中没有链接 C 库半主机函数。为确保没有从 C 库链接使用半主机的函数,必须导入符号 _use_no

27、_semihosting。可在您工程的任何 C 或汇编语言源文件中执行此操作,如下所示:在 C 模块中,使用 #pragma 指令:#pragma import(_use_no_semihosting)在汇编语言模块中,使用 IMPORT 指令:23IMPORT _use_no_semihosting如果仍然链接了使用半主机的函数,则链接器会报告错误。半主机是这么一种机制, 它使得在 ARM 目标上跑的代码, 如果主机电脑运行了调试器,那么该代码可以使用该主机电脑的输入输出设备。这点非常重要,因为开发初期,可能开发者根本不知道该 ARM 器件上有什么输入输出设备,而半主基机制使得你不用知道 A

28、RM 器件的外设,利用主机电脑的外设就可以实现输入输出调试。所以要利用目标 ARM 器件的输入输出设备,首先要关掉半主机机制。 然后再将输入输出重定向到 ARM 器件上,如 printf 和 scanf,你需要重写 fputc 和 fgetc 函数。/看百度百科里面的半主机,搞得有点像远程控制,有点黑客的感觉。2. LibrariesandFloatingPointSupportGuide 在Keil官 网 上 有 。3.#pragma 它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作。#学到这里,感觉越来越吃力,计算机科学与技术专业方面的知识越来越欠缺。天天学一些自己看完也不明白的东西。感觉有点不求甚解,但是想求甚解有不会,知其然而不知其所以然。有一些无奈。都是老外的东西,不好理解啊。2015 年 6 月 25 日 19:32:591.在库函数版本例程中跑马灯有两个版本,一个是位带操作,第二个是库函数操作。2.我看见每一个 STM32 工程都有一个,misc.c 的文件,文件中有这些函数,优先级分组配置, 嵌入式向量中断控制器初始化, 向量表设置, 系统低功耗配置, 还有 SYSTICK Timer时钟源的配置。如果想

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论