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

ht1621怎么弄也不亮

[复制链接]

出0入0汤圆

跳转到指定楼层
1
发表于 2011-1-7 15:31:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
不知道哪出了问题,总之就是一直不亮;希望老沙给看看啊
mcu用的是stm32,,液晶找厂家定制的;
wr\rd\data\cs全部接上拉电阻:10K
vlcd的偏压电阻是:20k
程序写在下面

出0入0汤圆

2
 楼主| 发表于 2011-1-7 15:39:25 | 只看该作者
编译环境:IAR for arm 5.2
程序如下:

#define SYSDIS   0x00
#define SYSEN    0x02
#define LCDOFF   0x04
#define LCDON    0x06
#define RC256K   0x30
#define BIAS3    0x52
#define CMD_ID   0x04
#define DATA_ID  0x05
#define LCDCLR   0x00

/********定义管脚为高电平或低电平,reset=0,set=1*/
#define CS_LOW    {GPIO_ResetBits(GPIOA, GPIO_Pin_4);} /*清除指定的端口位0*/
#define CS_HIGH   {GPIO_SetBits  (GPIOA, GPIO_Pin_4);}/*设置数据端口位1*/
#define RD_LOW    {GPIO_ResetBits(GPIOA, GPIO_Pin_6);}
#define RD_HIGH   {GPIO_SetBits  (GPIOA, GPIO_Pin_6);}
#define WR_LOW    {GPIO_ResetBits(GPIOA, GPIO_Pin_5);}
#define WR_HIGH   {GPIO_SetBits  (GPIOA, GPIO_Pin_5);}
#define DATA_LOW  {GPIO_ResetBits(GPIOA, GPIO_Pin_7);}
#define DATA_HIGH {GPIO_SetBits  (GPIOA, GPIO_Pin_7);}

const u8 HT1621_Data[15]={0x7D,0x05,0x3E,0x7B,0x63,0x5C,0x5F,0x70,
                                     0x7F,0x7C,0x4E,0x4B,0x0E,0x17,0x1F};
const u8 HT1621_Addr[12]={0x14,0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,
                                     0x1C,0x1D,0x1E,0x1F};
/*若显示小数点,则需要
/********定义符号显示地址、数字******************/
#define  LCD_COM0    0x08
#define  LCD_COM1    0x04
#define  LCD_COM2    0x02
#define  LCD_COM3    0x00

/**********************************

      写id 命令(100、101)
**********************************/
void HT1621_WriteId (u8 id)
{
  u8 c;                /*循环计数 */
  u8 shield=0x04;      /*0000 0100,数据屏蔽shield  */

  CS_LOW                         /*cs=0*/
  for(c=0;c<3;c++)
  {
    if((shield & id)==0)
    DATA_LOW
    else
    DATA_HIGH

    shield = shield>>1;
    WR_LOW
    LCD128_Delay();
    WR_HIGH
    LCD128_Delay();
   }
   CS_HIGH
}

/************************************************

写八位命令包括LCDon\off,SYSon\off、偏压等等8位CMD

*************************************************/
void HT1621_WriteCmd(u8 cmd)
{
  u8 c;                     /*循环计数*/
  u8 shield=0x80;           /*1000 0000,数据屏蔽shield   */

  CS_LOW
  for(c=0;c<8;c++)
  {
    if((shield & cmd)==0)
    DATA_LOW
    else                           
    DATA_HIGH

    shield = shield>>1;
    WR_LOW
    LCD128_Delay();
    WR_HIGH
    LCD128_Delay();
  }
  CS_HIGH
}

/*********************************************

     写6位地址A5-A0,低六位有效,seg口

*********************************************/
void HT1621_WriteAddr(u8 addr)
{
  u8 c;                     /*循环计数   */
  u8 shield=0x20;           /*0010 0000,从第三位开始读  */

  CS_LOW;
  for(c=0;c<6;c++)
  {
    if((shield & addr)==0)
    DATA_LOW
    else
    DATA_HIGH

    shield = shield>>1;      /*从高位A5开始依次向下写到A0*/
    WR_LOW
    LCD128_Delay();
    WR_HIGH
    LCD128_Delay();
  }
  CS_HIGH
}

