STM32連接HT1621段碼屏驅動

HT1621:128個位元LCD控制器,內部RAM直接對應LCD顯示單元。
對於HT1621,操作之前應發送標誌碼,表明要求工作在哪種狀態,標誌定義如下:

操作 狀態 標誌碼
數據 110
數據 101
讀-修改-寫 數據 101
控制 命令 100

爲了點亮LCD,必須先給出兩個控制指令,system enable與LCDON
系統默認:

  1. 關振盪器和LCD偏壓發生器
  2. 關LCD偏壓
  3. 關閉聲音輸出
  4. 系統時鐘源,片內RC

操作結束後可以用SYSTEM DISABLE來關閉LCD.
由於是串行通信,數據應該先出現在DATA腳,然後給出一個
寫允許信號(WR),輸入一位數據,接着輸入第二位,直到全部寫入。

RAM區不連續寫數據過程:
先發送標誌碼101,表明下面要進行寫操作,然後發送地址碼A5--A0?,用D0-D3指定對應的位,就可以對LCD相應的位元操作了,連續寫時,給出起始地址,操作結束地址自動加1。

PE1 – CS
PB6 – TX DAT MOSI
PB7 – RX WR MISO

//ht1621.h
//管腳設置
#define HT1621_CS_H   GPIO_SetBits(GPIOE,GPIO_Pin_1)
#define HT1621_CS_L   GPIO_ResetBits(GPIOE,GPIO_Pin_1)

#define HT1621_DAT_H   GPIO_SetBits(GPIOB,GPIO_Pin_6)
#define HT1621_DAT_L   GPIO_ResetBits(GPIOB,GPIO_Pin_6)

#define HT1621_WR_H   GPIO_SetBits(GPIOB,GPIO_Pin_7)
#define HT1621_WR_L   GPIO_ResetBits(GPIOB,GPIO_Pin_7)

//HT1621控制命令
#define		SYSDIS 								0X00   //0B 100	0000	0000	X  關振盪器和LCD偏壓發生器
#define 	SYSEN 								0X01   //0B 100	0000	0001	X  打開系統振盪器
#define 	LCDOFF 								0X02   //0B 100	0000	0010	X  關LCD偏壓
#define 	LCDON 								0X03   //0B 100	0000	0011	X  開LCD偏壓
#define 	TIMERDIS 							0X04   //0B 100	0000	0100	X  時基輸出失效
#define 	WDTDIS								0X05   //0B 100	0000	0101	X  WDT溢出標誌輸出失效
#define 	TIMEREN 							0X06   //0B 100	0000	0110	X  時基輸出使能
#define 	WDTEN 								0X07   //0B 100	0000	0111	X  WDT溢出標誌輸出有效
#define 	TONEOFF								0X08   //0B 100	0000	1000	X  關閉聲音輸出
#define 	TONEON 								0X09   //0B 100	0000	1001	X  打開聲音輸出
#define 	CLRTIMER 							0X0C   //0B 100	0000	1100	X  時基發生器清零
#define 	CLRWDT 								0X0E   //0B 100	0000	1110	X  清除WDT狀態
#define 	XTAL_32K 							0X14   //0B 100	0001	0100	X  系統時鐘源,晶振
#define 	RC256 								0X18   //0B 100	0001	1000	X  系統時鐘源,片內RC
#define 	EXT256 								0X1C   //0B 100	0001	1100	X  系統時鐘源,外部時鐘源

#define 	BIAS1_2_2COM					0X20   //0B 100	0010	0000	X 	LCD 1/2偏壓選項,2個公共口 
#define 	BIAS1_2_3COM					0X24   //0B 100	0010	0100	X 	LCD 1/2偏壓選項,3個公共口
#define 	BIAS1_2_4COM					0X28   //0B 100	0010	1000	X 	LCD 1/2偏壓選項,4個公共口

#define 	BIAS1_3_2COM					0X21   //0B 100	0010	0001	X 	LCD 1/3偏壓選項,2個公共口 
#define 	BIAS1_3_3COM					0X25   //0B 100	0010	0101	X 	LCD 1/3偏壓選項,3個公共口
#define 	BIAS1_3_4COM					0X29   //0B 100	0010	1001	X 	LCD 1/3偏壓選項,4個公共口

#define 	TONE4K 								0X40   //0B 100	0100	0000	X  聲音頻率4K
#define 	TONE2K								0X50   //0B 100	0110	0000	X  聲音頻率2K
#define 	IRQ_DIS 							0X80   //0B 100	1000	0000	X  使/IRQ輸出失效
#define 	IRQ_EN								0X88   //0B 100	1000	1000	X  使/IRQ輸出有效
#define     BIAS 0x52 //0b1000 0101 0010 1/3duty 4com

