[其他ST产品] STM32连接HT1621段码屏驱动

[复制链接]
1372|8
 楼主| 原来是wjc 发表于 2022-12-25 15:41 | 显示全部楼层 |阅读模式
HT1621:128个位元LCD控制器,内部RAM直接对应LCD显示单元。
对于HT1621,操作之前应发送标志码,表明要求工作在哪种状态,标志定义如下:
6968563a7fe8ecef47.png

为了点亮LCD,必须先给出两个控制指令,system enable与LCDON
 楼主| 原来是wjc 发表于 2022-12-25 15:51 | 显示全部楼层
系统默认:

关振荡器和LCD偏压发生器
关LCD偏压
关闭声音输出
系统时钟源,片内RC
 楼主| 原来是wjc 发表于 2022-12-25 15:56 | 显示全部楼层
操作结束后可以用SYSTEM DISABLE来关闭LCD.
由于是串行通信,数据应该先出现在DATA脚,然后给出一个
写允许信号(WR),输入一位数据,接着输入第二位,直到全部写入。
 楼主| 原来是wjc 发表于 2022-12-27 16:00 | 显示全部楼层
RAM区不连续写数据过程:
先发送标志码101,表明下面要进行写操作,然后发送地址码A5--A0?,用D0-D3指定对应的位,就可以对LCD相应的位元操作了,连续写时,给出起始地址,操作结束地址自动加1。

 楼主| 原来是wjc 发表于 2022-12-27 16:01 | 显示全部楼层
PE1 – CS
PB6 – TX DAT MOSI
PB7 – RX WR MISO
.h文件内的定义需要根据自己的IO口和段码屏的真值表修改,如果屏幕不亮看下接口电压和电阻是否匹配。
 楼主| 原来是wjc 发表于 2022-12-27 16:01 | 显示全部楼层
