搜索
bottom↓
回复: 12
打印 上一主题 下一主题

请问HT1621的晶振该如何起振?

[复制链接]

出0入12汤圆

跳转到指定楼层
1
发表于 2011-4-21 15:23:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请问HT1621的晶振该如何起振?
我的HT1621初始化程序如下:
void lcd_init(void)
{
   CS_HIGH;
   WR_HIGH;
   DATA_HIGH;
   for(unsigned long i=0;i<1000;i++)
   {
   asm("nop");
   }
   SendCmd(BIAS); //1/2bias,4comm
   SendCmd(SYSEN); //启动内部振荡器
   SendCmd(XTAL);
   SendCmd(LCDON); //打开显示
}
按照datasheet中的说明,应该设置了SendCmd(XTAL);就可以起振的吧,可是结果却是32K的晶振脚却是一个高电平,请高手指导?

出0入96汤圆

2
发表于 2011-4-21 15:29:27 | 只看该作者
#define  ComMode    0x52  //4COM,1/3bias  1000    0101 0010
#define  RCosc      0x30  //内部RC振荡器(上电默认)1000 0011 0000
#define  CRosc      0x28  //外部32768振荡器       1000 0010 1000
#define  LCD_on     0x06  //打开LCD 偏压发生器1000     0000 0 11 0
#define  LCD_off    0x04  //关闭LCD显示
#define  Sys_en     0x02  //系统振荡器开   1000   0000 0010
#define  WDT_en     0x02  //看门狗输出有效 1000   0000 1110
#define  TMR_en     0x0C  //时基输出有效   1000   0000 1100
#define  TMR_clr    0x18  //时基输出清零   1000   0001 1000

// 9位命令字
#define  IRQen      0x10  //外部时基打开  1001    0001 0000
#define  WDT1hz     0x40  //外部时基打开  1001    0100 0000

/****************************************************************************
                          Name: Init_1621(初始化1621)
*****************************************************************************/
void Init_1621(void)
{   
SendCmd_1621(ComMode);  
SendCmd_1621(CRosc);


SendCmd_1621(TMR_clr);  
SendCmd_1621(TMR_en); //没增加高位的命令80的
   
SendCmd_1621(TMR_clr);

SendCmd1_1621(WDT1hz);//增加了高位的命令90的
SendCmd1_1621(IRQen);

SendCmd_1621(Sys_en);
SendCmd_1621(LCD_on);
}

出0入96汤圆

3
发表于 2011-4-21 15:30:36 | 只看该作者
#define  ComMode    0x52  //4COM,1/3bias  1000    0101 0010
#define  RCosc      0x30  //内部RC振荡器(上电默认)1000 0011 0000
#define  CRosc      0x28  //外部32768振荡器       1000 0010 1000
#define  LCD_on     0x06  //打开LCD 偏压发生器1000     0000 0 11 0
#define  LCD_off    0x04  //关闭LCD显示
#define  Sys_en     0x02  //系统振荡器开   1000   0000 0010
#define  WDT_en     0x02  //看门狗输出有效 1000   0000 1110
#define  TMR_en     0x0C  //时基输出有效   1000   0000 1100
#define  TMR_clr    0x18  //时基输出清零   1000   0001 1000

// 9位命令字
#define  IRQen      0x10  //外部时基打开  1001    0001 0000
#define  WDT1hz     0x40  //外部时基打开  1001    0100 0000

/****************************************************************************
                          Name: Init_1621(初始化1621)
*****************************************************************************/
void Init_1621(void)
{   
SendCmd_1621(ComMode);  
SendCmd_1621(CRosc);


SendCmd_1621(TMR_clr);  
SendCmd_1621(TMR_en); //没增加高位的命令80的
   
SendCmd_1621(TMR_clr);

SendCmd1_1621(WDT1hz);//增加了高位的命令90的
SendCmd1_1621(IRQen);

SendCmd_1621(Sys_en);
SendCmd_1621(LCD_on);
}

出0入12汤圆

4
 楼主| 发表于 2011-4-21 15:59:11 | 只看该作者
请问晶振的起振跟时基输出、看门狗输出有关系吗?我照着你的程序改后结果是一样的,晶振依然没有起振

出0入12汤圆

5
 楼主| 发表于 2011-4-22 09:27:57 | 只看该作者
我卸下32K晶振用内部振荡器还是没有输出,所有的驱动端口都为高电平,请白沙以及高手指导呀,驱动程序如下所示:
#define BIAS   0x52   //4COM,1/2bias  1000    0101 0010  
#define RCosc  0x30   //内部RC振荡器(上电默认)1000 0011 0000  
#define SYSEN  0x02   //系统振荡器开   1000   0000 0010  
#define WDTen  0x02   //看门狗输出有效 1000   0000 1110  
#define TMRen  0x0C   //时基输出有效   1000   0000 1100
#define TMRclr 0x18   //时基输出清零   1000   0001 1000
#define LCDOFF 0x04   //关闭LCD显示  
#define LCDON  0x06   //打开LCD 偏压发生器1000     0000 0 11 0  
#define XTAL   0x28   //外部32768振荡器       1000 0010 1000  
#define IRQen  0x10   //外部时基打开  1001    0001 0000  
#define WDT1hz 0x40   //外部时基打开  1001    0100 0000

