sunshulin 发表于 2011-12-9 17:51:39

段码液晶屏驱动程序 HT1622 (HMS17AN)

效果图如下:
http://cache.amobbs.com/bbs_upload782111/files_48/ourdev_703131E8406F.jpg
全部显示效果 遗憾的是没有小数点 (原文件名:DSC_1779.jpg)

http://cache.amobbs.com/bbs_upload782111/files_48/ourdev_703132EMMHEM.jpg
显示数字 (原文件名:DSC_1792.jpg)

http://cache.amobbs.com/bbs_upload782111/files_48/ourdev_703133IACB9Y.jpg
背面 (原文件名:DSC_1794.jpg)

http://cache.amobbs.com/bbs_upload782111/files_48/ourdev_703134BZEUJH.jpg
HT1622 (原文件名:DSC_1796.jpg)
程序如下:
/*****************************************************************
HMS17AN段码液晶屏测试程序 Drive HT1622 CPUMSP430G2454 @ 1MHz
         第十六位            第三十位
液晶屏内容:8    8888888888888    8       第二排
            8    8888888888888    8       第一排
         第一位               第十五位
*****************************************************************/
#include "msp430g2452.h"

#define SET 1
#define RESET 0

#define _ADD_STR(a, b)            a##b
#define ADD_STR(a, b)               _ADD_STR(a, b)

/* PxIN */
#define _IO_PORT_IN(PORT)         (PORT##IN)
#define GPIO_READ_BITS(PORT, BIT)   ( (_IO_PORT_IN(PORT) & BIT) ? (SET):(RESET))
#define GOIO_READ_PORTS(PORT)       ( _IO_PORT_IN(PORT) )

/* PxOUT */
#define _IO_PORT_OUT(PORT)          (PORT##OUT)
#define GPIO_SET_BITS(PORT, BIT)    ( ( _IO_PORT_OUT(PORT) ) |= (BIT) )
#define GPIO_RESET_BITS(PORT, BIT)( ( _IO_PORT_OUT(PORT) ) &= ~(BIT) )

/* PxDIR */
#define _IO_PORT_DIR(PORT)          (PORT##DIR)
#define GPIO_OUTPUT_DIR(PORT, BIT)( ( _IO_PORT_DIR(PORT) ) |= (BIT) )
#define GPIO_INPUT_DIR(PORT, BIT)   ( ( _IO_PORT_DIR(PORT) ) &= ~(BIT) )

/* PxIE */
#define _IO_PORT_IE(PORT)         (PORT##IE)
#define GPIO_ENABLE_IRQ(PORT, BIT)( ( _IO_PORT_IE(PORT) ) |= (BIT) )
#define GPIO_DISABLE_IRQ(PORT, BIT) ( ( _IO_PORT_IE(PORT) ) &= ~(BIT) )

/* PxSEL */
#define _IO_PORT_SEL(PORT)          (PORT##SEL)
#define GPIO_PORT_FUNC(PORT, BIT)   ( ( _IO_PORT_SEL(PORT) ) |= (BIT) )
#define GPIO_MULTI_FUNC(PORT, BIT)( ( _IO_PORT_SEL(PORT) ) &= ~(BIT) )

/* ------------------ High layer function ----------------------------------- */
#define TEST_BIT(x)( GPIO_READ_BITS( ADD_STR(x, _PORT), ADD_STR(x, _BIT) ) )
#define SET_BIT(x)   ( GPIO_SET_BITS( ADD_STR(x, _PORT), ADD_STR(x, _BIT) ) )
#define CLR_BIT(x)   ( GPIO_RESET_BITS( ADD_STR(x, _PORT), ADD_STR(x, _BIT) ) )
#define BIT_OUT(x)   ( GPIO_OUTPUT_DIR( ADD_STR(x, _PORT), ADD_STR(x, _BIT) ) )
#define BIT_IN(x)    ( GPIO_INPUT_DIR( ADD_STR(x, _PORT), ADD_STR(x, _BIT) ) )
#define EINT_BIT(x)( GPIO_ENABLE_IRQ( ADD_STR(x, _PORT), ADD_STR(x, _BIT) ) )
#define DINT_BIT(x)( GPIO_DISABLE_IRQ( ADD_STR(x, _PORT), ADD_STR(x, _BIT) ) )
/* eg.                                                                        */
/* #define HC165_SCLK_PORT       P1          // 使用的是P1口                  */
/* #define HC165_SCLK_BIT      BIT5      // BIT5位                        */
/* BIT_OUT( HC165_SCLK );                  // 设置P1.5位输出                */

unsigned charDIS_BUF[]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18};//显示缓冲区
                //段码表    0    1    2    3    4    5    6    7    8    9    A    b    C    d    E    F    -    _    空