/***************************************************

写4位数据,直接写进ram需要D0-D3,低4位有效

***************************************************/
void HT1621_WriteData(u8 data)
{
  u8 c;                  /*循环计数 */
  u8 shield=0x08;        /*0000 1000,数据屏蔽shield  */

  CS_LOW
  for(c=0;c<4;c++)
  {
    if((shield & data)==0)
    DATA_LOW
    else
    DATA_HIGH

    shield >>= 1;
    WR_LOW
    LCD128_Delay();
    WR_HIGH
    LCD128_Delay();
  }
  CS_HIGH
}

/*******************************************

       初始化LCD

*******************************************/
void HT1621_Init(void)
{
  //GPIO_InitTypeDef GPIO_InitStructure;
  //GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_4;
  //GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
  //GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; /*推免模式*/
  //GPIO_Init(GPIOA, &GPIO_InitStructure);

  CS_LOW
  HT1621_WriteId (CMD_ID);
  HT1621_WriteCmd(BIAS3);               /*1/3bias,4comm */
  HT1621_WriteCmd(SYSEN);                  /*SysOn*/
  HT1621_WriteCmd(LCDON);                  /*LcdOn*/
  HT1621_WriteCmd(RC256K);                 /*Rc256*/
  CS_HIGH
}

/*************************************************

   显示一位数字

*************************************************/
void HT1621_WriteNum(u8 addr,u8 data)
{
u8 data_h;
u8 data_l;
//addr=HT1621_Addr[addr];
//if(addr!=3)
//data=HT1621_Data[data];
//else
//data=HT1621_Data[data]|0x80;

data_h=data>>4;
data_l=data&0x0F;

HT1621_WriteId(DATA_ID);       /*送101数据命令*/
HT1621_WriteAddr(addr);        /*写地址*/
HT1621_WriteData(data_h);      /*写数据*/

HT1621_WriteId(DATA_ID);
HT1621_WriteAddr(addr-1);      /*地址减1,旁边的seg口*/
HT1621_WriteData(data_l);
}

出0入0汤圆

3
 楼主| 发表于 2011-1-7 15:39:59 | 只看该作者
希望大家给看看啊,我这天天弄,弄不出来啊

出0入0汤圆

4
发表于 2011-1-24 15:44:30 | 只看该作者
lz共同研究,坛子里有人搞出来了!

出0入0汤圆

5
发表于 2011-1-24 15:46:40 | 只看该作者
感觉你第一段代码好象有问题,你再仔细看看!

出0入0汤圆

6
发表于 2011-1-24 17:25:23 | 只看该作者
给你一段MSP430的驱动作为参考一下,希望能有帮助

  cs-----p6.6
 wr-----p6.4
 dat----p6.3
 mcu----msp430f149
/***********写字节****************************/
void write_byte(uchar k,uchar n)
{
  uchar i,j;
  for(i=0;i<n;i++)
  {
   if(k&0x80)
     P6OUT|=0x08;  //p6.3=1
   else
     P6OUT&=0xf7;  //p6.3=0
   dely(1);
   P6OUT|=0x10;    //wr=1
   j=0;
   k=k<<1;
   j=0;
   P6OUT&=0xef;    //wr=0
  }
}
void write_byte1(uchar k,uchar n)
{
  uchar i;
  for(i=0;i<n;i++)
  {
  if(k&0x01)
    P6OUT|=0x08;   //6.3=1
  else
    P6OUT&=0xf7;   //6.3=0
  dely(1);
  P6OUT|=0x10;     //wr=1
  dely(1);
  k=k>>1;
  dely(1);
  P6OUT&=0xef;     //wr=0
  }
}
/********写命令**********************************/
void write_com(uchar com)
{
  P6OUT&=0xbf;          //cs=0
  dely(1);
  write_byte(0x80,3);   //写100
  write_byte(com,8);
  P6OUT|=0x10;          //wr=1
  dely(1);
  P6OUT&=0xef;          //wr=0
  dely(1);
  P6OUT|=0x40;          //cs=1
}
/********写数据*********************************/
void write_dat(uchar add,uchar mdata)
{
P6OUT&=0xbf;            //cs=0
dely(1);
add=add<<2;
write_byte(0xa0,3);     //写101
write_byte(add,6);
write_byte1(mdata,4);
dely(1);
P6OUT|=0x40;            //cs=1
}
/*******清屏************************************/
void display_clr(viod)
{
  uchar i;
  for(i=0;i<32;i++)
  {
    write_dat(i,0);
  }
}
/******初始化液晶*******************************/
void int1621(void)
{
  P6OUT|=0x40;    //cs=1
  dely(1);
  P6OUT&=0xef;    //wr=0
  dely(1);
  P6OUT|=0x08;    //dat=1
  dely(1);
  write_com(0x29);
  write_com(0x18);
  write_com(0x06);
  write_com(0x04);
  write_com(0x01);
  write_com(0x03);
  display_clr();
}
/*******显示************************************/
void display(uchar add,uint dat)
{
  add=add*4+1;       //显示地址
  intxin.x=dat;
  write_dat(add,intxin.c[0]>>4);
  write_dat(add+1,intxin.c[0]);
  write_dat(add+2,intxin.c[1]>>4);
  write_dat(add+3,intxin.c[1]);
}


      display(1,display_buffer1[0]);       //显示位置,显示段码
      display(2,display_buffer1[1]);
      display(3,display_buffer1[2]);
      display(4,display_buffer1[3]);

