HT1621.c文件
- //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);
- }
- }
|