请高手看看我这程序哪里出错了 用ht1621b驱动的液晶屏

2020-01-15 19:26发布

本帖最后由 如果 于 2012-6-20 13:41 编辑

为什么时钟不会跑 求大神指点啊
  1. #include <stc11.h>
  2. #include <stdio.h>
  3. #include <intrins.h>
  4. #define BIAS 0X52             //1/3偏压,4背极
  5. #define RC256K 0X38           //系统时钟选择为片外RC振荡器
  6. #define WDTDIS1 0X0A           //禁止WDT溢出标志输出
  7. #define TIMERDIS 0X08           //时基输出禁止
  8. #define SYSEN 0X02              //打开系统时钟
  9. #define SYSDIS 0X00             //关闭系统时钟和偏压发生器
  10. #define LCDON 0X06            //打开LCD偏压发生器
  11. #define LCDOFF 0X04        //关闭LCD偏压发生器
  12. #define TONEON  0X12       //打开音频输出
  13. #define TONEOFF 0X10       //关闭音频输出  
  14. sbit CS=P2^0;
  15. sbit WRD=P2^2;
  16. sbit DATA=P2^3;
  17. sbit LED=P2^1;
  18. sbit speak=P1^4;

  19. #define uchar unsigned char
  20. #define uint unsigned int


  21. char tab[]={0x5f,0x06,0x6b,0x2f,0x36,0x3d,0x7d,0x07,0x7f,0x3f};  //显示0—9  
  22. char x,sec,min,hour,shi;
  23. uchar a[16];


  24. /***************************延时子函数******************************/
  25. void delay(uchar i)                   //j=12延时约4.3us
  26. {

  27.   while(i--)
  28.   {
  29.    uchar j=0;
  30.    while(j<8)
  31.    j++;
  32.   }
  33. }

  34. void delay_1s()
  35. {unsigned int i,j,k;
  36. for(i=100;i>0;i--)
  37.    for(j=20;j>0;j--)
  38.      for(k=248;k>0;k--);

  39. }


  40. void delay_ms(int x)                         //延时毫秒
  41. {
  42.         int i;
  43.         while(x--)
  44.         {
  45.                 for(i=0;i<100;i++);
  46.                
  47.         }
  48. }

  49. void SendBit_1621(uchar dat ,uchar cnt)
  50. {
  51. uchar i;
  52. for(i =0; i <cnt; i ++)
  53. {
  54.   if((dat&0x80)==0)
  55.   DATA=0;
  56.   else
  57.   DATA=1;
  58.   WRD=0;
  59.   delay(2);  
  60.   WRD=1;
  61.         dat=dat<<1;
  62. }
  63. }

  64. void SendDataBit_1621(uchar dat,uchar cnt)
  65. {
  66. uchar i;
  67. for(i =0; i <cnt; i ++)
  68. {
  69.   if((dat&0x01)==0) DATA=0;
  70.   else DATA=1;
  71.   WRD=0;
  72.   delay(2);
  73.   WRD=1;
  74.   dat=dat>>1;
  75. }
  76. }
  77. void SendCmd(uchar command)
  78. {
  79. CS=0;
  80. _nop_();
  81. _nop_();
  82. SendBit_1621(0x80,4);
  83. SendBit_1621(command,8);
  84. CS=1;
  85. }
  86. void Write_1621(uchar addr,uchar dat)
  87. {
  88. CS=0;
  89. _nop_();
  90. _nop_();
  91. SendBit_1621(0xa0,3);
  92. SendBit_1621(addr,6);
  93. SendDataBit_1621(dat,4);
  94. CS=1;
  95. }
  96. void WriteAll_1621(uchar addr,uchar *p,uchar cnt)
  97. {
  98. uchar i;
  99. CS=0;
  100. _nop_();
  101. _nop_();
  102. SendBit_1621(0xa0,3);
  103. SendBit_1621(addr,6);
  104. for(i =0; i <cnt; i ++,p++)
  105. {
  106.   SendDataBit_1621(*p,8);
  107. }
  108. CS=1;
  109. }


  110. /*******************************主函数******************************/
  111. main()                                    
  112. {
  113.        
  114. //a[0]=0x00;a[1]=0x00;a[2]=0x00;a[3]=0x00;a[4]=0x00;
  115. //a[5]=0x00;a[6]=0x00;a[7]=0x00;a[8]=0x00;
  116. //a[9]=0x5F;a[10]=0x5F;a[11]=0x5F;a[12]=0x5F;
  117. //a[13]=0x00;a[14]=0x00;a[15]=0x00;
  118.         speak=1;
  119.        
  120.         TMOD=0x01;
  121.         ET0=1;
  122.         EA=1;
  123.         TH0=(65535-10000)/256;
  124.         TL0=(65535-10000)%256;
  125.         TR0=1;

  126.         SendCmd(BIAS);
  127.         SendCmd(SYSEN);
  128.         SendCmd(LCDON);
  129.         // SendCmd(RC256K);
  130.         WriteAll_1621(0,a,16);
  131.         // SendCmd(LCDOFF);
  132.    while(1)
  133.         {

  134.                 /*speak=0;
  135.                                 delay_1s();
  136.                                 speak=1;
  137.                                 delay_1s();*/
  138.                 a[12]=tab[min%10];                                 //显示分个位
  139.                 delay_ms(2);

  140.                 a[11]=tab[min/10];                                 //显示分十位
  141.                 delay_ms(2);

  142.                 a[10]=tab[hour%10];                             //显示时个位
  143.                 delay_ms(2);

  144.                 a[9]=tab[(hour/10)|0x80];                         //显示时十位
  145.                 delay_ms(2);
  146.                
  147.         }
  148.        
  149.        
  150.        
  151. }

  152. void int0() interrupt 1
  153. {       
  154.         //uchar a[16];
  155.         TH0=(65535-10000)/256;
  156.         TL0=(65535-10000)%256;                   //定时10ms       
  157.         x++;
  158.         shi++;
  159.         if(shi>=50)
  160.         {
  161.                 shi=0;
  162.                 //a[11]=0x80;
  163.                 //a[10]=0x80;
  164.         }
  165.         if(x>=100)                                          //表示1S
  166.         {
  167.                 x=0;
  168.                 sec++;
  169.                 if(sec==60)                                  //到60秒,秒清零,分加一
  170.                 {
  171.                         sec=0;
  172.                         min++;
  173.                         if(min==60)                         //到60分,分清零,小时加一
  174.                         {
  175.                                 min=0;
  176.                                 hour++;
  177.                                 /*speak=0;
  178.                                 delay_1s();
  179.                                 speak=1;
  180.                                 delay_1s();*/
  181.                                 if(hour==24)         //到24时,时清零,也是所有清零
  182.                                 {
  183.                                         hour=0;
  184.                                 }
  185.                         }
  186.                 }
  187.         }
  188. }