HT1621.h文件
  1. //ht1621.h
  2. //管脚设置
  3. #define HT1621_CS_H   GPIO_SetBits(GPIOE,GPIO_Pin_1)
  4. #define HT1621_CS_L   GPIO_ResetBits(GPIOE,GPIO_Pin_1)

  5. #define HT1621_DAT_H   GPIO_SetBits(GPIOB,GPIO_Pin_6)
  6. #define HT1621_DAT_L   GPIO_ResetBits(GPIOB,GPIO_Pin_6)

  7. #define HT1621_WR_H   GPIO_SetBits(GPIOB,GPIO_Pin_7)
  8. #define HT1621_WR_L   GPIO_ResetBits(GPIOB,GPIO_Pin_7)

  9. //HT1621控制命令
  10. #define                SYSDIS                                                                 0X00   //0B 100        0000        0000        X  关振荡器和LCD偏压发生器
  11. #define         SYSEN                                                                 0X01   //0B 100        0000        0001        X  打开系统振荡器
  12. #define         LCDOFF                                                                 0X02   //0B 100        0000        0010        X  关LCD偏压
  13. #define         LCDON                                                                 0X03   //0B 100        0000        0011        X  开LCD偏压
  14. #define         TIMERDIS                                                         0X04   //0B 100        0000        0100        X  时基输出失效
  15. #define         WDTDIS                                                                0X05   //0B 100        0000        0101        X  WDT溢出标志输出失效
  16. #define         TIMEREN                                                         0X06   //0B 100        0000        0110        X  时基输出使能
  17. #define         WDTEN                                                                 0X07   //0B 100        0000        0111        X  WDT溢出标志输出有效
  18. #define         TONEOFF                                                                0X08   //0B 100        0000        1000        X  关闭声音输出
  19. #define         TONEON                                                                 0X09   //0B 100        0000        1001        X  打开声音输出
  20. #define         CLRTIMER                                                         0X0C   //0B 100        0000        1100        X  时基发生器清零
  21. #define         CLRWDT                                                                 0X0E   //0B 100        0000        1110        X  清除WDT状态
  22. #define         XTAL_32K                                                         0X14   //0B 100        0001        0100        X  系统时钟源,晶振
  23. #define         RC256                                                                 0X18   //0B 100        0001        1000        X  系统时钟源,片内RC
  24. #define         EXT256                                                                 0X1C   //0B 100        0001        1100        X  系统时钟源,外部时钟源

  25. #define         BIAS1_2_2COM                                        0X20   //0B 100        0010        0000        X         LCD 1/2偏压选项,2个公共口
  26. #define         BIAS1_2_3COM                                        0X24   //0B 100        0010        0100        X         LCD 1/2偏压选项,3个公共口
  27. #define         BIAS1_2_4COM                                        0X28   //0B 100        0010        1000        X         LCD 1/2偏压选项,4个公共口

  28. #define         BIAS1_3_2COM                                        0X21   //0B 100        0010        0001        X         LCD 1/3偏压选项,2个公共口
  29. #define         BIAS1_3_3COM                                        0X25   //0B 100        0010        0101        X         LCD 1/3偏压选项,3个公共口
  30. #define         BIAS1_3_4COM                                        0X29   //0B 100        0010        1001        X         LCD 1/3偏压选项,4个公共口

  31. #define         TONE4K                                                                 0X40   //0B 100        0100        0000        X  声音频率4K
  32. #define         TONE2K                                                                0X50   //0B 100        0110        0000        X  声音频率2K
  33. #define         IRQ_DIS                                                         0X80   //0B 100        1000        0000        X  使/IRQ输出失效
  34. #define         IRQ_EN                                                                0X88   //0B 100        1000        1000        X  使/IRQ输出有效
  35. #define     BIAS 0x52 //0b1000 0101 0010 1/3duty 4com

  36. //地址,SEG值
  37. #define         DisTime_shi_H                                0X11        //Seg17
  38. #define         DisTime_shi_L                                0X10        //Seg16

  39. #define         DisTime_ge_H                                0X0F        //Seg15
  40. #define         DisTime_ge_L                                0X0E        //Seg14

  41. #define         DisPower_shi_H                                0X0D        //Seg13
  42. #define         DisPower_shi_L                                0X0C        //Seg12

  43. #define         DisPower_ge_H                                0X0B        //Seg11
  44. #define         DisPower_ge_L                                0X0A        //Seg10

  45. #define         DisSoundInten_shi_H                    0X04        //Seg4
  46. #define         DisSoundInten_shi_L                    0X03        //Seg3

  47. #define         DisSoundInten_ge_H                    0X02        //Seg2
  48. #define         DisSoundInten_ge_L                    0X01        //Seg1

  49. #define         DisMHz_H                                        0X08        //Seg8
  50. #define         DisMHz_L                                        0X07        //Seg7

  51. #define         DisDuty_H                                        0X06        //Seg6
  52. #define         DisDuty_L                                        0X05        //Seg5

  53. #define   DisFlash                                    0X09        //Seg9

  54. #define         Run_Mode                                        0X00        //Seg0

  55. //seg0,数据,COM值。
  56. #define         Mode_Serial                                        0X04        //com2
  57. #define         Mode_Interrupted                        0X08        //com3
  58. #define         Mode_Mode                                        0X02        //com1

  59. //seg9,mark掩码
  60. #define         MHz_Fresh                                        0X01        //com0
  61. #define         Time_Fresh                                           0X08        //com3
  62. #define         Out_Power                                           0X04        //com2

  63. #define         COM_1                                                 0X01        //com0
  64. #define         COM_2                                                 0X02        //com1
  65. #define         COM_3                                                 0X04        //com2
  66. #define         COM_4                                                 0X08        //com3

 楼主| 原来是wjc 发表于 2022-12-27 16:03 | 显示全部楼层
