搜索
bottom↓
回复: 16

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

[复制链接]

出0入0汤圆

发表于 2012-6-26 14:03:38 | 显示全部楼层 |阅读模式
  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的代码~想利用状态机的~可是我越往下越觉得自己被套进去了~哪位大侠能给我点指点~我现在头都大了~谢谢

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2012-6-26 14:10:12 | 显示全部楼层
我觉得,原则上没错 .... 状态机的缺点就是将一个完整的思路拆散了,要维护比较多的定时和状态的时候简直是噩梦。

不知道哪位有改进办法?同求!

出0入0汤圆

 楼主| 发表于 2012-6-26 14:17:07 | 显示全部楼层
Etual 发表于 2012-6-26 14:10
我觉得,原则上没错 .... 状态机的缺点就是将一个完整的思路拆散了,要维护比较多的定时和状态的时候简直是 ...

前几天看到您的键盘检测那个方法感觉很受用~我这些天看了状态机~时间片轮~这些,可是几乎都是把整个模块的程序拆分成好多小块,虽然CPU的利用率上去了~但是程序的维护性和可读性变的好差不知道是我能力的问题还是大家都有这样的问题呢?

出0入0汤圆

发表于 2012-6-26 14:31:58 | 显示全部楼层
键盘我也留意到了,理解了之后是非常好用的。
如果键盘也用状态机,你想想,状态又要增加多少?

出0入0汤圆

发表于 2012-6-26 14:38:40 | 显示全部楼层
Etual 发表于 2012-6-26 14:31
键盘我也留意到了,理解了之后是非常好用的。
如果键盘也用状态机,你想想,状态又要增加多少? {:biggrin: ...

求链接~~~~~~

出0入0汤圆

 楼主| 发表于 2012-6-26 14:42:39 | 显示全部楼层
Etual 发表于 2012-6-26 14:31
键盘我也留意到了,理解了之后是非常好用的。
如果键盘也用状态机,你想想,状态又要增加多少? {:biggrin: ...

可是如果不用状态机的话~那样CPU一直处于等待状态确实是个麻烦事情啊~八位的数码管单独测试的时候很好用的~也没有什么闪烁~加了键盘这些以后就不行了~哎~

出0入0汤圆

发表于 2012-6-26 15:04:17 | 显示全部楼层
很晕,状态机不是这样用法,像上电初始化、写1字节数据……用得着分步细化吗,没事找事

出0入0汤圆

发表于 2012-6-26 15:11:10 | 显示全部楼层
y574924080 发表于 2012-6-26 14:38
求链接~~~~~~

http://www.amobbs.com/forum.php? ... st%3D1%26digest%3D1

出0入0汤圆

发表于 2012-6-26 15:16:56 | 显示全部楼层
端午节前用状态机也搞了个程序,放假回来,发现自己都不知道该怎么下手继续了。痛苦

出0入0汤圆

发表于 2012-6-26 15:18:25 | 显示全部楼层
定时标志太多,现在看得头晕..

出0入0汤圆

 楼主| 发表于 2012-6-26 15:33:37 | 显示全部楼层
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. }
复制代码

出0入0汤圆

 楼主| 发表于 2012-6-26 15:35:02 | 显示全部楼层
oksmn 发表于 2012-6-26 15:18
定时标志太多,现在看得头晕..

额~确实是有很多标志~我自己到最后都有点晕乎乎的了~哎~就是想知道怎么才能让LCD1602写数据时,程序里面的DELAY能被取代~~~

出0入0汤圆

发表于 2012-6-26 15:39:55 | 显示全部楼层
08.void LCDwriteData(unsigned char com)

09.{

10.        RS=1;

11.        ShowData=com;

12.        delay1ms(5);

13.        EN=1;

14.        delay1ms(5);

15.        EN=0;

16.}


是 5us ,不是 5ms 吧?

出0入0汤圆

 楼主| 发表于 2012-6-26 15:56:04 | 显示全部楼层
Etual 发表于 2012-6-26 15:39
08.void LCDwriteData(unsigned char com)

09.{

额~对哦~写错了晕死~只有在初始化的时候才需要MS级的延时对吧~

出0入0汤圆

发表于 2012-6-26 16:03:25 | 显示全部楼层
哈哈,正在看状态机,被那些标志搞的头昏脑胀的!!有点砸东西的冲动!!!!

出0入0汤圆

 楼主| 发表于 2012-6-26 16:33:47 | 显示全部楼层
我开心 发表于 2012-6-26 16:03
哈哈,正在看状态机,被那些标志搞的头昏脑胀的!!有点砸东西的冲动!!!! ...

恩恩就是啊~本来看到这种思想觉得终于找到了个方法能提高CPU的利用率了~可是实施还是蛮困难的~哎~系统内部模块只要多一点就会出现问题~受不了了

出0入0汤圆

发表于 2012-6-26 17:48:02 | 显示全部楼层
Etual 发表于 2012-6-26 15:11
http://www.amobbs.com/forum.php?mod=viewthread&tid=4308630&extra=page%3D1%26filter%3Ddigest%26dige ...

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

回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-27 00:19

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表