32 x 8段液晶驱动HT1622 程序

软件平台IAR for STM8 V1.30

#include

#define       uchar   unsigned  char
#define       uint    unsigned  int

#define       LCD_ON          0x03    //启动偏压发生器
#define       LCD_OFF         0x02    //关闭偏压发生器
#define       SYS_DIS         0x00    //关闭振荡器和LCD驱动
#define       SYS_EN          0x01    //启动系统振荡器
#define       RC32K           0x18    //启动内部32KRC
#define       TONE_OFF        0x08    //关闭蜂鸣器
#define       TONE_4K         0x40    //启动4 khz蜂鸣信号
#define       TONE_2K         0x60    //启动2 khz蜂鸣信号

#define       DATA        PC_ODR_ODR4
#define       WR          PC_ODR_ODR5
#define       CS          PC_ODR_ODR7

#define       COM0        0
#define       COM1        1
#define       COM2        2
#define       COM3        3
#define       COM4        4
#define       COM5        5
#define       COM6        6
#define       COM7        7

uchar   dispram[32];    //预设显示缓存,8x32


void  gpio(void)
{
    PC_DDR = 0xb0;
    PC_CR1 = 0xb0;
    PC_ODR = 0xbf;
}

void  delay_ms(uchar  ms)
{
    volatile uint  i, j;
    for (i=ms; i>0; i--)
        for (j=400; j>0; j--)
        {
            ;
        }
}