const unsigned charDIS[]={0xBF,0x06,0x7C,0x5E,0xC6,0xDA,0xFA,0x0E,0xFE,0xDE,0xEE,0xF2,0xB8,0x76,0xF8,0xE8,0x40,0x10,0x00};
/*****************************************************************
HT1622   指令宏定义
*****************************************************************/
#define SYSDIS      0X00         // 关振系统荡器和LCD偏压发生器
#define SYSEN       0X01         // 打开系统振荡器
#define LCDOFF      0X02         // 关LCD偏压
#define LCDON       0X03         // 打开LCD偏压
#define TIMEDIS   0x04         // 禁止时基输出
#define WDTDIS      0x05         // 禁止WDT超时标志输出
#define TIMEREN   0x08         // 启用时基输出
#define WDTEN       0x0D         // 启用WDT超时标志输出
#define TONEOFF   0x0F         // 关闭声音输出
#define CLRTIMER    0x05         // 清除时基发生器的内容
#define CLRWDT      0x0F         // 清除WDT的内容
#define RC32K       0x18         // 系统时钟源,片上RC振荡器
#define EXT32K      0x1C         // 系统时钟源,外部时钟源
#define TONE4K      0x40         // 音的输出频率:4kHz的
#define TONE2K      0x60         // 音的输出频率:2kHz的
#define IRQDIS      0x80         // 禁止IRQ输出
#define IRQEN       0x88         // 启用IRQ输出
#define F1          0xA0         // 时基时钟输出:2Hz WDT的超时标志后:4s
#define F2          0xA1         // 时基时钟输出:2Hz WDT的超时标志后:2s
#define F4          0xA2         // 时基时钟输出:4Hz WDT的超时标志后:1s
#define F8          0xA3         // 时基时钟输出:8Hz WDT的超时标志后:1/2s
#define F16         0xA4         // 时基时钟输出:16Hz WDT的超时标志后:1/4s
#define F32         0xA5         // 时基时钟输出:32Hz WDT的超时标志后:1/8s
#define F64         0xA6         // 时基时钟输出:64Hz WDT的超时标志后:1/16s
#define F128      0xA7         // 时基时钟输出:128Hz WDT的超时标志后:1/32s
#define TEST      0xE0         // 测试模式下,用户不使用。
#define NORMAL      0xE3         // 普通模式
/*****************************************************************
管脚分配 CS P1.0 WR P1.1 DAT P1.2
*****************************************************************/
#define HT1621_CS_PORTP1    //HT1621使能引脚
#define HT1621_CS_BIT   BIT0//HT1621使能引脚
#define HT1621_WR_PORTP1    //HT1621时钟引脚
#define HT1621_WR_BIT   BIT1//HT1621时钟引脚
#define HT1621_DAT_PORT P1    //HT1621数据引脚
#define HT1621_DAT_BITBIT2//HT1621数据引脚
/*****************************************************************
HT1622 底层驱动 Data 数据 Length 数据长度
*****************************************************************/
void Write_HT1622_Byte(unsigned char Data,unsigned char Length)
{
    unsigned char i,Temp=0x80;
    for (i=0;i<Length;i++)
    {   
      CLR_BIT ( HT1621_WR );   //“写”时钟置0
      if (Data&Temp)
          SET_BIT ( HT1621_DAT );//数据线置1
      else
          CLR_BIT ( HT1621_DAT );//数据线置0
      Temp>>=1;                //准备下一位
      SET_BIT ( HT1621_WR );   //“写”时钟置1
    }
}
/*****************************************************************
HT1622写入数据函数 Address 写数据地址Data 数据
*****************************************************************/
void Write_HT1622_Data(unsigned char Address,unsigned char Data)
{
    CLR_BIT ( HT1621_CS );       //片选置0
    Address <<= 2;               //将实际地址挪到高位
    Data <<= 4;                  //将实际数据挪到高位
    Write_HT1622_Byte(0xA0,3);   //写入写数据的ID 101 高3位有效
    Write_HT1622_Byte(Address,6);//写入6个位初始地址 高6位有效
    Write_HT1622_Byte(Data,4);   //写入4个位数据 高4位有效
    SET_BIT ( HT1621_CS );       //片选置1
}
/*****************************************************************
//HT1622写命令函数 Command 命令
*****************************************************************/
void Write_HT1622_Command(unsigned char Command)
{   
    CLR_BIT ( HT1621_CS );       //片选置0
    Write_HT1622_Byte(0x80,3);   //写入命令的ID:100
    Write_HT1622_Byte(Command,8);//写入实际命令的高8位(CMD.):C8-C1
    SET_BIT ( HT1621_DAT );      //|写入一个“1”即手册上所指“无关位”的那一个数据位
    CLR_BIT ( HT1621_WR );       //|
    _NOP();_NOP();_NOP();      //|
    SET_BIT ( HT1621_WR );       //|
    SET_BIT ( HT1621_CS );       //片选置1
}
/*****************************************************************
显示数字函数 *Data显示内容指针 Address 显示首位置   Length内容长度
*****************************************************************/
void Display(unsigned char *Data,unsigned char Address,unsigned char Length)
{
unsigned char i = 0,Temp=0x0F;
unsigned char ADDH,ADDL;
for(;i<Length;i++)
{
    Temp=DIS[*Data];                  //数据解析
    ADDL = Address*2;               //低4位地址解析
    ADDL = ADDL*2+2-(ADDL/31)*59;   //低4位地址解析
    Write_HT1622_Data(ADDL,Temp&0x0F);//写低4位数据
    ADDH = Address*2-1;               //高4位地址解析
    ADDH = ADDH*2+2-(ADDH/31)*59;   //高4位地址解析
    Temp>>=4;                         //高4位数据解析
    Write_HT1622_Data(ADDH,Temp&0x0F);//写高4位数据
    Data ++;                        //显示数据指针增一
    Address ++;                     //显示地址增一
}
}
/*****************************************************************
主函数上下两排显示 0到E
*****************************************************************/
void main(void)
{
    WDTCTL = WDTPW + WDTHOLD;    //关看门狗
    BIT_OUT ( HT1621_DAT );      //|IO口初始化
    BIT_OUT ( HT1621_CS );       //|
    BIT_OUT ( HT1621_WR );       //|
    SET_BIT ( HT1621_CS );       //|
    SET_BIT ( HT1621_WR );       //|
    SET_BIT ( HT1621_DAT );      //|
    Write_HT1622_Command(SYSDIS);//关闭系统振荡器和LCD驱动
    Write_HT1622_Command(SYSEN); //打开系统振荡器
    Write_HT1622_Command(LCDOFF);//关闭LCD显示
    Write_HT1622_Command(LCDON); //打开LCD显示
    Display(DIS_BUF,1,15);       //显示0到E 第一排
    Display(DIS_BUF,16,15);      //显示0到E 第二排
    while(1);
}

