关于PIC 单片机 Timer0的问题

2020-02-09 11:27发布

最近在调试LCD,然后用到定时器,遇到这样的问题,还请各位高手指导,小弟先行谢过了。
问题如下:
    定时器定时200ms,主函数程序执行200ms时然后进入中断,执行中断程序,执行完就又返回到主函数里接着执行,
此时,问题就出现了,在LCD上显示的东西就乱了。
  一直不知道什么问题。。。。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
12条回答
eduhf_123
1楼-- · 2020-02-09 16:41
主程序和中断服务程序里分别都干了些什么?LCD是如何接的?
lffpga
2楼-- · 2020-02-09 17:46
 精彩回答 2  元偷偷看……
eduhf_123
3楼-- · 2020-02-09 20:24
主程序也要操作LCD(显示时钟)、中断服务程序也要操作LCD(显示光栅编码器的值),两者如何不冲突?
试想:
主程序中,要显示时钟的时候,把LCD的控制线的电平发送出去了、就要给LCD写数据了,这时候定时器中断来了,中断服务程序开始操作LCD(即控制线跟PORTC口),你自己想想,这个时候,LCD在它的接口上看见的是什么?——完全是乱七八糟的时序和数据——它的显示为啥不乱?
建议LZ去看看“临界区”的相关概念。

既然已经把刷新编码器值的程序段放进定时中断服务程序了,为什么不把对时钟显示的刷新也放进去?
lffpga
4楼-- · 2020-02-10 01:49
回复【3楼】eduhf_123 经历
-----------------------------------------------------------------------
       哦,先谢谢你了。我想了一下也是这个问题。那我再试一下。
“临界区”,我们在操作系统课程上学过,可我不知道在这怎么应用?
    我先查一下资料吧。
    谢谢你耐心、细心的指导。
lffpga
5楼-- · 2020-02-10 04:33
回复【3楼】eduhf_123 经历
-----------------------------------------------------------------------

eduhf_123 经历:
   你好,我那你说的这个思路,然后改了一下程序。如下:
void main()
{
    .....
1、中断初始化;
..........
    其它的初始化;
..............
2、 中断初始化;
    while(1)
    {
       就是进行按键检测;
     }
}
把显示时钟,还有编码器的值都放在中断服务程序里处理。
主函数里就只剩下按键检测,但是按键检测也是需要控制LCD的(主要实现菜单的功能)。
但是,我在每次按键按下后,要给LCD 发数据的时候关掉中断。

可是还是有乱的情况。

还发现一个问题,就是中断的初始化程序在主程序的 1 处,和 2 处时,所出现的乱的状况大不一样。
以至于是菜单都没有办法完全显示。
eduhf_123
6楼-- · 2020-02-10 10:27
建议你更改程序结构:
----------------------------
1、按键接在有电平变化中断的IO口上,利用中断实现按键,但不做按键处理,只把扫描到的按键键码放到一个全局变量里;
2、定时器开200ms中断,但中断服务程序中不做处理,只做一个标记,同按键一样,留待主程序检查标记来处理;
3、主程序检查按键有效标志及定时时间到标志,并分别做处理。
4、在主程序中,一定要在紧临while(1)大循环的地方,先清各中断标志、然后再开中断。
----------------------------

或者这样:
----------------------------
1、定时器开5ms中断,利用状态机实现按键扫描(此时按键可接在任意IO口线上),并对中断次数进行计数(40次表示200ms时间到);
2、同上,在主程序中检查按键有效标志与定时时间到标志,并分别处理;
3、中断标志、中断允许的处理也同上。
----------------------------

一周热门 更多>