专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
PIC单片机
关于PIC 单片机 Timer0的问题
2020-02-09 11:27
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
51单片机
8174
13
13
最近在调试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、中断标志、中断允许的处理也同上。
----------------------------
加载中...
1
2
下一页
一周热门
更多
>
相关问题
PIC单片机不同的IO口驱动74HC573驱动共阴极的数码管,有的段不亮
1 个回答
一种简单精确的pic延时方法
21 个回答
谁熟悉PIC的产品发布时间的,帮看看PIC18F47K40啥版本IDE能开发
12 个回答
求AN1078对应的源代码下载地址
5 个回答
PIC单片机应用技巧
4 个回答
串口无法连续接收数据
2 个回答
求助:dsPIC33F串口通信,如何发送字符串
4 个回答
PIC45K40 IOC(interrupt-on-change)功能
2 个回答
相关文章
一种用PIC单片机主时钟驱动的老式挂钟
0个评论
×
关闭
采纳回答
向帮助了您的网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
PIC单片机
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
关闭
您已邀请
15
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
试想:
主程序中,要显示时钟的时候,把LCD的控制线的电平发送出去了、就要给LCD写数据了,这时候定时器中断来了,中断服务程序开始操作LCD(即控制线跟PORTC口),你自己想想,这个时候,LCD在它的接口上看见的是什么?——完全是乱七八糟的时序和数据——它的显示为啥不乱?
建议LZ去看看“临界区”的相关概念。
既然已经把刷新编码器值的程序段放进定时中断服务程序了,为什么不把对时钟显示的刷新也放进去?
-----------------------------------------------------------------------
哦,先谢谢你了。我想了一下也是这个问题。那我再试一下。
“临界区”,我们在操作系统课程上学过,可我不知道在这怎么应用?
我先查一下资料吧。
谢谢你耐心、细心的指导。
-----------------------------------------------------------------------
eduhf_123 经历:
你好,我那你说的这个思路,然后改了一下程序。如下:
void main()
{
.....
1、中断初始化;
..........
其它的初始化;
..............
2、 中断初始化;
while(1)
{
就是进行按键检测;
}
}
把显示时钟,还有编码器的值都放在中断服务程序里处理。
主函数里就只剩下按键检测,但是按键检测也是需要控制LCD的(主要实现菜单的功能)。
但是,我在每次按键按下后,要给LCD 发数据的时候关掉中断。
可是还是有乱的情况。
还发现一个问题,就是中断的初始化程序在主程序的 1 处,和 2 处时,所出现的乱的状况大不一样。
以至于是菜单都没有办法完全显示。
----------------------------
1、按键接在有电平变化中断的IO口上,利用中断实现按键,但不做按键处理,只把扫描到的按键键码放到一个全局变量里;
2、定时器开200ms中断,但中断服务程序中不做处理,只做一个标记,同按键一样,留待主程序检查标记来处理;
3、主程序检查按键有效标志及定时时间到标志,并分别做处理。
4、在主程序中,一定要在紧临while(1)大循环的地方,先清各中断标志、然后再开中断。
----------------------------
或者这样:
----------------------------
1、定时器开5ms中断,利用状态机实现按键扫描(此时按键可接在任意IO口线上),并对中断次数进行计数(40次表示200ms时间到);
2、同上,在主程序中检查按键有效标志与定时时间到标志,并分别处理;
3、中断标志、中断允许的处理也同上。
----------------------------
一周热门 更多>