void SendBit_HL(uchar dat,uchar cnt) //dat 的高cnt 位写入HT1621,先发送高位
{
    uchar i;
    for(i=0; i
    {
        if(dat&0x80)
        {
            DATA = 1;
        }
        else
        {
            DATA = 0;
        }
        WR = 0;
        asm("nop");
        asm("nop");
        WR = 1;
        dat <<= 1;
    }
}

void  SendBit_LH(uchar  dat,uchar cnt)    //data的低cnt位写入1621
{
    uchar i;
    for(i=0; i
    {
        if(dat&0x01)
        {
            DATA = 1;
        }
        else
        {
            DATA = 0;
        }
        WR = 0;
        asm("nop");
        asm("nop");
        WR = 1;
        dat >>= 1;
    }
}

//指令模式
void  Sendcmd(uchar  command)
{
    CS = 0;
    SendBit_HL(0x80,3);  //写入标志码"100"
    SendBit_HL(command,9);  //写入 9 位数据,其中前 8 位为 command 命令,最后 1 位任意
    CS = 1;
}

//写半个字节
void W1622_q(uchar addr,uchar dat)
{
    CS = 0;
    SendBit_HL(0xa0,3);  //写入标志码"101"
    SendBit_HL(addr<<2,6); //写入 6 位 addr
    SendBit_LH(dat,4);
    CS = 1;
}

//写SEG脚上所有的位,SEG( 0~31 )
void  W1622_byte(uchar SEG,uchar dat)
{
    uchar i,addr;
    addr = SEG * 2;
    for(i=0;i<2;i++)
    {
        W1622_q(addr,dat);
        addr += 1;
        dat >>= 4;
    }
}

//连续写单元 SEG(0~31)
void W1622_success(uchar SEG,uchar cnt,uchar *p)
{
    uchar i,addr;
    addr = SEG * 2;
    CS = 0;
    SendBit_HL(0xa0,3);  //写入标志码"101"
    SendBit_HL(addr<<2,6); //写入 6 位 addr
    for(i =0; i
    {
        SendBit_LH(*p,4);
        SendBit_LH(*p>>4,4);
    }
    CS = 1;
}

void disp_renew(void)   //显示更新,所有8x32段全部刷新
{
    W1622_success(0,32,dispram);
}

//com(0-7)  SEG(0-31)
void  dispON(uchar com,uchar SEG)
{
    dispram[SEG] |= (1<<com);
    //W1622_byte(SEG,dispram[SEG]);     //去掉注释后,写完就马上显示
}

//com(0-7)  SEG(0-31)
void  dispOFF(uchar com,uchar SEG)
{
    dispram[SEG] &= ~(1<<com);
    //W1622_byte(SEG,dispram[SEG]);    //去掉注释后,写完就马上显示
}

void  cleandisp(void)
{
    uchar  i;
    CS = 0;     //清屏幕
    SendBit_HL(0xa0,3);  //写入标志码"101"
    SendBit_HL(0,6); //写入 6 位 addr
    for(i =0; i <32; i ++) //连续写入数据
    {
        SendBit_LH(0,4);
        SendBit_LH(0,4);
    }
    CS = 1;
    for(i=0; i<32; i++)
    {
        dispram[i] = 0x00;    //清空显存
    }
}

void  disp_All(void)
{
    uchar  i;
    CS = 0;     //全显示屏幕
    SendBit_HL(0xa0,3);  //写入标志码"101"
    SendBit_HL(0,6); //写入 6 位 addr
    for(i =0; i <32; i ++) //连续写入数据
    {
        SendBit_LH(0xff,4);
        SendBit_LH(0xff,4);
    }
    CS = 1;
    for(i=0; i<32; i++)
    {
        dispram[i] = 0xff;    //填充显存
    }
}

void HT1622_Init(void)
{
    uchar  j = 0;
    for(j=0; j<32; j++)
    {
        dispram[j] = 0;
    }
    Sendcmd(RC32K);   //RC32k
    Sendcmd(SYS_EN);  //打开系统振荡器
    Sendcmd(LCD_ON);  //打开 LCD偏压发生器
}

void  main( void )
{
    uchar i,j;
    gpio();
    HT1622_Init();
   /// disp_All();       //全部显示
   // delay_ms(200);
    cleandisp();      //清屏

   // delay_ms(200);
  
    while(1)
    {
          for(i=0;i<32;i++)
          {
              for(j=0;j<8;j++)
              {
                  dispON(j,i);
                  disp_renew();
                  delay_ms(80);
              }
          }
          delay_ms(200);
          cleandisp();
          for(i=0;i<8;i++)
          {
              for(j=0;j<32;j++)
              {
                  dispON(i,j);
                  disp_renew();   //刷新整个显示
                  delay_ms(80);
              }
          }
          delay_ms(200);
          cleandisp();
          
    }
}

/***************************************************************************** *版权信息:深圳天微电子有限公司 *文 件 名:TM1622-V1.0 *当前版本:V1.0 *MCU 型号:STC12C5608AD *开发环境:Keil uVision4 *晶震频率:11.0592MHZ *完成日期:2013-09-09 *程序功能:1.LCD驱动32SEG*8COM(由2组4COM LCD屏组成),分别显示0~9. *免责声明:1.此程序TM1622驱动LCD演示程序,仅作参考之用。 2.如有直接使用本例程程序造成经济损失的,本公司不承担任何责任 ********************************************************************************/ #include //MCU头文件 #include "intrins.h" //包含nop指令头文件 #define nop() _nop_();_nop_();_nop_();_nop_();_nop_(); //宏定义 /********************定义控制端口**********************/ sbit CS = P2^1; //片选 sbit READ = P2^0; //读数据时钟 sbit WRITE = P1^7; //写数据时钟 sbit DATA = P1^6; //数据口 //****定义数据*************** 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 unsigned char code date0[]={0x0B,0x00,0x07,0x05,0x0C,0x0D,0x0F,0x00,0x0F,0x0D,0x0B,0x00,0x07,0x05,0x0C,0x0D,0x0F,0x00,0x0F,0x0D,0x0B,0x00,0x07,0x05,0x0C,0x0D,}; unsigned char code date1[]={0x0E,0x06,0x0C,0x0e,0x06,0x0A,0x0A,0x0E,0x0E,0x0E,0x0E,0x06,0x0C,0x0e,0x06,0x0A,0x0A,0x0E,0x0E,0x0E,0x0E,0x06,0x0C,0x0e,0x06,0x0A,}; unsigned char Buffer[64]; //定义数组 /***************延时函数nms**************/ void delay_nms(unsigned int n) { unsigned int i; while(n--) { for(i=0; i<550; i++); } } /***************写100命令函数**************/ void write_cmd_100(unsigned char cmd) { unsigned char i; CS=0; WRITE=0; nop(); DATA=1; nop(); WRITE=1; nop(); WRITE=0; nop(); DATA=0; nop(); WRITE=1; nop(); WRITE=0; nop(); DATA=0; nop(); WRITE=1; nop(); for(i=0; i<8; i++) { WRITE=0; if(cmd&0x80;) DATA=1; else DATA=0; WRITE=1; cmd<<=1; } WRITE=0; nop(); DATA=0; nop(); WRITE=1; nop(); WRITE=0; nop(); CS=1; } /***************写101数据函数**************/ void write_101(unsigned char address, unsigned char dat) { unsigned char i, add; add=address<<2; CS=0; WRITE=0; nop(); DATA=1; nop(); WRITE=1; nop(); WRITE=0; nop(); DATA=0; nop(); WRITE=1; nop(); WRITE=0; nop(); DATA=1; nop(); WRITE=1; nop(); for(i=0; i<6; i++) { WRITE=0; if(add&0x80;) DATA=1; else DATA=0; WRITE=1; add<<=1; } for(i=0; i>=1; } WRITE=0; DATA=0; CS=1; } /***************向显存写数据**************/ void writeDDRAM(void) { unsigned char i; for(i=0;i<16;i++) //向64个地址写数据,显示0~9 { write_101((2*(2*i)),date0[i]); write_101((2*(2*i)+2),date1[i]); write_101((2*(2*i)+1),date0[i]); write_101((2*(2*i)+3),date1[i]); } } /***************TM1622初始化函数**************/ void init_tm1622() { write_cmd_100(0x01); //打开系统振荡器 write_cmd_100(0x03); //开启LCD显示 write_cmd_100(0x18); //片内RC 32KHZ write_cmd_100(0xe3); //正常模式 } void main() { unsigned char i; init_tm1622(); //初始化 nop(); nop();
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值