5932|19

65

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

一个奇怪的1602液晶显示问题 [复制链接]

我写了个1602的程序,完全可以驱动1602显示,但有一个这样的问题,我搞不明白。
主函数如下:

void main(void)
{       
    Initialize();//初始化液晶
    WriteChar(5,1,'Q');//在第液晶第1行第6个位置会显示一个“A”
    Delay(500);//延时500ms
    WriteChar(5,2,'Q');//如果没有执行上面那条500ms延时的语句,在第液晶第2行第6个位置会显示一个“B”
                       //如果执行了上面那条500ms延时的语句,在第液晶第2行第6个位置不会有任何反应
                       //我试过,如果改为200ms的延时,是可以正常在第液晶第2行第6个位置会显示一个“B”的
    while(1);
}

先谢谢大家了,这东西困扰我一天了,就是没想明白是什么原因。

最新回复

原来如此…… 确实没注意到这里 刚刚看了STC89C52RC的datasheet,看门狗貌似默认是关闭的  详情 回复 发表于 2010-5-2 01:28
点赞 关注

回复
举报

59

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
没有看懂你的意思,你说的A和B都是属于正常显示吗?你的程序里明明是Q……
另外,如果1602的显示不正常,大半是初始化的问题,另外还有一个就是延时设置问题
你这里只贴出了main函数,关键的initialize和writechar都没有贴出来,实在是无法分析什么
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