//地址,SEG值
#define 	DisTime_shi_H				0X11	//Seg17
#define 	DisTime_shi_L				0X10	//Seg16

#define 	DisTime_ge_H				0X0F	//Seg15
#define 	DisTime_ge_L				0X0E	//Seg14

#define 	DisPower_shi_H				0X0D	//Seg13
#define 	DisPower_shi_L				0X0C	//Seg12

#define 	DisPower_ge_H				0X0B	//Seg11
#define 	DisPower_ge_L				0X0A	//Seg10

#define 	DisSoundInten_shi_H		    0X04	//Seg4
#define 	DisSoundInten_shi_L		    0X03	//Seg3

#define 	DisSoundInten_ge_H		    0X02	//Seg2
#define 	DisSoundInten_ge_L		    0X01	//Seg1

#define 	DisMHz_H					0X08	//Seg8
#define 	DisMHz_L					0X07	//Seg7

#define 	DisDuty_H					0X06	//佔空比,Seg6
#define 	DisDuty_L					0X05	//佔空比,Seg5

#define   DisFlash        			    0X09	//Seg9 

#define 	Run_Mode					0X00	//Seg0

//seg0,數據,COM值。
#define 	Mode_Serial					0X04	//com2
#define 	Mode_Interrupted			0X08	//com3
#define 	Mode_Mode					0X02	//com1

//seg9,mark掩碼
#define 	MHz_Fresh					0X01	//com0
#define 	Time_Fresh		   			0X08	//com3
#define 	Out_Power		   			0X04	//com2 

#define 	COM_1	   		      		0X01	//com0
#define 	COM_2	   		      		0X02	//com1
#define 	COM_3	   		      		0X04	//com2
#define 	COM_4	   		      		0X08	//com3

//ht1621.c
//7段數碼管數字碼。高四位對應SEG_H,低四位對應SGE_L
u8 SegCode[10]= {
    0XAF,	//0
    0XA0,	//1
    0XCB,	//2
    0XE9,	//3
    0XE4,	//4
    0X6D,	//5
    0X6F,	//6
    0XA8,	//7
    0XEF,	//8
    0XED    //9
};
/*********************************************************
函數名:LCD_GPIO_Configuration()
返回值:無
功  能:端口初始化
PE1 -- CS  DAT
PB6 -- TX
PB7 -- RX  WR
*********************************************************/
void LCD_GPIO_Configuration(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE|RCC_APB2Periph_GPIOB, ENABLE);
    GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_6| GPIO_Pin_7;
    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_1;
    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOE, &GPIO_InitStructure);
}
/*********************************************************
函數名:SendBit_1621()
返回值:無
功  能:HT1621數據寫入函數
Data爲數據,cnt爲數據位數
//發送指定的位,先發送最高位,用於發送命令與SEG
//dat的高cnt位寫入1621,高位在前,如0x80的高三位是100
*********************************************************/
void SendBit_1621(u8 dat,u8 cnt)
{
    u8 i;
    for(i=0; i<cnt; i++)
    {
        HT1621_WR_L;
        Ht1621_delay_10us(1);
        if((dat&0x80)==0)
        {
            HT1621_DAT_L;
        }
        else
        {
            HT1621_DAT_H;
        }

        Ht1621_delay_10us(1);
        HT1621_WR_H;
        Ht1621_delay_10us(1);
        dat<<=1;
    }
}
/********************************************************
函數名稱:void SendDataBit_1621(uchar dat,uchar cnt)
功能描述: HT1621在指定地址寫入數據函數
全局變量:無
參數說明:Addr爲寫入初始地址,Data爲寫入數據
返回說明:無
說 明:因爲HT1621的數據位4位,所以實際寫入數據爲參數的後4位
//發送指定的位,先發送最低位,用於發送com
//dat的低cnt位寫入1621,低位在前
//a5-a4-a3-a2-a1-a0-d0-d1-d2-d3,  a爲地址:seg     d 爲com
********************************************************/
void SendDataBit_1621(u8 dat,u8 cnt)
{
    u8 i;
    for(i=0; i<cnt; i++)
    {
        if((dat&0x01)==0)
        {
            HT1621_DAT_L;
        }
        else
        {
            HT1621_DAT_H;
        }

        Ht1621_delay_10us(1);
        HT1621_WR_L;
        Ht1621_delay_10us(1);
        HT1621_WR_H;
        Ht1621_delay_10us(1);
        dat>>=1;
    }
}
/********************************************************
函數名稱:void SendCmd(uchar Cmd)
功能描述: HT1621命令寫入函數
全局變量:無
參數說明:Cmd爲寫入命令數據
返回說明:無
說 明:寫入命令標識位100
********************************************************/
void SendCmd(u8 Cmd)
{
    HT1621_CS_L;
    Ht1621_delay_10us(1);
    SendBit_1621(0x80,3); // - - 寫入命令標誌100//寫入標誌碼"100"命令模式
    SendBit_1621(Cmd,9); // - - 寫入命令數據//寫入9位數據,其中前8位是命令,最後一位任意。
    HT1621_CS_H;
    Ht1621_delay_10us(1);
}
/********************************************************
函數名稱:void Write_1621(uchar Cmd)
功能描述: HT1621命令寫入函數
全局變量:無
參數說明:Cmd爲寫入命令數據
返回說明:無
//發送命令+地址+數據    地址SEG   com0-com4
********************************************************/
void Write_1621(u8  addr,u8 dat)
{
    HT1621_CS_L;
    Ht1621_delay_10us(1);
    SendBit_1621(0xa0,3); // - - 寫入數據標誌101
    SendBit_1621(addr<<2,6); // - - 寫入地址數據//寫入6位地址,SEG
    SendDataBit_1621(dat,4);		//寫入DAT低4位,分別對應COM3,COM2,COM1,COM0
    HT1621_CS_H;
    Ht1621_delay_10us(1);
}
/********************************************************
函數名稱:void WriteAll_1621(uchar Addr,uchar *p,uchar cnt)
功能描述: HT1621連續寫入方式函數
全局變量:無
參數說明:Addr爲寫入初始地址,*p爲連續寫入數據指針,
cnt爲寫入數據總數
返回說明:無
說 明:HT1621的數據位4位,此處每次數據爲8位,寫入數據
總數按8位計算
********************************************************/
void WriteAll_1621(u8 Addr,u8 *p,u8 cnt)
{
    u8 i;
    HT1621_CS_L;
    SendBit_1621(0xa0,3); // - - 寫入數據標誌101
    SendBit_1621(Addr<<2,6); // - - 寫入地址數據
    for (i=0; i<cnt; i++)
    {
        SendDataBit_1621(*p,8); // - - 寫入數據
        p++;
    }
    HT1621_CS_H;
    Ht1621_delay_10us(1);
}

