求助~学习了几天状态机~想用状态机写个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的代码~想利用状态机的~可是我越往下越觉得自己被套进去了~哪位大侠能给我点指点~我现在头都大了~谢谢
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
17条回答
fengtianzhifeng
2020-02-07 02:30
BXAK 发表于 2012-6-26 15:04
很晕,状态机不是这样用法,像上电初始化、写1字节数据……用得着分步细化吗,没事找事 ...

额~那您能给出点修改的意见不?我刚刚接触这个状态机~我觉得状态机应该不仅仅只能作为键盘检测吧~应该好多地方都能用的对吧~
您说说看应该怎么修改才能像以前那种模块式的程序呢?像这样的
  1. void delay1ms(unsigned char a)
  2. {
  3.         unsigned char i=0,j=0;
  4.           for(i=0;i<a;i++)
  5.                   for(j=0;j<110;j++)
  6.                         ;
  7. }
  8. void LCDwriteData(unsigned char com)
  9. {
  10.         RS=1;
  11.         ShowData=com;
  12.         delay1ms(5);
  13.         EN=1;
  14.         delay1ms(5);
  15.         EN=0;
  16. }
  17. void LCDwritecom(unsigned char date)
  18. {
  19.         RS=0;
  20.         ShowData=date;
  21.         delay1ms(5);
  22.         EN=1;
  23.         delay1ms(5);
  24.         EN=0;
  25. }
  26. void LCDinit(void)
  27. {
  28.         RS=0;
  29.         LCDwritecom(0X38);
  30.         LCDwritecom(0X0C);
  31.         LCDwritecom(0X06);
  32.         LCDwritecom(0X01);
  33. }
复制代码

一周热门 更多>