板凳
 

  1. //==============================================//
  2. // Filename:   C8051f320_SMC1602A_Display.c     //
  3. //                                              //
  4. // Prozessor:  C8051f320                        //
  5. // Compiler:   Keil C51 7.06                    //
  6. //                                              //
  7. // Author:     Paul.Jia                         //
  8. // QQ:         79974439                         //
  9. // Copyright:  MKL PSC TSD                      //
  10. //==============================================//

  11. //================================================
  12. //1. SYSCLK is unlimited here
  13. //2. Display by SMC1602A
  14. //
  15. //Use 3 ports for control
  16. //Use 8 ports for data communications
  17. //And initialize them right in the Main
  18. //
  19. //Need ms delay function from the Main
  20. //    extern void delay_ms(unsigned short ms);
  21. //
  22. //Need initialize before use the diaplay function
  23. //    void LCMInit(void);
  24. //
  25. //Export these 2 function
  26. //    void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);
  27. //    void DisplayListChar(unsigned char X, unsigned char Y, unsigned char *DData);
  28. //================================================

  29. //----------------------------
  30. // Include Files
  31. //----------------------------

  32. #include
  33. #include



  34. //----------------------------
  35. // Global Constants
  36. //----------------------------

  37. // Define control ports and data ports
  38. // P0.5 - digital        push-pull        (1602)RS
  39. // P0.6 - digital        push-pull        (1602)RW
  40. // P0.7 - digital        push-pull        (1602)E
  41. // P1.x - digital        push-pull        (1602)DATA
  42. // Have to initalize these ports in the Main
  43. //
  44. sbit RS1602 = P0 ^ 5;                             // Register select signal port
  45. sbit RW1602 = P0 ^ 6;                             // Data read/write port
  46. sbit E1602  = P0 ^ 7;                             // Enable signal port
  47. #define DATA1602 P1                               // Data port

  48. // Define macro definition basic the selected ports
  49. //
  50. #define W_D_IN   P1MDOUT &= 0x00                  // Change Data port to open-drain
  51. #define W_D_OUT  P1MDOUT |= 0xFF                  // Change Data port to push-pull

  52. // Define device busy flag
  53. //
  54. #define Busy     0x80



  55. //----------------------------
  56. // Function Prototypes
  57. //----------------------------

  58. // Write data to SMC1602A
  59. //
  60. void WriteDataLCM(unsigned char WDLCM);

  61. // Write command to SMC1602A
  62. //
  63. void WriteCommandLCM(unsigned char WCLCM, unsigned char BusyC);

  64. // Read data from SMC1602A
  65. //
  66. unsigned char ReadDataLCM(void);

  67. // Read command from SMC602A
  68. //
  69. unsigned char ReadStatusLCM(void);

  70. // Initalize SMC1602A
  71. //
  72. void LCMInit(void);

  73. // Display a char at the specified position
  74. //
  75. void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);

  76. // Display a string at the specified position
  77. //
  78. void DisplayListChar(unsigned char X, unsigned char Y, unsigned char *DData);

  79. // Call a extern ms delay function
  80. //
  81. extern void delay_ms(unsigned short ms);



  82. //----------------------------
  83. // Subroutines
  84. //----------------------------

  85. //-----------------Write Data---------------------
  86. void WriteDataLCM(unsigned char WDLCM)
  87. //------------------------------------------------
  88. {
  89.     ReadStatusLCM();                              // Detect Busy
  90.         W_D_OUT;                                      // Change Data port to push-pull
  91.         DATA1602 = WDLCM;                             // Write data
  92.         RS1602 = 1;                                   // LCM_RS = 1;
  93.         RW1602 = 0;                                   // LCM_RW = 0;
  94.         E1602 = 0;                                    // LCM_E = 0; If SYSCLK is high, add a small delay into here
  95.         delay_ms(4);
  96.         E1602 = 1;                                    // LCM_E = 1;
  97. }

  98. //----------------Write Command-------------------
  99. void WriteCommandLCM(unsigned char WCLCM, unsigned char BusyC)
  100. //------------------------------------------------
  101. {
  102.     if(BusyC)                                     // Decide if detect Busy from parameter
  103.         {
  104.             ReadStatusLCM();                          // Detect Busy
  105.         }
  106.         W_D_OUT;                                      // Change Data port to push-pull
  107.         DATA1602 = WCLCM;                             // Write command
  108.         RS1602 = 0;                                   // LCM_RS = 0;
  109.         RW1602 = 0;                                   // LCM_RW = 0;
  110.         E1602 = 0;                                    // LCM_E = 0; If SYSCLK is high, add a small delay into here
  111.         delay_ms(4);
  112.         E1602 = 1;                                    // LCM_E = 1;
  113. }

  114. /*
  115. //------------------Read Data---------------------
  116. unsigned char ReadDataLCM(void)
  117. //------------------------------------------------
  118. {
  119.     RS1602 = 1;                                   // LCM_RS = 1;
  120.         RW1602 = 1;                                   // LCM_RW = 1;
  121.         E1602 = 0;                                    // LCM_E = 0; If SYSCLK is high, add a small delay into here
  122.         delay_ms(4);
  123.         E1602 = 1;                                    // LCM_E = 1;
  124.         W_D_IN;                                       // Change Data port to open-drain
  125.         return DATA1602;                              // Return data
  126. }
  127. */

  128. //-----------------Read Command-------------------
  129. unsigned char ReadStatusLCM(void)
  130. //------------------------------------------------
  131. {
  132.     W_D_IN;                                       // Change Data port to open-drain
  133.         RS1602 = 0;                                   // LCM_RS = 0;
  134.         RW1602 = 1;                                   // LCM_RW = 1;
  135.         E1602 = 0;                                    // LCM_E = 0; If SYSCLK is high, add a small delay into here
  136.         delay_ms(4);
  137.         E1602 = 1;                                    // LCM_E = 1;
  138.         while(DATA1602 & Busy);                       // Detect Busy
  139.         return DATA1602;                              // Return data
  140. }

  141. //------------------Initalize---------------------
  142. void LCMInit(void)
  143. //------------------------------------------------
  144. {
  145.     DATA1602 = 0;
  146.           WriteCommandLCM(0x38, 0);                     // Set display mode 3 times, no detect Busy
  147.         delay_ms(5);
  148.         WriteCommandLCM(0x38, 0);
  149.         delay_ms(5);
  150.         WriteCommandLCM(0x38, 0);
  151.         delay_ms(5);
  152.         // Keep above code

  153.         WriteCommandLCM(0x38, 1);                     // Set display mode(8 bits, 2 rows, 5x7), begin detect Busy everytime
  154.         WriteCommandLCM(0x08, 1);                     // Close display
  155.         WriteCommandLCM(0x01, 1);                     // Clear screen
  156.         WriteCommandLCM(0x06, 1);                     // Show the position of cursor move
  157.         WriteCommandLCM(0x0C, 1);                     // Show boot-strap cursor setting
  158.         WriteCommandLCM(0x80, 1);                     // The first position is row 1 line 1
  159. }

  160. //----------------Display one char----------------
  161. void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
  162. //------------------------------------------------
  163. {
  164.     Y &= 0x1;
  165.         X &= 0xF;                                     // Revise X<=15 Y<=1
  166.         if(Y)                                         // Add 0x40 to address for display row 2
  167.         {
  168.             X |= 0x40;
  169.         }
  170.         X |= 0x80;                                    // Count the address
  171.         WriteCommandLCM(X, 0);                        // Send the address to SMC1602A
  172.         WriteDataLCM(DData);                          // Write the char to SMC1602A
  173. }

  174. //----------------Display list char---------------
  175. void DisplayListChar(unsigned char X, unsigned char Y, unsigned char *DData)
  176. //------------------------------------------------
  177. {
  178.     unsigned char ListLength = 0;
  179.         Y &= 0x1;
  180.         X &= 0xF;                                     // Revise X<=15 Y<=1
  181.         while(DData[ListLength] >= 0x20)              // If the string end, quit
  182.         {
  183.             if(X <= 0xF)
  184.                 {
  185.                     DisplayOneChar(X, Y, DData[ListLength]); // Display one char
  186.                         ListLength++;
  187.                         X++;
  188.                 }
  189.         }
  190. }
