求助~学习了几天状态机~想用状态机写个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条回答
fengtianzhifeng
1楼-- · 2020-02-07 11:00
Etual 发表于 2012-6-26 15:39
08.void LCDwriteData(unsigned char com)

09.{

额~对哦~写错了晕死~只有在初始化的时候才需要MS级的延时对吧~
我开心
2楼-- · 2020-02-07 12:52
 精彩回答 2  元偷偷看……
fengtianzhifeng
3楼-- · 2020-02-07 15:14
我开心 发表于 2012-6-26 16:03
哈哈,正在看状态机,被那些标志搞的头昏脑胀的!!有点砸东西的冲动!!!! ...

恩恩就是啊~本来看到这种思想觉得终于找到了个方法能提高CPU的利用率了~可是实施还是蛮困难的~哎~系统内部模块只要多一点就会出现问题~受不了了
y574924080
4楼-- · 2020-02-07 18:50
Etual 发表于 2012-6-26 15:11
http://www.amobbs.com/forum.php?mod=viewthread&tid=4308630&extra=page%3D1%26filter%3Ddigest%26dige ...

多谢了~~~~~~~~~~~

一周热门 更多>