/********************************************************
函數名稱:void Ht1621_Init(void)
功能描述: HT1621初始化
全局變量:無
參數說明:無
返回說明:無
版 本:1.0
說 明:初始化後,液晶屏所有字段均顯示
********************************************************/
void HT1621_Init(void)
{
////    			HT1621_CS_H;
////			HT1621_WR_H;
////			HT1621_DAT_H;
////			Ht1621_delayms(500); // - - 延時使LCD工作電壓穩定
////			SendCmd(0x52);
////			SendCmd(0X30); // - - 使用內部振盪器 0X30
////			SendCmd(0X00); // - - 關振系統蕩器和LCD偏壓發生器 0X00
////			SendCmd(0X0A); // - - 禁止看門狗  0X0A
////			SendCmd(0X02); // - - 打開系統振盪器 0X02
////			SendCmd(0X06); // - - 打開LCD偏壓 0X06

//    HT1621_CS_H;
//    HT1621_WR_H;
//    HT1621_DAT_H;
//    Ht1621_delayms(500); // - - 延時使LCD工作電壓穩定
    SendCmd(BIAS1_3_4COM);//設定1/3偏壓,4個COM
//    SendCmd(RC256); // - - 使用內部振盪器
//    SendCmd(SYSDIS); // - - 關振系統蕩器和LCD偏壓發生器
//    SendCmd(WDTDIS); // - - 禁止看門狗
    SendCmd(SYSEN); // - - 打開系統振盪器
    SendCmd(LCDON); // - - 打開LCD偏壓
//    Clean_All();
}
/********************************************************
函數名稱:void TimeDispaly (void)
功能描述: HT1621初始化
函數功能:顯示時間十位與個位。
傳遞參數:時間值,最大30分鐘
說明:一個7段數碼要寫兩次才能完成,因爲7段數據公佈在兩個SEG上。
Write_1621(地址,數據):只發送4位數據。
********************************************************/
void TimeDispaly(u8 Time)
{
    Split(Time);//分離數據的十位和個位
    Write_1621(DisTime_shi_H,SegCode[AllData.Digit_Tens]);					//先寫低4位,
    Write_1621(DisTime_shi_L,SegCode[AllData.Digit_Tens]>>4);				//將高4位右移4位再寫

    Write_1621(DisTime_ge_H,SegCode[AllData.Digit_Units]);
    Write_1621(DisTime_ge_L,(SegCode[AllData.Digit_Units]>>4)|0x01);//顯示小數點,最低位爲1.
}
//顯示全部
void Diaplay_ShowAll(void)
{
    u8 i;
    for(i=0; i<19; i++)
    {
        Write_1621(i,0x0f);
    }
}
//清屏
void Clean_All(void)
{
    u8 i;
    for(i=0; i<19; i++)
    {
        Write_1621(i,0x00);
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章