复制代码


这是我之前整理的一个SMC1602A的函数模块,LZ你可以注意一下里面的延时部分,这些延时大都是不可或缺的,如果延时过短就有可能造成通讯不正常
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

4
 
#include
#include

#define uchar unsigned char
#define uint unsigned int

sbit RS = P2^5;
sbit RW = P2^6;
sbit E = P2^7;

void Delay(uint);
uchar Read1602(bit a);
void Write1602(uchar a,bit b);
uchar Convert(uchar In_Date);
void WriteChar(uchar x,uchar y,uchar ch);
void Initialize(void);
void WtiteString(uchar x,uchar y,uchar *p) ;



void main(void)
{       
    Initialize();//初始化液晶
     WriteChar(5,1,'Q');//在第液晶第1行第6个位置会显示一个“A”
     Delay(500);//延时500ms  
     WriteChar(5,2,'Q');//如果没有执行上面那条500ms延时的语句,在第液晶第2行第6个位置会显示一个“B”
     //如果执行了上面那条500ms延时的语句,在第液晶第2行第6个位置不会有任何反应
     //我试过,如果改为200ms的延时,是可以正常在第液晶第2行第6个位置会显示一个“B”的
     while(1);       
}
void Initialize(void)
{
       
        Delay(50);
        Write1602(0x38,0);
        Write1602(0x08,0);//关显示
        Delay(2);
        Write1602(0x01,0);//1> 数据指针清零  2> 所有显示清零
        Delay(2);
        Write1602(0x0f,0);
        Delay(2);
        Write1602(0x06,0);//
}


/************************************************************************/
/* 函数名称 :WriteChar                                                
/* 功能     :读液晶
/* 参数     :1> uchar x: 待显示的字符的横坐标  
/*          :2> uchar y: 待显示的字符的枞坐标  
/*          :3> uchar ch: 待显示的字符               
/* 返回值   :无
/* 调用函数 :void Write1602(uchar a,bit b)                                 
/*                                                                     
/* 用到的全局变量:                                                
/************************************************************************/
void WriteChar(uchar x,uchar y,uchar ch)
{
        uchar z;
        z=128+x+64*(y-1);
        Write1602(z,0);
        Write1602(ch,1);
}

void WtiteString(uchar x,uchar y,uchar *p)
{
        uchar z;
        z=128+x+64*(y-1);       
        Write1602(z,0);
        while(*p!='\0')       
        {       
                Write1602(*p,1);
                p++;
        }       
}
       
       

