求助~学习了几天状态机~想用状态机写个LCD1602的程序可惜··

2020-02-05 08:59发布

  1. #include"reg52.h"
  2. typedef unsigned char tByte;
  3. typedef unsigned int  tWord;
  4. typedef unsigned long tLong;
  5. #define readdata P1
  6. #define showdata P2
  7. #define date1 1
  8. #define com 2
  9. sbit rs=P0^0;
  10. sbit en=P0^1;
  11. sbit led1=P3^0;
  12. tByte tar=0;
  13. tByte cont=0;
  14. tByte hang=0;
  15. tByte lie=0;
  16. tByte time5ok=0;
  17. tByte timecounter=0;
  18. tByte first=0;
  19. tByte table[7]={"hello!"};
  20. tByte finish=0;
  21. void timeinit(void)
  22. {
  23.         TMOD=0X01;
  24.         TH0=(65536-1000)/256;//252;
  25.         TL0=(65536-1000)%256;//24;
  26.         TR0=1;
  27.         ET0=1;
  28. }
  29. void keytest(void)
  30. {
  31.         tByte date=0;
  32.         readdata=0x0f;
  33.         date=readdata;
  34.         readdata=0xf0;
  35.         date=(date|readdata)^0xff;
  36.         tar=date&(date^cont);
  37.         cont=date;
  38. }
  39. void lcdwritedata_com(tByte a,tByte select)
  40. {
  41.         static tByte state=0;

  42.            switch (state)
  43.                 {
  44.                         case 0:        
  45.                                                 if(select==date1)
  46.                                                 rs=1;
  47.                                                 else
  48.                                                 rs=0;
  49.                                                 state=1;
  50.                                                 break;
  51.                         case 1: showdata=a;state=2;break;
  52.                         case 2: en=1;state=3;break;
  53.                         case 3: en=0;state=0;finish=1;break;
  54.                        
  55.                 }
  56. }

  57. void lcdinit(void)
  58. {
  59.         static tByte init1=0;
  60.         rs=0;
  61.         switch (init1)
  62.         {
  63.         case 0:
  64.         if(finish==0)
  65.         lcdwritedata_com(0x38,com);
  66.         init1=1;
  67.         finish=0;
  68.         break;
  69.         case 1:
  70.         if(finish==0)
  71.         lcdwritedata_com(0x0c,com);
  72.         init1=2;
  73.         finish=0;
  74.         break;
  75.         case 2:
  76.         if(finish==0)
  77.         lcdwritedata_com(0x06,com);
  78.         init1=3;
  79.         finish=0;
  80.         break;
  81.         case 3:
  82.         if(finish==0)
  83.         lcdwritedata_com(0x01,com);
  84.         init1=4;
  85.         finish=0;
  86.         break;
  87.         case 4:
  88.         if(finish==0)
  89.         lcdwritedata_com(0x80,com);
  90.         first=1;
  91.         init1=0;
  92.         finish=0;
  93.         break;
  94.         }
  95. }
  96. void main()
  97. {
  98.         static tByte i=0;
  99.         led1=1;
  100.         timeinit();
  101.     EA=1;
  102.            while(1)
  103.         {
  104.                 if(first==0)
  105.                 {
  106.                         if(time5ok==1)
  107.                         {
  108.                                 time5ok=0;
  109.                                 lcdinit();
  110.                                 //led1=0;
  111.                         }
  112.                 }
  113.                         if(first==1)
  114.                         {       
  115.                                 if(time5ok==1)
  116.                                 {
  117.                                         time5ok=0;

  118.                                         lcdwritedata_com(0x80,com);
  119.                                                         lcdwritedata_com(table[i],date1);
  120.                                                         if(finish==1)
  121.                                                         {
  122.                                                                 finish=0;
  123.                                                                 i++;
  124.                                                                         if(i>=)
  125.                                                         }
  126.                                 }
  127.                         }

  128.         }
  129. }
  130. void timer ()interrupt 1
  131. {
  132.         TH0=(65536-1000)/256;//252;
  133.         TL0=(65536-1000)%256;//24;
  134.         if(++timecounter==5)
  135.         {
  136.                 timecounter=0;
  137.                 time5ok=1;
  138.         }
  139. }
复制代码这个是我写的LCD1602的代码~想利用状态机的~可是我越往下越觉得自己被套进去了~哪位大侠能给我点指点~我现在头都大了~谢谢
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
16条回答
Etual
1楼-- · 2020-02-05 10:35
我觉得,原则上没错 .... 状态机的缺点就是将一个完整的思路拆散了,要维护比较多的定时和状态的时候简直是噩梦。

不知道哪位有改进办法?同求!
fengtianzhifeng
2楼-- · 2020-02-05 16:14
Etual 发表于 2012-6-26 14:10
我觉得,原则上没错 .... 状态机的缺点就是将一个完整的思路拆散了,要维护比较多的定时和状态的时候简直是 ...

前几天看到您的键盘检测那个方法感觉很受用~我这些天看了状态机~时间片轮~这些,可是几乎都是把整个模块的程序拆分成好多小块,虽然CPU的利用率上去了~但是程序的维护性和可读性变的好差不知道是我能力的问题还是大家都有这样的问题呢?
Etual
3楼-- · 2020-02-05 21:23
键盘我也留意到了,理解了之后是非常好用的。
如果键盘也用状态机,你想想,状态又要增加多少?
y574924080
4楼-- · 2020-02-06 01:57
 精彩回答 2  元偷偷看……
fengtianzhifeng
5楼-- · 2020-02-06 07:00
Etual 发表于 2012-6-26 14:31
键盘我也留意到了,理解了之后是非常好用的。
如果键盘也用状态机,你想想,状态又要增加多少? {:biggrin: ...

可是如果不用状态机的话~那样CPU一直处于等待状态确实是个麻烦事情啊~八位的数码管单独测试的时候很好用的~也没有什么闪烁~加了键盘这些以后就不行了~哎~
BXAK
6楼-- · 2020-02-06 07:58
很晕,状态机不是这样用法,像上电初始化、写1字节数据……用得着分步细化吗,没事找事

一周热门 更多>