HT1621.c文件
  1. //ht1621.c
  2. //7段数码管数字码。高四位对应SEG_H,低四位对应SGE_L
  3. u8 SegCode[10]= {
  4.     0XAF,        //0
  5.     0XA0,        //1
  6.     0XCB,        //2
  7.     0XE9,        //3
  8.     0XE4,        //4
  9.     0X6D,        //5
  10.     0X6F,        //6
  11.     0XA8,        //7
  12.     0XEF,        //8
  13.     0XED    //9
  14. };
  15. /*********************************************************
  16. 函数名:LCD_GPIO_Configuration()
  17. 返回值:无
  18. 功  能:端口初始化
  19. PE1 -- CS  DAT
  20. PB6 -- TX
  21. PB7 -- RX  WR
  22. *********************************************************/
  23. void LCD_GPIO_Configuration(void)
  24. {
  25.     GPIO_InitTypeDef GPIO_InitStructure;
  26.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE|RCC_APB2Periph_GPIOB, ENABLE);
  27.     GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_6| GPIO_Pin_7;
  28.     GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_Out_PP;
  29.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  30.     GPIO_Init(GPIOB, &GPIO_InitStructure);

  31.     GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_1;
  32.     GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_Out_PP;
  33.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  34.     GPIO_Init(GPIOE, &GPIO_InitStructure);
  35. }
  36. /*********************************************************
  37. 函数名:SendBit_1621()
  38. 返回值:无
  39. 功  能:HT1621数据写入函数
  40. Data为数据,cnt为数据位数
  41. //发送指定的位,先发送最高位,用于发送命令与SEG
  42. //dat的高cnt位写入1621,高位在前,如0x80的高三位是100
  43. *********************************************************/
  44. void SendBit_1621(u8 dat,u8 cnt)
  45. {
  46.     u8 i;
  47.     for(i=0; i<cnt; i++)
  48.     {
  49.         HT1621_WR_L;
  50.         Ht1621_delay_10us(1);
  51.         if((dat&0x80)==0)
  52.         {
  53.             HT1621_DAT_L;
  54.         }
  55.         else
  56.         {
  57.             HT1621_DAT_H;
  58.         }

  59.         Ht1621_delay_10us(1);
  60.         HT1621_WR_H;
  61.         Ht1621_delay_10us(1);
  62.         dat<<=1;
  63.     }
  64. }
  65. /********************************************************
  66. 函数名称:void SendDataBit_1621(uchar dat,uchar cnt)
  67. 功能描述: HT1621在指定地址写入数据函数
  68. 全局变量:无
  69. 参数说明:Addr为写入初始地址,Data为写入数据
  70. 返回说明:无
  71. 说 明:因为HT1621的数据位4位,所以实际写入数据为参数的后4位
  72. //发送指定的位,先发送最低位,用于发送com
  73. //dat的低cnt位写入1621,低位在前
  74. //a5-a4-a3-a2-a1-a0-d0-d1-d2-d3,  a为地址:seg     d 为com
  75. ********************************************************/
  76. void SendDataBit_1621(u8 dat,u8 cnt)
  77. {
  78.     u8 i;
  79.     for(i=0; i<cnt; i++)
  80.     {
  81.         if((dat&0x01)==0)
  82.         {
  83.             HT1621_DAT_L;
  84.         }
  85.         else
  86.         {
  87.             HT1621_DAT_H;
  88.         }

  89.         Ht1621_delay_10us(1);
  90.         HT1621_WR_L;
  91.         Ht1621_delay_10us(1);
  92.         HT1621_WR_H;
  93.         Ht1621_delay_10us(1);
  94.         dat>>=1;
  95.     }
  96. }
  97. /********************************************************
  98. 函数名称:void SendCmd(uchar Cmd)
  99. 功能描述: HT1621命令写入函数
  100. 全局变量:无
  101. 参数说明:Cmd为写入命令数据
  102. 返回说明:无
  103. 说 明:写入命令标识位100
  104. ********************************************************/
  105. void SendCmd(u8 Cmd)
  106. {
  107.     HT1621_CS_L;
  108.     Ht1621_delay_10us(1);
  109.     SendBit_1621(0x80,3); // - - 写入命令标志100//写入标志码"100"命令模式
  110.     SendBit_1621(Cmd,9); // - - 写入命令数据//写入9位数据,其中前8位是命令,最后一位任意。
  111.     HT1621_CS_H;
  112.     Ht1621_delay_10us(1);
  113. }
  114. /********************************************************
  115. 函数名称:void Write_1621(uchar Cmd)
  116. 功能描述: HT1621命令写入函数
  117. 全局变量:无
  118. 参数说明:Cmd为写入命令数据
  119. 返回说明:无
  120. //发送命令+地址+数据    地址SEG   com0-com4
  121. ********************************************************/
  122. void Write_1621(u8  addr,u8 dat)
  123. {
  124.     HT1621_CS_L;
  125.     Ht1621_delay_10us(1);
  126.     SendBit_1621(0xa0,3); // - - 写入数据标志101
  127.     SendBit_1621(addr<<2,6); // - - 写入地址数据//写入6位地址,SEG
  128.     SendDataBit_1621(dat,4);                //写入DAT低4位,分别对应COM3,COM2,COM1,COM0
  129.     HT1621_CS_H;
  130.     Ht1621_delay_10us(1);
  131. }
  132. /********************************************************
  133. 函数名称:void WriteAll_1621(uchar Addr,uchar *p,uchar cnt)
  134. 功能描述: HT1621连续写入方式函数
  135. 全局变量:无
  136. 参数说明:Addr为写入初始地址,*p为连续写入数据指针,
  137. cnt为写入数据总数
  138. 返回说明:无
  139. 说 明:HT1621的数据位4位,此处每次数据为8位,写入数据
  140. 总数按8位计算
  141. ********************************************************/
  142. void WriteAll_1621(u8 Addr,u8 *p,u8 cnt)
  143. {
  144.     u8 i;
  145.     HT1621_CS_L;
  146.     SendBit_1621(0xa0,3); // - - 写入数据标志101
  147.     SendBit_1621(Addr<<2,6); // - - 写入地址数据
  148.     for (i=0; i<cnt; i++)
  149.     {
  150.         SendDataBit_1621(*p,8); // - - 写入数据
  151.         p++;
  152.     }
  153.     HT1621_CS_H;
  154.     Ht1621_delay_10us(1);
  155. }

  156. /********************************************************
  157. 函数名称:void Ht1621_Init(void)
  158. 功能描述: HT1621初始化
  159. 全局变量:无
  160. 参数说明:无
  161. 返回说明:无
  162. 版 本:1.0
  163. 说 明:初始化后,液晶屏所有字段均显示
  164. ********************************************************/
  165. void HT1621_Init(void)
  166. {
  167.                             HT1621_CS_H;
  168.                         HT1621_WR_H;
  169.                         HT1621_DAT_H;
  170.                         Ht1621_delayms(500); // - - 延时使LCD工作电压稳定
  171.                         SendCmd(0x52);
  172.                         SendCmd(0X30); // - - 使用内部振荡器 0X30
  173.                         SendCmd(0X00); // - - 关振系统荡器和LCD偏压发生器 0X00
  174.                         SendCmd(0X0A); // - - 禁止看门狗  0X0A
  175.                         SendCmd(0X02); // - - 打开系统振荡器 0X02
  176.                         SendCmd(0X06); // - - 打开LCD偏压 0X06

  177. //    HT1621_CS_H;
  178. //    HT1621_WR_H;
  179. //    HT1621_DAT_H;
  180. //    Ht1621_delayms(500); // - - 延时使LCD工作电压稳定
  181.     SendCmd(BIAS1_3_4COM);//设定1/3偏压,4个COM
  182. //    SendCmd(RC256); // - - 使用内部振荡器
  183. //    SendCmd(SYSDIS); // - - 关振系统荡器和LCD偏压发生器
  184. //    SendCmd(WDTDIS); // - - 禁止看门狗
  185.     SendCmd(SYSEN); // - - 打开系统振荡器
  186.     SendCmd(LCDON); // - - 打开LCD偏压
  187. //    Clean_All();
  188. }
  189. /********************************************************
  190. 函数名称:void TimeDispaly (void)
  191. 功能描述: HT1621初始化
  192. 函数功能:显示时间十位与个位。
  193. 传递参数:时间值,最大30分钟
  194. 说明:一个7段数码要写两次才能完成,因为7段数据公布在两个SEG上。
  195. Write_1621(地址,数据):只发送4位数据。
  196. ********************************************************/
  197. void TimeDispaly(u8 Time)
  198. {
  199.     Split(Time);//分离数据的十位和个位
  200.     Write_1621(DisTime_shi_H,SegCode[AllData.Digit_Tens]);                                        //先写低4位,
  201.     Write_1621(DisTime_shi_L,SegCode[AllData.Digit_Tens]>>4);                                //将高4位右移4位再写

  202.     Write_1621(DisTime_ge_H,SegCode[AllData.Digit_Units]);
  203.     Write_1621(DisTime_ge_L,(SegCode[AllData.Digit_Units]>>4)|0x01);//显示小数点,最低位为1.
  204. }
  205. //显示全部
  206. void Diaplay_ShowAll(void)
  207. {
  208.     u8 i;
  209.     for(i=0; i<19; i++)
  210.     {
  211.         Write_1621(i,0x0f);
  212.     }
  213. }
  214. //清屏
  215. void Clean_All(void)
  216. {
  217.     u8 i;
  218.     for(i=0; i<19; i++)
  219.     {
  220.         Write_1621(i,0x00);
  221.     }
  222. }
hujiaqi06 发表于 2022-12-29 16:04 | 显示全部楼层
Bowclad 发表于 2023-1-1 17:06 | 显示全部楼层
控制指令是在数据手册里面的吗
您需要登录后才可以回帖 登录 | 注册

本版积分规则

87

主题

1250

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部