出0入0汤圆

7
发表于 2011-1-25 11:56:06 | 只看该作者
不好意思,我错了。你我代码差不多!也是不点屏!请版主提醒下啊!

出0入0汤圆

8
发表于 2011-3-20 18:14:32 | 只看该作者
for(c=0;c<3;c++)
把3改为4试试

出0入0汤圆

9
发表于 2011-4-10 16:10:48 | 只看该作者
Ht有51的标准代码发布 初始化和时序出错就没戏

出0入0汤圆

10
发表于 2011-4-10 17:56:01 | 只看该作者
我这里有个AVR汇编的头文件,贴出来看看能不能帮帮你.

.EQU         BIAS                 =$52 ;1/3 偏压4 背极
.EQU         RC256                 =$30 ;系统时钟选用片内RC 振荡器
.EQU         SYSEN                 =$02 ;打开系统时钟
.EQU         LCDON                 =$06 ;打开偏压发生器
.EQU         SYSDIS                 =$00 ;关闭系统时钟和偏压发生器
.EQU         X32K                 =$28 ;系统时钟选择为片外晶振
.EQU         ToneOn                 =$12 ;打开音频输出
.EQU         ToneOff         =$10 ;关闭音频输出
.EQU         Tone4k                 =$80 ;音频输出频率为4K
.EQU         Tone2k                 =$C0 ;音频输出频率为2K
.EQU         TIMEREN         =$0C ;时基输出使能
.EQU         TIMERDIS         =$08 ;时基输出禁能
.EQU         CLRtime         =$18 ;清零进基发生器
.EQU         WDTEN                 =$0E ;使能WDT 溢出标志输出
.EQU         WDTDIS                 =$0A ;禁止WDT 溢出标志输出
.EQU         CLRWDT                 =$1C ;清零WDT
.EQU         IRQEN                 =$10 ;使能IRQ 输出
.EQU         IRQDIS                 =$00 ;禁止IRQ 输出
.EQU         FR1                 =$40 ;设置时基输出1HZ WDT 溢出时间4s

.equ        lcdport                =portb
.equ        lcdsda                =0
.equ        lcdsck                =1
.equ        lcdcs                =2

.dseg

l1disbuf:                .byte        16        ;第一行显存
l2disbuf:                .byte        16        ;第二行显存
l3disbuf:                .byte        16        ;第三行显存
l4disbuf:                .byte        16        ;第四行显存
l5disbuf:                .byte        16        ;第五行显存


.cseg

ht1621init:        ;HT1621初始化
        ldi        r16,                lcdon
        rcall        ht1621wrcom       
        ldi        r16,                sysen
        rcall        ht1621wrcom
        ldi        r16,                bias       
        rcall        ht1621wrcom
       
        ret

lcdwr1000:        ;写命令数据头为101
        sbi        lcdport,        lcdsda
        cbi        lcdport,        lcdsck
        sbi        lcdport,        lcdsck
       
        cbi        lcdport,        lcdsda
        cbi        lcdport,        lcdsck
        sbi        lcdport,        lcdsck
       
        cbi        lcdport,        lcdsck
        sbi        lcdport,        lcdsck
       
        cbi        lcdport,        lcdsck
        sbi        lcdport,        lcdsck
       
        ret