复制代码程序调试不出来,没显示
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
12条回答
jinbangzhou
2020-01-16 08:00
#define FREQUENCY          36000000

#if FREQUENCY > 8000
#define SOFT_DELAY         10
#endif
//void Delay(uint16_t n);
/******************************************************************************
写入数据的位
每次写入数据 1 -- 8 位
数据在时钟上升沿写入
******************************************************************************/
void HT1621_Write_Nbit (uint8_t data,uint8_t nbit)
{
    uint8_t i;
       
        for (i=0;i<nbit;i++)
    {
       HT1621_WR_CLR();    // rising edge
           #ifdef SOFT_DELAY
           Delay(SOFT_DELAY);
           #endif
       if (data&0x80)      // if the bit is 1, write 1
       {
          HT1621_DATA_SET() ; // write 1
       }
       else
       {
          HT1621_DATA_CLR(); // write 0
       }
       data <<= 1;
           #ifdef SOFT_DELAY
           Delay(SOFT_DELAY);
           #endif
       HT1621_WR_SET();   // rising edge
           #ifdef SOFT_DELAY
           Delay(SOFT_DELAY);
           #endif
    }
}
/******************************************************************************
写入 31 个 RAM 中任意一个地址半个字节
******************************************************************************/
void HT1621_Write_4bit (uint8_t dadd,uint8_t dbyte)
{
    dadd <<= 2;
    HT1621_CS_SET();            // chip disable
        #ifdef SOFT_DELAY
        Delay(SOFT_DELAY);
        #endif
    HT1621_CS_CLR();            // chip select
        #ifdef SOFT_DELAY
        Delay(SOFT_DELAY);
        #endif
    HT1621_Write_Nbit (0xA0,3);    // command of write data
    HT1621_Write_Nbit (dadd,6);    // address of ram
    HT1621_Write_Nbit (dbyte,4);   // data of display

    HT1621_CS_SET();
        #ifdef SOFT_DELAY
        Delay(SOFT_DELAY);
        #endif
}
/******************************************************************************
写入数据的位
每次写入数据 1 -- 8 位
数据在时钟上升沿写入
******************************************************************************/
uint8_t HT1621_Read_4bit (void)
{
           
        uint8_t i;
   
        uint8_t data;
               
        data = 0;

        HT1621_WR_SET();   // rising edge
        #ifdef SOFT_DELAY
        Delay(SOFT_DELAY);
        #endif
    for (i = 0;i < 4;i++)
    {
       HT1621_RD_CLR();    // rising edge
           #ifdef SOFT_DELAY
           Delay(SOFT_DELAY);
           #endif
       if (HT1621_READ_DATA())      // if the bit is 1, write 1
       {
          data |= 1<<i; // write 1
       }
       #ifdef SOFT_DELAY
           Delay(SOFT_DELAY);
           #endif               
       HT1621_RD_SET();   // rising edge
           #ifdef SOFT_DELAY
           Delay(SOFT_DELAY);
           #endif
    }
        return data;
}
/*******************************************************************************
写入 32 个 RAM 中任意一个地址一个字节
*******************************************************************************/
void HT1621_Write_Byte_To_Ram (uint8_t dadd,uint8_t dbyte)
{
    dadd <<= 2;
    HT1621_CS_SET();            // chip disable
        HT1621_WR_SET();   // rising edge
        #ifdef SOFT_DELAY
        Delay(SOFT_DELAY);
        #endif
    HT1621_CS_CLR();            // chip select
        #ifdef SOFT_DELAY
        Delay(SOFT_DELAY);
        #endif
    HT1621_Write_Nbit (0xA0,3);    // command of write data
    HT1621_Write_Nbit (dadd,6);    // address of ram
    HT1621_Write_Nbit (dbyte,8);   // data of display

    HT1621_CS_SET();
        HT1621_WR_SET();   // rising edge
        #ifdef SOFT_DELAY
        Delay(SOFT_DELAY);
        #endif
}
/*******************************************************************************
写入全部 RAM 数据
*******************************************************************************/
void HT1621_Write_All_Data_to_Ram (uint8_t *dbyte)
{
    uint8_t i;       

    HT1621_CS_SET();            // chip disable
        HT1621_WR_SET();   // rising edge
        #ifdef SOFT_DELAY
        Delay(SOFT_DELAY);
        #endif
    HT1621_CS_CLR();            // chip select
        #ifdef SOFT_DELAY
        Delay(SOFT_DELAY);
        #endif
    HT1621_Write_Nbit (0xA0,3);    // command of write data
    HT1621_Write_Nbit (0,6);    // address of ram

        for (i = 0; i < 32;i++)
        {
        HT1621_Write_Nbit (dbyte[i],4);   // data of display
        }
    HT1621_CS_SET();
        HT1621_WR_SET();   // rising edge
        #ifdef SOFT_DELAY
        Delay(SOFT_DELAY);
        #endif
}
/*******************************************************************************
写入全部 RAM 数据
*******************************************************************************/
void HT1621_Write_All_Data_to_Ram_Not_Continuous (uint8_t *dbyte,uint8_t index)
{   
    HT1621_CS_SET();            // chip disable
        HT1621_WR_SET();   // rising edge
        #ifdef SOFT_DELAY
        Delay(SOFT_DELAY);
        #endif
    HT1621_CS_CLR();            // chip select
        #ifdef SOFT_DELAY
        Delay(SOFT_DELAY);
        #endif

        if (index == 0)
        {
        HT1621_Write_Nbit (0xA0,3);    // command of write data
        HT1621_Write_Nbit (0,6);    // address of ram
        }
        HT1621_Write_Nbit (dbyte[index],4);   // data of display
       
    HT1621_CS_SET();
        HT1621_WR_SET();   // rising edge
        #ifdef SOFT_DELAY
        Delay(SOFT_DELAY);
        #endif
}
/*******************************************************************************
写入命令
*******************************************************************************/
void HT1621_Write_Command (uint8_t dcommand)
{
    HT1621_CS_SET();
        #ifdef SOFT_DELAY
        Delay(SOFT_DELAY);
        #endif
    HT1621_CS_CLR();
        #ifdef SOFT_DELAY
        Delay(SOFT_DELAY);
        #endif
    HT1621_Write_Nbit (0x80,4);
    HT1621_Write_Nbit (dcommand,8);

        HT1621_CS_SET();
        #ifdef SOFT_DELAY
        Delay(SOFT_DELAY);
        #endif
}
/*******************************************************************************
初始化
*******************************************************************************/
void HT1621_Init (void)
{
    HT1621_Write_Command(HT1621_LCD_OFF);

        HT1621_Write_Command(HT1621_RC256K);       
        HT1621_Write_Command(HT1621_TONE_OFF);
        // 设置蜂鸣器频率
        HT1621_Write_Command(HT1621_TONE_4K);
       
        HT1621_Write_Command(HT1621_TONE_ON);
        // 关闭蜂鸣器输出
        HT1621_Write_Command(HT1621_BIAS_DUTY);        //
        HT1621_Write_Command(HT1621_SYS_EN);       
        HT1621_Write_Command(HT1621_LCD_ON);               
}

一周热门 更多>