/************************************************************************/
/* 函数名称 :Read1602                                                
/* 功能     :读液晶
/* 参数     :1> bit a: a = 0 时读液晶状态 a = 1 时读液晶数据               
/* 返回值   :uchar temp1
/* 调用函数 :uchar Convert(uchar In_Date)                                 
/*                                                                     
/* 用到的全局变量:                                                
/************************************************************************/
uchar Read1602(bit a)
{
        uchar temp1;
        if(a==0)//读状态
        {       
                E = 0;
                RS = 0;
                RW = 1;
                E = 1;
                temp1=P0;
                E=0;
        }
        if(a==1)//读数据
        {       
               
                E = 0;
                RS = 1;
                RW = 1;
                E = 1;
                temp1=P0;
                E=0;
        }
        return Convert(temp1);
}
/************************************************************************/
/* 函数名称 :Write1602                                                
/* 功能     :写液晶
/* 参数     :1> uchar a: 持写入液晶的数据                                    
/*            2> bit b: b = 0 时给液晶写指令 b = 1 时给液晶写数据                 
/* 返回值   :无
/* 调用函数 :uchar Convert(uchar In_Date)                                 
/*                                                                     
/* 用到的全局变量:                                               
/************************************************************************/
void Write1602(uchar a,bit b)
{
        if(b==0)//写指令
        {       
                E = 0;
                RS = 0;
                RW = 0;
                P0 = Convert(a);
                E = 1;
_nop_();
                E = 0;
        }
        if(b==1)//写数据
        {       
                E = 0;
                RS = 1;
                RW = 0;
                P0 = Convert(a);
                E = 1;
_nop_();
                E = 0;
        }       

}

/********************************************************************
* 名称 : Convert(uchar In_Date)
* 功能 : 因为电路设计时,P0.0--P0.7接法对应的是液晶的D7--D0,所以设计该函数。
* 输入 : 1602资料上的值
* 输出 : 送到1602的值
***********************************************************************/
uchar Convert(uchar In_Date)
{
    uchar i, Out_Date = 0, temp = 0;
    for(i=0; i<8; i++)
    {
        temp = (In_Date >> i) & 0x01;
        Out_Date |= (temp << (7 - i));
    }
    return Out_Date;
}