lcdwr101:        ;写数据数据头为101
        sbi        lcdport,        lcdsda
        cbi        lcdport,        lcdsck
        sbi        lcdport,        lcdsck

        cbi        lcdport,        lcdsda
        cbi        lcdport,        lcdsck
        sbi        lcdport,        lcdsck

        sbi        lcdport,        lcdsda
        cbi        lcdport,        lcdsck
        sbi        lcdport,        lcdsck

        ret

lcdwr000000:        ;向HT1621写入RAM地址为6位数,从0开始
        cbi        lcdport,        lcdsda
        push        r17
        ldi        r17,                6
lcdwr60:
        cbi        lcdport,        lcdsck
        sbi        lcdport,        lcdsck
        dec        r17
        brne        lcdwr60
        pop        r17

        ret

ht1621wrcom:        ;向HT1621写入一个命令字节
        cbi        lcdport,        lcdcs

        rcall        lcdwr1000

        rcall        ht1621wrbyte

        sbi        lcdport,        lcdcs
        sbi        lcdport,        lcdsda

        ret

ht1621dis:        ;向HT1621写入16个字节,即显示16个数字
        cbi        lcdport,        lcdcs
       
        rcall        lcdwr101

        rcall        lcdwr000000

        push        r18
        ldi        r18,                15
        ldi        xh,                high(l1disbuf)
        ldi        xl,                low(l1disbuf)
       
ht1621wrda010:
        ldi        zh,                high(numtab*2)
        ldi        zl,                low(numtab*2)
       
        ld        r16,                x+
        clr        r17
        add        zl,                r16
        adc        zh,                r17
        lpm        r16,                z
        rcall        ht1621wrbyte
        dec        r18
        brne        ht1621wrda010
        sbi        lcdport,        lcdcs
        pop        r18
       
        ret

disbufinit:        ;显示缓存初始化
        ldi        xh,                high(l1disbuf)
        ldi        xl,                low(l1disbuf)
        push        r17
        ldi        r17,                16
        ldi        r16,                $00
disbufinit010:
        st        x+,                r16
        inc        r16
        dec        r17
        brne        disbufinit010
        pop        r17
       
        ret

disbufclr:        ;清零显示缓存
        ldi        xh,                high(l1disbuf)
        ldi        xl,                low(l1disbuf)
        push        r17
        ldi        r17,                4
        ldi        r16,                16        ;16=空格即不显示
disbufclr010:
        st        x+,                r16
        st        x+,                r16
        st        x+,                r16
        st        x+,                r16
        dec        r17
        brne        disbufclr010
        pop        r17

        ret

ht1621wrbyte:        ;向HT1621写入一个字节
        push        r17
        ldi        r17,                8
ht1621wrbyte000:
        rol        r16
        brcc        ht1621wrbyte010
        sbi        lcdport,        lcdsda
        rjmp        ht1621wrbyte020
ht1621wrbyte010:
        cbi        lcdport,        lcdsda
ht1621wrbyte020:
        cbi        lcdport,        lcdsck
        sbi        lcdport,        lcdsck
        dec        r17
        brne        ht1621wrbyte000
        pop        r17

        ret

/*
$01对应卡尔,年,月,日,2个冒号,星期
$02对应NUM1-15的C显示
$04对应NUM1-15的G显示
$08对应NUM1-15的B显示
$10对应NUM1-15的D显示
$20对应NUM1-15的E显示
$40对应NUM1-15的F显示
$80对应NUM1-15的A显示
第一行NUM1-15与第2-5行NUM1-8的显示码表格
第2-5行NUM9-15显示码要高低半字节交换*/
numtab:
.db $fb,$0b,$bd,$9f,$4f,$d7,$f7,$8b,$ff,$df,$ef,$77,$35,$3f,$f5,$e5,$00

出0入0汤圆

11
发表于 2011-4-10 19:42:13 | 只看该作者
延时时间足够了没?

出0入0汤圆

12
发表于 2011-9-26 21:38:00 | 只看该作者
给个 KeilC51 使用过的
用过的例子ourdev_679896O39W14.rar(文件大小:5K) (原文件名:Ht1620驱动of KeilC51.rar)

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-4-20 13:52

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

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