请教如何让系统实时性更强

2020-02-05 09:01发布

本帖最后由 fengtianzhifeng 于 2012-6-19 13:56 编辑

请问下大家~谁能给我说下
时间片轮转调度算法~举个很简单的例子我的小系统中有4*4的矩阵键盘,有LCD1602,还有ADC转换器。当我只测试LCD1602的时候没什么问题,测试键盘也没有什么问题~测试AD也没有问题,但是只要把这些模块集合到一起就会出问题,单片机的执行周期变的很大,浪费了很多很多时间,单片机就是属于站着等待了,而不是跑着等待,说的通俗点就是系统的实时性变的超级差~请问大家有什么解决的法子
更通俗点就是如何实现多任务
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
29条回答
daicp
1楼-- · 2020-02-05 11:12
用中断,尽量不要用WHILE
fengtianzhifeng
2楼-- · 2020-02-05 15:43
本帖最后由 fengtianzhifeng 于 2012-6-19 14:03 编辑
daicp 发表于 2012-6-19 13:57
用中断,尽量不要用WHILE


额用时间中断对吧~那个键盘检测至少也要20MS的消抖吧~LCD1602显示部分也差不多要10MS左右的吧~那这些如何利用时间中断结合起来呢?
还有对于中断的时间必须要比执行程序的时间要长才可以的啊~这样的话几乎没有起到什么积极的作用呀
mored
3楼-- · 2020-02-05 16:20
键盘、AD这些直接在中断处理就可以吧
lcd用状态机
不要死等较长的时间
fengtianzhifeng
4楼-- · 2020-02-05 21:24
mored 发表于 2012-6-19 14:13
键盘、AD这些直接在中断处理就可以吧
lcd用状态机
不要死等较长的时间

额~我写了个小的程序只有矩阵键盘和LCD的您能帮我修改下么?
我LCD就是显示键盘的那个按键按下是第几行第几列
  1. #include "reg52.h"
  2. #define ReadData P1
  3. #define ShowData P2
  4. sbit RS=P0^0;
  5. sbit EN=P0^1;
  6. unsigned char tar=0;
  7. unsigned char cont=0;
  8. unsigned char hang=0;
  9. unsigned char lie=0;
  10. void delay1ms(unsigned char a)
  11. {
  12.         unsigned char i=0,j=0;
  13.           for(i=0;i<a;i++)
  14.                   for(j=0;j<110;j++)
  15.                         ;
  16. }
  17. void LCDwriteData(unsigned char com)
  18. {
  19.         RS=1;
  20.         ShowData=com;
  21.         delay1ms(5);
  22.         EN=1;
  23.         delay1ms(5);
  24.         EN=0;
  25. }
  26. void LCDwritecom(unsigned char date)
  27. {
  28.         RS=0;
  29.         ShowData=date;
  30.         delay1ms(5);
  31.         EN=1;
  32.         delay1ms(5);
  33.         EN=0;
  34. }
  35. void LCDinit(void)
  36. {
  37.         RS=0;
  38.         LCDwritecom(0X38);
  39.         LCDwritecom(0X0C);
  40.         LCDwritecom(0X06);
  41.         LCDwritecom(0X01);
  42. }
  43. void keytest(void)
  44. {
  45.         unsigned char date;
  46.         ReadData=0x0f;
  47.         date=ReadData;
  48.         ReadData=0xf0;
  49.         date=(date|ReadData)^0xff;
  50.         tar=date&(date^cont);
  51.         cont=date;
  52. }
  53. void htos(unsigned char hex)
  54. {
  55.         hang=hex%16;
  56.         lie=hex/16;
  57.         if(hang==1)
  58.                 hang='1';
  59.         else if (hang==2)
  60.                 hang='2';
  61.         else if(hang==4)
  62.                 hang='3';
  63.         else if(hang==8)
  64.                  hang='4';
  65.         if(lie==1)
  66.                  lie='1';
  67.         else if(lie==2)
  68.                 lie='2';
  69.         else if(lie==4)
  70.                 lie='3';
  71.         else if(lie==8)
  72.                 lie='4';
  73. }
  74. void keypro(void)
  75. {
  76.         if(tar)
  77.         {       
  78.                 htos(tar);
  79.                 LCDwritecom(0x80+0x00);
  80.                 LCDwriteData(hang);
  81.                 LCDwriteData(lie);
  82.         }
  83. }
  84. void main(void)
  85. {
  86.         LCDinit();
  87.         while(1)
  88.         {
  89.                 keytest();
  90.                 keypro();
  91.        
  92.         }
  93. }
复制代码
fengtianzhifeng
5楼-- · 2020-02-06 01:32
 精彩回答 2  元偷偷看……
xiaoziwen
6楼-- · 2020-02-06 04:49

一周热门 更多>