/********************************************************************
* 名称 : Delay_1ms()
* 功能 : 延时子程序,延时时间为 1ms * x
* 输入 : x (延时一毫秒的个数)
* 输出 : 无
***********************************************************************/
void Delay(uint i)
{
        unsigned char x,j;
        for(j=0;j         for(x=0;x<=148;x++);       
}
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

5
 
这个就是我的完整程序

#include
#include

#define uchar unsigned char  
#define uint unsigned int

sbit RS = P2^5;
sbit RW = P2^6;
sbit E = P2^7;

void Delay(uint);
uchar Read1602(bit a);
void Write1602(uchar a,bit b);
uchar Convert(uchar In_Date);
void WriteChar(uchar x,uchar y,uchar ch);
void Initialize(void);
void WtiteString(uchar x,uchar y,uchar *p) ;



void main(void)
{
  Initialize();//初始化液晶
  WriteChar(5,1,'A');//在第液晶第1行第6个位置会显示一个“A”
  Delay(500);//延时500ms   
  WriteChar(5,2,''B');//如果没有执行上面那条500ms延时的语句,在第液晶第2行第6个位置会显示一个“B”
  //如果执行了上面那条500ms延时的语句,在第液晶第2行第6个位置不会有任何反应
  //我试过,如果改为200ms的延时,是可以正常在第液晶第2行第6个位置会显示一个“B”的
  while(1);
}
void Initialize(void)
{

Delay(50);
Write1602(0x38,0);
Write1602(0x08,0);//关显示
Delay(2);
Write1602(0x01,0);//1> 数据指针清零 2> 所有显示清零
Delay(2);
Write1602(0x0f,0);
Delay(2);
Write1602(0x06,0);//
}


/************************************************************************/
/* 函数名称 :WriteChar   
/* 功能 :读液晶
/* 参数 :1> uchar x: 待显示的字符的横坐标   
/* :2> uchar y: 待显示的字符的枞坐标   
/* :3> uchar ch: 待显示的字符   
/* 返回值 :无
/* 调用函数 :void Write1602(uchar a,bit b)   
/*   
/* 用到的全局变量:   
/************************************************************************/
void WriteChar(uchar x,uchar y,uchar ch)
{
uchar z;
z=128+x+64*(y-1);
Write1602(z,0);
Write1602(ch,1);
}

void WtiteString(uchar x,uchar y,uchar *p)  
{
uchar z;
z=128+x+64*(y-1);
Write1602(z,0);
while(*p!='\0')
{
Write1602(*p,1);
p++;
}
}



/************************************************************************/
/* 函数名称 :Read1602   
/* 功能 :读液晶
/* 参数 :1> bit a: a = 0 时读液晶状态 a = 1 时读液晶数据   
/* 返回值 :uchar temp1
/* 调用函数 :uchar Convert(uchar In_Date)   
/*   
/* 用到的全局变量:   
/************************************************************************/
uchar Read1602(bit a)
{
uchar temp1;
if(a==0)//读状态
{
E = 0;
RS = 0;
RW = 1;
E = 1;
temp1=P0;
E=0;
}
if(a==1)//读数据
{

E = 0;
RS = 1;
RW = 1;
E = 1;
temp1=P0;
E=0;
}
return Convert(temp1);
}
/************************************************************************/
/* 函数名称 :Write1602   
/* 功能 :写液晶
/* 参数 :1> uchar a: 持写入液晶的数据   
/* 2> bit b: b = 0 时给液晶写指令 b = 1 时给液晶写数据   
/* 返回值 :无
/* 调用函数 :uchar Convert(uchar In_Date)   
/*   
/* 用到的全局变量:   
/************************************************************************/
void Write1602(uchar a,bit b)
{
if(b==0)//写指令
{
E = 0;
RS = 0;
RW = 0;
P0 = Convert(a);
E = 1;
_nop_();
E = 0;
}
if(b==1)//写数据
{
E = 0;
RS = 1;
RW = 0;
P0 = Convert(a);
E = 1;
_nop_();
E = 0;
}

}

/********************************************************************
* 名称 : Convert(uchar In_Date)
* 功能 : 因为电路设计时,P0.0--P0.7接法对应的是液晶的D7--D0,所以设计该函数。
* 输入 : 1602资料上的值
* 输出 : 送到1602的值
***********************************************************************/
uchar Convert(uchar In_Date)
{
  uchar i, Out_Date = 0, temp = 0;
  for(i=0; i<8; i++)
  {
  temp = (In_Date >> i) & 0x01;
  Out_Date |= (temp << (7 - i));
  }
  return Out_Date;
}

/********************************************************************
* 名称 : Delay_1ms()
* 功能 : 延时子程序,延时时间为 1ms * x
* 输入 : x (延时一毫秒的个数)
* 输出 : 无
***********************************************************************/
void Delay(uint i)
{
unsigned char x,j;
for(j=0;j for(x=0;x<=148;x++);
}
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

6
 
路过,学习一下
 
 
 

回复

60

帖子

0

TA的资源

一粒金砂(初级)

7
 
不知道你用的是什么型号的1602,SMC1602A的要求是在初始化时,应有三次设置模式的操作就是我给的程序里的
WriteCommandLCM(0x38, 0);            // Set display mode 3 times, no detect Busy
delay_ms(5);
WriteCommandLCM(0x38, 0);
delay_ms(5);
WriteCommandLCM(0x38, 0);
delay_ms(5);
这是Datasheet里明确要求的,你也可以注意一下你使用的1602,它的资料是怎么说的

另外你的write1602缺少读写检测,就是确保STA7=0的操作,这个也是按照SMC1602A的要求要有的,你可能需要看一下你的1602的相关要求

最后,在write1602里
P0 = Convert(a);
E = 1;
_nop_();
E = 0;

根据1602的要求,在写数据时E为高的时间应大于150ns,所以这里最好不要用_nop_();
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

8
 
我的程序是可以在液晶上显示的,问题就出在。
void main(void)
{  
  Initialize();//初始化液晶
  WriteChar(5,1,'A');//在第液晶第1行第6个位置会显示一个“A”
  Delay(500);//延时500ms   
  WriteChar(5,2,''B');//如果没有执行上面那条500ms延时的语句,在第液晶第2行第6个位置会显示一个“B”
  //如果执行了上面那条500ms延时的语句,在第液晶第2行第6个位置不会有任何反应,第1行第6个位置显示的“A”还是正常的,不会发生变化。
  //我试过,如果改为200ms的延时,是可以正常在第液晶第2行第6个位置会显示一个“B”的
  while(1);  
}
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

9
 
引用 6 楼 c_rabbit 的回复:
不知道你用的是什么型号的1602,SMC1602A的要求是在初始化时,应有三次设置模式的操作就是我给的程序里的
WriteCommandLCM(0x38, 0); // Set display mode 3 times, no detect Busy
delay_ms(5);
WriteCommandLCM(0x38, 0);
delay_ms(5);
WriteCommandLCM(0……

我用是的是1602A
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

10
 
这样吧,你可以试一下,
在   WriteChar(5,1,'A');//在第液晶第1行第6个位置会显示一个“A”
之前增加一个  Delay(500);//延时500ms   
来判断这个不正常的状况,是否有“WriteChar(5,1,'A'); ”
的影响因素
 
 
 

回复

60

帖子

0

TA的资源

一粒金砂(初级)

11
 
引用 9 楼 c_rabbit 的回复:
这样吧,你可以试一下,
在 WriteChar(5,1,'A');//在第液晶第1行第6个位置会显示一个“A”
之前增加一个 Delay(500);//延时500ms  
来判断这个不正常的状况,是否有“WriteChar(5,1,'A'); ”
的影响因素

有的,会有显示A的 。感觉就好像,执行过Delay(500)之后,程序就不往下执行了,或者说就写不进数据了。
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

12
 
啊,那大概就是看门狗了,你对看门狗设置了吗
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

13
 
引用 10 楼 armjourney 的回复:
引用 9 楼 c_rabbit 的回复:
这样吧,你可以试一下,
在 WriteChar(5,1,'A');//在第液晶第1行第6个位置会显示一个“A”
之前增加一个 Delay(500);//延时500ms
来判断这个不正常的状况,是否有“WriteChar(5,1,'A'); ”
的影响因素

有的,会有显示A的 。感觉就好像,执行过Delay(500)之后,程序就不往下执行了,……

我刚才搞错了!!是不会显示A的。感觉就好像,执行过Delay(500)之后,程序就不往下执行了,或者说就写不进数据了。
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

14
 
引用 11 楼 c_rabbit 的回复:
啊,那大概就是看门狗了,你对看门狗设置了吗

我刚才搞错了!!是不会显示A的。感觉就好像,执行过Delay(500)之后,程序就不往下执行了,或者说就写不进数据了。

我用的是STC89C52RC  ,我没有动过看门狗。
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

15
 
那么就是看门狗和初始化程序的问题两选一了
你用的单片机是自带看门狗程序么?
如果喂狗OK的话,那么把初始化1602的步骤里加上我刚才说的部分
 
 
 

回复

62

帖子

0

TA的资源

一粒金砂(初级)

16
 
你的编译器能够单步执行吗?如果能的话,在初始化程序那里设个断点,看程序会不会跳回去,调回去的话,就几乎可以肯定是看门狗了
如果不能单步执行的话,麻烦一点。你可以用闲置管脚驱动一个LED灯,让它亮个200ms然后熄灭,之后全速运行看灯的状态吧
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

17
 
我晕掉了,直接把看门狗关掉也是可以达到实验效果的,根本不需要什么灯
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

18
 
引用 16 楼 c_rabbit 的回复:
我晕掉了,直接把看门狗关掉也是可以达到实验效果的,根本不需要什么灯

我先试一下。
 
 
 

回复

88

帖子

0

TA的资源

一粒金砂(高级)

19
 
/********************************************************************
* 名称 : Delay_1ms()
* 功能 : 延时子程序,延时时间为 1ms * x
* 输入 : x (延时一毫秒的个数)
* 输出 : 无
***********************************************************************/
void Delay(uint i)
{
unsigned char x,j;
for(j=0;j for(x=0;x<=148;x++);  
}

问题就出在了这个延时程序,因为j 为uchar ,所以当i的值大于255时,j的值始终会小于i,
从而for(j=0;j
第一次发贴就得到大家的热心帮助,谢谢大家了。

特别要谢谢“C_Rabbit(总是装好人,最后就真变成了好人)”因为是他启发了我,虽然他也没能发现是这个问题。

 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

20
 
原来如此……
确实没注意到这里
刚刚看了STC89C52RC的datasheet,看门狗貌似默认是关闭的
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表