这种问题我习惯用的处理方式:接收的只管接收,显示的只管显示,但是主程序在接收完整的数据之后,会对接收的一帧数据进行校验译码转换等处理,如果有显示,则把数据转换到显示缓冲1区,然后建立一个标志,这个标志是通知显示刷新程序,在显示中断中,如果完成了一次从头至尾的显示扫描,那么就会坚持这个标志,如果标志有效,刷新程序会把显示缓存1区的数据整体复制到显示缓存2区,然后开始以2区的数据作为显示内容,进行显示刷新扫描,这样两边不会产生冲突。同时把刚刚建立的标志清零。同样的,如果主程序在建立这个标志之后,下次译码转换前会先判断这个标志,如果标志仍在,就不会做译码转换。
虽然2个缓冲区,内存RAM有点浪费,但是绝对避免了显示问题,否则的话,实际试验,LED上一直存在飘忽不定的鬼影。不过现在直接用显示驱动的专用芯片,就没这个烦恼了,便宜方便。
串口中断做的不好,居然在中断里干等一帧数据,还是开辟一个接收缓冲区吧 串口收数放缓冲区,主程序判断有数据更新,就更新数码管的显示缓冲区。接收只管接收,显示只管显示,我的建议。 taocongrong 发表于 2012-11-1 17:20 static/image/common/back.gif
王老师您好:
这是我的代码
#include
说实话,看了代码,我当时就OTZ了……
解决这类问题其实是有标准的方式的,但考虑到循序渐进的问题,那个不提也罢,以下是我基于你现在的状况提的一些建议:
1、从LZ编写代码的风格来看,应该不是很熟悉队列操作,也就是说可能还不擅长使用缓冲区。从这点出发,我们直接考虑
在中断里面处理数据的问题。
2、在中断里面接收数据不是不可以,而是不可以死等。简单说就是要用到状态机,一般做法是用一个static变量记录状态,
然后在不同的状态等待接收不同的字符,状态机可以简单的用switch case来实现。这方面的例子很多,你也可以参考
我板块里面的状态机教程。
3、用全局的数组或者变量来保存中断里面接收到的数据是没有问题的,但要注意做好原子保护,说白了就是在主循环里面
操作这个全局变量或者数组的时候,要暂时性的关闭全局中断响应。
4、最后我比较在意的是,系统主频是多少?你有仔细确认过么?不要到最后跑个1M的频率…… 版主说话就是条理清楚
还有个细节要注意,数码管动态扫描过程是
1、关所有位选信号
2、输出段信号
3、打开相应的位选
否则也有微弱的闪烁感 taocongrong 发表于 2012-11-2 10:53 static/image/common/back.gif
主频是7.3728MHZ,我看看,其实准备用两个单片机实现的,一个单片机用串口接收数据,而后 将第一个单片机 ...
这样一个简单的应用如果用两片单片机,真的是对不起你自己…… 怎么什么都看不到
页:
[1]