sunshulin 发表于 2011-12-9 18:02:19

芯片手册ourdev_703135NFL2JA.pdf(文件大小:180K) (原文件名:HT1622.pdf)
参考资料ourdev_703136HG4LIM.pdf(文件大小:122K) (原文件名:ha0103t.pdf)
屏幕管脚分配ourdev_703137VVTAFK.xls(文件大小:15K) (原文件名:屏幕管脚分配.xls)

elec2000 发表于 2011-12-9 18:02:49

MARCK

sunshulin 发表于 2011-12-9 18:07:14

IAR 工程ourdev_703142EHZMR2.rar(文件大小:15K) (原文件名:HT1622测试.rar)

dingliming 发表于 2011-12-17 10:29:49

mark

jeoo8888 发表于 2011-12-17 22:51:18

回复【1楼】sunshulin孙术林
-----------------------------------------------------------------------
请问这个lcd网上有买吗

smtgg 发表于 2011-12-18 09:23:38

mark

sunshulin 发表于 2011-12-18 12:17:21

回复【5楼】jeoo8888 黄明炎
回复【1楼】sunshulin孙术林
-----------------------------------------------------------------------
请问这个lcd网上有买吗

-----------------------------------------------------------------------

http://item.taobao.com/item.htm?id=12893306507

lzfbillie 发表于 2012-1-17 11:49:12

你这个用的是软件模拟的方法
你说有没有可能用SPI直接通讯呢?
用wr当SCK时钟
data就是mosi
这样可以吗?

szy494468597 发表于 2012-4-26 17:12:55

标记 学习一下

leinfly 发表于 2012-5-29 00:13:20

这个正需要,多谢啦

dianzichina 发表于 2012-5-30 07:17:40

楼主有没有这个液晶片出啊?有意。

sunshulin 发表于 2012-6-30 16:40:53

dianzichina 发表于 2012-5-30 07:17 static/image/common/back.gif
楼主有没有这个液晶片出啊?有意。

好久都没来论坛了   这个淘宝网上有卖的 帖子里有网址

lanyu8388 发表于 2014-3-5 13:07:25

正需要这个,谢谢了{:victory:}

dory_m 发表于 2014-3-5 16:24:43

学习,谢谢!!!
页: [1]
查看完整版本: 段码液晶屏驱动程序 HT1622 (HMS17AN)