#define CS_LOW    GPIOPinWrite(GPIO_PORTC_BASE,GPIO_PIN_4,0x00)
#define CS_HIGH   GPIOPinWrite(GPIO_PORTC_BASE,GPIO_PIN_4,0xFF)
#define RD_LOW    GPIOPinWrite(GPIO_PORTC_BASE,GPIO_PIN_5,0x00)
#define RD_HIGH   GPIOPinWrite(GPIO_PORTC_BASE,GPIO_PIN_5,0xFF)
#define WR_LOW    GPIOPinWrite(GPIO_PORTC_BASE,GPIO_PIN_6,0x00)
#define WR_HIGH   GPIOPinWrite(GPIO_PORTC_BASE,GPIO_PIN_6,0xFF)
#define DATA_LOW  GPIOPinWrite(GPIO_PORTC_BASE,GPIO_PIN_7,0x00)
#define DATA_HIGH GPIOPinWrite(GPIO_PORTC_BASE,GPIO_PIN_7,0xFF)

void init_LCD_IO()
{
  
  GPIOPinTypeGPIOOutput(GPIO_PORTC_BASE,GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7);

  GPIOPadConfigSet(GPIO_PORTC_BASE, GPIO_PIN_4, GPIO_STRENGTH_8MA, GPIO_PIN_TYPE_STD_WPU);
  GPIOPadConfigSet(GPIO_PORTC_BASE, GPIO_PIN_5, GPIO_STRENGTH_8MA, GPIO_PIN_TYPE_STD_WPU);
  GPIOPadConfigSet(GPIO_PORTC_BASE, GPIO_PIN_6, GPIO_STRENGTH_8MA, GPIO_PIN_TYPE_STD_WPU);
  GPIOPadConfigSet(GPIO_PORTC_BASE, GPIO_PIN_7, GPIO_STRENGTH_8MA, GPIO_PIN_TYPE_STD_WPU);
}

void lcd_init(void)
{
   SendCmd(BIAS); //1/2bias,4comm
   SendCmd(RCosc);
   
   SendCmd(TMRclr);
   SendCmd(TMRen);
   
   SendCmd(TMRclr);
   SendCmd1(WDT1hz);
   SendCmd1(IRQen);
      
   SendCmd(SYSEN); //启动内部振荡器
   SendCmd(LCDON); //打开显示
   
}

void SendBit_1621(unsigned char data,unsigned char cnt) //data 的高cnt 位写入HT1621,高位在前
{
unsigned char i;
for(i =0; i <cnt; i ++)
{
if((data&0x80)==0) DATA_LOW;
else DATA_HIGH;
WR_LOW;
for(unsigned long i=0;i<500;i++)
   {
   asm("nop");
   }
WR_HIGH;
for(unsigned long i=0;i<500;i++)
   {
   asm("nop");
   }
data<<=1;
}
}

void SendDataBit_1621(unsigned char data,unsigned char cnt) //data 的低cnt 位写入HT1621,低位在前
{
unsigned char i;
for(i =0; i <cnt; i ++)
{
if((data&0x01)==0) DATA_LOW;
else WR_HIGH;
WR_LOW;
for(unsigned long i=0;i<500;i++)
   {
   asm("nop");
   }
WR_HIGH;
for(unsigned long i=0;i<500;i++)
   {
   asm("nop");
   }
data>>=1;
}
}

void SendCmd(unsigned char command)
{
CS_LOW;
SendBit_1621(0x80,4); //写入标志码"100"
SendBit_1621(command,8); //写入8 位数据,其中前8 位为command 命令
CS_HIGH;
}

void SendCmd1(unsigned char command)
{
CS_LOW;
SendBit_1621(0x90,4); //写入标志码"100"
SendBit_1621(command,8); //写入8 位数据,其中前8 位为command 命令
CS_HIGH;
}

void Write_1621(unsigned char addr,unsigned char data)
{
CS_LOW;
SendBit_1621(0xa0,3); //写入标志码"101"
SendBit_1621(addr<<2,6); //写入6 位addr
SendDataBit_1621(data,4); //写入data 的低4 位
CS_HIGH;
}

void WriteAll_1621(unsigned char addr,unsigned char *p,unsigned char cnt)
{
unsigned char i;
CS_LOW;
SendBit_1621(0xa0,3); //写入标志码"101"
SendBit_1621(addr<<2,6); //写入6 位addr
for(i =0; i <cnt; i ++,p++) //连续写入数据
{
SendDataBit_1621(*p,8);
}
CS_HIGH;
}

出0入96汤圆

6
发表于 2011-4-22 12:25:26 | 只看该作者
你的晶振是好的么?
加电容了么?

出0入12汤圆

7
 楼主| 发表于 2011-4-22 13:24:13 | 只看该作者
是好的啊,也加电容了,不用晶振用内部振荡器就好用,但是一用晶振就不好使,换了几个晶振都是这样,不知道是什么原因?

出0入96汤圆

8
发表于 2011-4-22 13:30:25 | 只看该作者
去掉电容试试

出0入12汤圆

9
 楼主| 发表于 2011-4-22 13:41:06 | 只看该作者
去掉电容一样的效果,配成内部振荡器就对,配成外接晶振就不对,很奇怪,不知道有没有用晶振成功的案例啊

出0入12汤圆

10
 楼主| 发表于 2011-4-22 13:50:21 | 只看该作者
初始化函数改成如下就能得到正确的输出
void lcd_init(void)
{  
   SendCmd(BIAS); //1/2bias,4comm
   SendCmd(RCosc);
      
   SendCmd(SYSEN); //启动内部振荡器
   SendCmd(LCDON); //打开显示
}
而改成如下输出就不对
void lcd_init(void)
{  
   SendCmd(BIAS); //1/2bias,4comm
   SendCmd(XTAL);
      
   SendCmd(SYSEN); //启动内部振荡器
   SendCmd(LCDON); //打开显示
}

出0入96汤圆

11
发表于 2011-4-22 13:54:11 | 只看该作者
我的就成功了呀!

出0入12汤圆

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

本版积分规则

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

GMT+8, 2024-4-19 10:53

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

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