搜索
bottom↓
回复: 12

初学者变态的1602玩法...

[复制链接]

出0入0汤圆

发表于 2012-4-21 13:37:16 | 显示全部楼层 |阅读模式
小弟刚学到1602,刚开始的时候卡死在初始化上了,一见Delay就头大,索性咱不要Delay了.
把测试程序贴上来,求大家看看代码有什么毛病,和隐患。
这是main()
#include <reg52.h>
//#include <STC90.H>         //STC单片机用的,可代替reg52.h
#include "LCD1602.h"
#include "MacroAndConst.h"
#include "Time.h"


xdata unsigned char str[] ="LCD1602 Init OK!";
xdata unsigned char str2[]="BUSY  Count=";
void main(void)
{
    unsigned j,i,k,g,s,b,q;
        Timer0Init();
        EA=1;
    LCD1602_Init();
    while(1)
        {
        while(!LCD1602_Write(0x80,1))k++;
        for(i=0;i<=16;i++)
                    {
                     while(!LCD1602_Write(str,0))k++;
                        }
                while(!LCD1602_Write(0xC0,1))k++;
            for(i=0;i<12;i++)
                    {
                     while(!LCD1602_Write(str2,0))k++;               
                        }
                g=k%10+0x30;
                s=k/10%10+0x30;
                b=k/100%10+0x30;
                q=k/1000%10+0x30;
               
                while(!LCD1602_Write(q,0))k++;
                while(!LCD1602_Write(b,0))k++;
                while(!LCD1602_Write(s,0))k++;
                while(!LCD1602_Write(g,0))k++;
                j=0;
               
                while(j<=500)
                        {
                                 if(SysTime1Ms)
                                {
                             j++;
                             SysTime1Ms=0;
                                }
                        }
                k=0;                                 
                while(!LCD1602_Write(0x01,1))k++; //清屏       
        }
}


这是1602.c
  1. //#include <STC90.H>
  2. #include <reg52.h>
  3. #include <intrins.h>
  4. #include "MacroAndConst.h"
  5. #include "Time.h"

  6. /*           晶振=12M        */

  7. //////LCD1602端口定义//////
  8. sbit LCD1602_RS=P2^6;                  //0=读写状态or命令 ,1=读写数据
  9. sbit LCD1602_RW=P2^5;                  //0=写,1=读
  10. sbit LCD1602_EN=P2^7;                  //1=读,高脉冲=写
  11. sbit LCD1602BUSY=P0^7;        //1=液晶忙,0=空闲  
  12. #define LCD1602_DAT P0


  13. //////LCD1602忙判断///////////////////////
  14. bit LCD1602_Busy(void)
  15. {  
  16.     LCD1602BUSY=1;
  17.     LCD1602_EN=0;
  18.     LCD1602_RS=0;
  19.     LCD1602_RW=1;
  20.     LCD1602_EN=1;       
  21.     while(LCD1602BUSY)return 0;                  //空闲标志=1
  22.     LCD1602_EN=0;       
  23.     return 1;
  24.                                        
  25. }

  26. //////LCD1602写命令或数据函数//////
  27. bit LCD1602_Write(uchar LCD_DAT,bit ComOrDat)     
  28. {       
  29.            //while(!SysTime1Ms);SysTime1Ms=0;                //写命令内的延时,死循环
  30.         if((!ComOrDat)&&LCD1602_Busy())                        //ComOrDat=0,写数据
  31.         {
  32.         LCD1602_RS=1;
  33.         LCD1602_RW=0;
  34.         LCD1602_DAT=LCD_DAT;
  35.         LCD1602_EN=1;
  36.         LCD1602_EN=0;
  37.         return 1;        
  38.         }
  39.     if((ComOrDat)&&LCD1602_Busy())                                //ComOrDat=1,写命令
  40.         {
  41.         LCD1602_EN=0;
  42.         LCD1602_RS=0;
  43.         LCD1602_RW=0;
  44.         LCD1602_DAT=LCD_DAT;
  45.         LCD1602_EN=1;
  46.         LCD1602_EN=0;
  47.         return 1;
  48.         }
  49.     return 0;
  50. }

  51. ////////初始化最关键,注意调节延时。仿真失败不代表真机不行。//////
  52. void LCD1602_Init(void)      
  53. {       
  54.                                           //仿真用延时
  55.     while(!LCD1602_Write(0x38,1));  
  56.     while(!LCD1602_Write(0x08,1)); //关显,无光标
  57.            while(!LCD1602_Write(0x01,1)); //清屏
  58.     while(!LCD1602_Write(0x0c,1)); //开显,无光标
  59.   //while(!LCD1602_Write(0x06,1));
  60.        
  61. }
