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

2020-02-04 09:08发布

小弟刚学到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
复制代码
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
12条回答
Sullivan
1楼-- · 2020-02-05 05:27
BT在哪里?
ShawnLinson
2楼-- · 2020-02-05 07:20
为何要变态了,常态不是很好么?
huayuliang
3楼-- · 2020-02-05 11:30
用定时器做延时。。。。有啥变态?
有时候程序里做超时等待,还不能用软件延时,硬件定时器+状态变量是最简单的了。
guozaizb
4楼-- · 2020-02-05 15:13
 精彩回答 2  元偷偷看……
大斧
5楼-- · 2020-02-05 16:05
主要是看初始化函数和main()的while()
我的意思是,用while死等忙信号难道不危险吗?
难道大家的1602始终都会有空的吗?不会卡死?
如果大家都认为这类写法很正常,是不是说大家都没有被忙信号卡死过?
mcu_lover
6楼-- · 2020-02-05 17:42
忙等待 要加入超时处理。

一周热门 更多>