查看: 2443|回复: 0
打印 上一主题 下一主题

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

[复制链接]
跳转到指定楼层
沙发
发表于 2016-3-29 12:34:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
效果图如下:

全部显示效果 遗憾的是没有小数点 (原文件名SC_1779.jpg)


显示数字 (原文件名SC_1792.jpg)


背面 (原文件名SC_1794.jpg)


HT1622 (原文件名SC_1796.jpg)
程序如下:
/*****************************************************************
HMS17AN段码液晶屏测试程序 Drive HT1622 CPU  MSP430G2454 @ 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 char  DIS_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 char  DIS[]={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_PORT  P1    //HT1621使能引脚
#define HT1621_CS_BIT   BIT0  //HT1621使能引脚
#define HT1621_WR_PORT  P1    //HT1621时钟引脚
#define HT1621_WR_BIT   BIT1  //HT1621时钟引脚
#define HT1621_DAT_PORT P1    //HT1621数据引脚
#define HT1621_DAT_BIT  BIT2  //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);
}

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入因仑

本版积分规则

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