搜索
bottom↓
回复: 11

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

[复制链接]

出0入8汤圆

发表于 2012-6-20 11:20:22 | 显示全部楼层 |阅读模式
本帖最后由 如果 于 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. }
复制代码
程序调试不出来,没显示

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

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

出0入8汤圆

 楼主| 发表于 2012-6-20 13:41:54 | 显示全部楼层
怎么没人啊

出0入0汤圆

发表于 2012-6-20 13:49:26 | 显示全部楼层
很想帮你
可惜看不懂C。。。。。。。。。。

出0入0汤圆

发表于 2012-6-20 13:51:10 | 显示全部楼层
#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);               
}

出0入0汤圆

发表于 2012-6-20 13:51:43 | 显示全部楼层
这个是我之前写的程序,你仔细对比一下和你程序的区别吧

出0入0汤圆

发表于 2012-6-20 13:52:12 | 显示全部楼层
#ifndef _HT1621_H_
#define _HT1621_H_


/* PORT CONFIG */
#define  HT1621_DDR           

#define  HT1621_CS_SET()                        (GPIOC->ODR |= GPIO_Pin_9)
#define  HT1621_CS_CLR()                  (GPIOC->ODR &= (~GPIO_Pin_9))
#define  HT1621_WR_SET()                       (GPIOC->ODR |= GPIO_Pin_7)
#define  HT1621_WR_CLR()                          (GPIOC->ODR &= (~GPIO_Pin_7))
#define  HT1621_RD_SET()                       (GPIOC->ODR |= GPIO_Pin_8)
#define  HT1621_RD_CLR()                      (GPIOC->ODR &= (~GPIO_Pin_8))
#define  HT1621_DATA_SET()                     (GPIOC->ODR |= GPIO_Pin_6)
#define  HT1621_DATA_CLR()                          (GPIOC->ODR &= ~GPIO_Pin_6)
#define  HT1621_READ_DATA()                         ((GPIOC->IDR&GPIO_Pin_6))

   
/* LCD COMMAND */
#define HT1621_LCD_ON          0x06
#define HT1621_LCD_OFF         0x04
#define HT1621_TIMER_DIS       0x08
#define HT1621_WDT_DIS         0x0a
#define HT1621_SYS_EN          0x02
#define HT1621_TONE_OFF        0x10
#define HT1621_TONE_ON         0x12

#define HT1621_TONE_4K         0x40
#define HT1621_TONE_2K         0x60

#define HT1621_RC256K          0x30
#define HT1621_BIAS_DUTY       0x52
#define HT1621_IRQ_DIS         0x00


/* LCD */
#define LCD_ON                 1
#define LCD_OFF                0


typedef struct
{
  uint8_t buff[32];
} HT1621_TypeDef;

//extern HT1621_TypeDef HT1621;

void HT1621_Write_Nbit (uint8_t data,uint8_t nbit);
void HT1621_Write_4bit (uint8_t dadd,uint8_t dbyte);
uint8_t HT1621_Read_4bit (void);


void HT1621_Write_Byte_To_Ram (uint8_t dadd,uint8_t dbyte);
void HT1621_Write_All_Data_to_Ram (uint8_t *dbyte);
void HT1621_Write_Command (uint8_t dcommand);
void HT1621_Init (void);
void HT1621_Write_All_Data_to_Ram_Not_Continuous (uint8_t *dbyte,uint8_t index);



#endif

出0入0汤圆

发表于 2012-6-20 13:52:38 | 显示全部楼层
这个是头文件,你自己的程序只要改头文件就好了

出0入0汤圆

发表于 2012-6-20 14:30:32 | 显示全部楼层
怎么没见while(1)里面写1621的ram?

出0入8汤圆

 楼主| 发表于 2012-6-20 15:03:25 | 显示全部楼层
seti 发表于 2012-6-20 14:30
怎么没见while(1)里面写1621的ram?

原来是这样,谢谢了  可以了

出0入8汤圆

 楼主| 发表于 2012-6-20 15:04:18 | 显示全部楼层
jinbangzhou 发表于 2012-6-20 13:51
#define FREQUENCY          36000000

#if FREQUENCY > 8000

谢谢  加深理解一下

出0入0汤圆

发表于 2012-6-21 17:27:15 | 显示全部楼层
seti 发表于 2012-6-20 14:30
怎么没见while(1)里面写1621的ram?

while(1)的程序只需调用初始化部分,还有一个写数据部分

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-6-8 19:33

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

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