复制代码
这是time.c
  1. #include "MacroAndConst.h"
  2. #include <reg52.h>

  3. bit SysTime1Ms;
  4. bit SysTime2Ms;

  5. void Delay1Ms(unsigned long j)                   //初始化不必忌讳用Delay
  6. {
  7.         //if(j=0)return;
  8.     while(j--)
  9.     {
  10.         while(!SysTime1Ms);
  11.         SysTime1Ms=0;
  12.     }
  13. }

  14. void Timer0Init(void)
  15. {
  16.     TMOD &= 0xf0 ;  
  17.     TMOD |= 0x01 ;      //定时器0工作方式1
  18.     TH0  =  0xfc ;      //定时器初始值
  19.     TL0  =  0x17;  
  20.     TR0  = 1 ;  
  21.     ET0  = 1 ;  
  22. }

  23. void SysTimeIst() interrupt 1       
  24. {
  25.   //  static unsigned int c;
  26.         TH0  =  0xfC ;      //定时器初始值
  27.     TL0  =  0x1f;
  28.     SysTime1Ms=1;
  29. //        if(++c>=1){SysTime2Ms=1;c=0;}
  30. }
复制代码
头文件1602.h
  1. #ifndef         _LCD1602_H_
  2. #define                _LCD1602_H_

  3. extern bit LCD1602_Write(unsigned char,bit);
  4. extern void LCD1602_Init(void);
  5. #endif
复制代码
time.h
  1. #ifndef _Time_H_
  2. #define _Time_H_
  3. extern void Timer0Init(void);
  4. extern void Delay1Ms(unsigned long);
  5. extern bit SysTime1Ms;
  6. extern bit SysTime2Ms;
  7. #endif
复制代码

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

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

出0入0汤圆

发表于 2012-4-21 14:10:50 | 显示全部楼层
试一下将查忙部分用简单的延时来替换试试吧,一般都是这个问题.

出0入0汤圆

发表于 2012-4-21 14:14:36 | 显示全部楼层
找个例子研究下吧  网上多的是  
贴一大堆程序让大家找BUG     看着都累

出0入0汤圆

发表于 2012-4-21 14:31:54 | 显示全部楼层
不要做浮躁的工程师哦。。亲

出0入0汤圆

 楼主| 发表于 2012-4-21 15:01:46 | 显示全部楼层
编译已经通过,运行正常
main()循环3个写命令,32个写数据
STC90C516RD+:
12M 12T读出BUSY计数为50-53,6T下计数为126-129
33.8688M 6T计数为401-403,12T计数为181-18316M计数484-488


STC12C5A60S2:
1T 外部12M计数为353-356,内部RC 计数为331-334
33.8688M晶振不行了,一团麻子....
27M也不行....麻子

出0入0汤圆

发表于 2012-4-21 17:05:54 | 显示全部楼层
没有 cowboy 的人肉驱动1602变态,,,

出0入0汤圆

发表于 2012-4-21 18:27:05 | 显示全部楼层
没有什么变态,各有各法能用就行。

出0入0汤圆

发表于 2012-4-21 18:37:42 | 显示全部楼层
BT在哪里?

出0入0汤圆

发表于 2012-4-21 20:16:24 | 显示全部楼层
为何要变态了,常态不是很好么?

出0入0汤圆

发表于 2012-4-21 20:43:07 | 显示全部楼层
用定时器做延时。。。。有啥变态?
有时候程序里做超时等待,还不能用软件延时,硬件定时器+状态变量是最简单的了。

出0入0汤圆

发表于 2012-4-22 10:01:37 来自手机 | 显示全部楼层
程序写的太个性了,不太容易看明白呀

出0入0汤圆

 楼主| 发表于 2012-4-22 11:13:52 | 显示全部楼层
主要是看初始化函数和main()的while()
我的意思是,用while死等忙信号难道不危险吗?
难道大家的1602始终都会有空的吗?不会卡死?
如果大家都认为这类写法很正常,是不是说大家都没有被忙信号卡死过?

出0入264汤圆

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

本版积分规则

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

GMT+8, 2024-6-8 02:25

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

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