找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3793|回复: 2
收起左侧

LCD驱动芯片HT1622 MCU源码

[复制链接]
ID:818158 发表于 2020-9-12 10:40 | 显示全部楼层 |阅读模式
HT1622或HT1621,简单修改一下源文件就可以用了,原创源码。
51hei.png

单片机源程序如下:
  1. #include "LCD.h"
  2. #include "LCD_LIST.h"

  3. #define delay_ns(m) {u8 i;for(i=(m);i>0;i--);}

  4. static u8 lcdImg[MAX_ADDR];
  5. static u8 discnt;
  6.                                                                                                                                  

  7. //-----------硬件驱动部分---------------------------------------------------------------------------------------------
  8. void LCD_en(void)//使能LCD读写许可
  9. {        
  10.         LCD_CS_H;
  11.         LCD_WRITE_H;
  12.         delay_ns(20);
  13.         LCD_CS_L;
  14.         delay_ns(20);
  15. }

  16. void LCD_dis(void)//禁止LCD读写
  17. {
  18.         LCD_WRITE_H;
  19.         LCD_CS_H;
  20.         delay_ns(20);
  21. }
  22. void LCD_Write(u16 data,u8 len)//将data的低len位写入到LCD_DRIVER
  23. {
  24.         for(;len>0;len--)
  25.         {
  26.                 LCD_WRITE_L;
  27.                 delay_ns(5);
  28.                 if(data & (1<<(len-1))){LCD_DATA_H;}else{LCD_DATA_L;}
  29.                 delay_ns(5);
  30.                 LCD_WRITE_H;
  31.                 delay_ns(10);               
  32.         }
  33. }
  34. //------------硬件驱动结束-----------------------------------------------------------------------------------------------

  35. //@@@@@@@@@@@@指令处理部分@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  36. void LCD_command_1(u16 com)
  37. {
  38.         LCD_en();
  39.         LCD_Write(com,12);
  40.         LCD_dis();        
  41. }

  42. void LCD_commands_n(u16 * com,u8 len)
  43. {
  44.         if(len)
  45.         {
  46.                 LCD_en();
  47.                 LCD_Write(4,3);
  48.                 for(;len > 0;len--,com++)
  49.                 {
  50.                         LCD_Write(*com,9);
  51.                 }
  52.                 LCD_dis();
  53.         }
  54. }

  55. //@@@@@@@@@@@@指令处理结束@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

  56. //############数据发送部分################################################################################################
  57. void LCD_Write_Data(u16 addr,u8 dt)
  58. {
  59.         LCD_en();
  60.         LCD_Write(5,3);
  61.         LCD_Write(addr,6);
  62.         LCD_Write((u16)(dt),4);
  63.         LCD_dis();        
  64. }

  65. void LCD_Write_Datas(u16 addr,u8 *dt,u8 len)
  66. {
  67.         if(len)
  68.         {
  69.                 LCD_en();
  70.                 LCD_Write(5,3);
  71.                 LCD_Write(addr,6);
  72.                 for(;len > 0;len--,dt++)
  73.                         {
  74.                                 LCD_Write((u16)(*dt),4);
  75.                         }
  76.                 LCD_dis();
  77.         }        
  78. }

  79. void LCD_Flush(u8 init)
  80. {
  81.         u8 copyImg[MAX_ADDR],cnt;
  82.         if(init && discnt == 0){LCD_init(1,0);}
  83.         if( discnt++ >= 10) discnt = 0;
  84.         if( discnt < 5 )
  85.         {
  86.                 LCD_Write_Datas(0,lcdImg,MAX_ADDR);
  87.         }
  88.         else
  89.         {
  90.                 for(cnt=0;cnt<MAX_ADDR;cnt++)
  91.                 {
  92.                         copyImg[cnt] = lcdImg[cnt] & (~(lcdImg[cnt]>>4));
  93.                 }
  94.                 LCD_Write_Datas(0,copyImg,MAX_ADDR);
  95.         }
  96. }

  97. //############数据发送结束################################################################################################

  98. //------------LCD启动、关闭-----------------------------------------------------------------------------------------------
  99. void LCD_init(u8 fastinit,u8 whethclear)
  100. {
  101. #ifdef HT1621_LCD_DRIVER
  102.         u16 coms[] = {LCD_RC_256K,LCD_SYS_EN,LCD_BIAS_3_4,LCD_TNORMAL,LCD_LCD_ON};//
  103. #endif
  104. #ifdef HT1622_LCD_DRIVER
  105.         u16 coms[] = {LCD_RC_32K,LCD_SYS_EN,LCD_TNORMAL,LCD_LCD_ON};//LCD_RC_32K和LCD_TNORMAL是默认值
  106. #endif
  107.         if(fastinit)
  108.         {
  109.                 LCD_commands_n(coms,sizeof(coms)/sizeof(coms[0]));
  110.         }
  111.         else
  112.         {
  113. #ifdef HT1621_LCD_DRIVER
  114.                 LCD_command_1(LCD_RC_256K);
  115.                 LCD_command_1(LCD_SYS_EN);
  116.                 LCD_command_1(LCD_BIAS_3_4);
  117.                 LCD_command_1(LCD_TNORMAL);
  118.                 LCD_command_1(LCD_LCD_ON);
  119. #endif
  120. #ifdef HT1622_LCD_DRIVER
  121.                 LCD_command_1(LCD_RC_32K);
  122.                 LCD_command_1(LCD_SYS_EN);
  123.                 LCD_command_1(LCD_TNORMAL);
  124.                 LCD_command_1(LCD_LCD_ON);
  125. #endif
  126.         }
  127.         if(whethclear)        LCD_clear_all();
  128. }

  129. void LCD_off(void)
  130. {
  131.         u16 coms[] = {LCD_SYS_DIS,LCD_SYS_DIS};
  132.         LCD_commands_n(coms,sizeof(coms)/sizeof(coms[0]));
  133.         LCD_BKG_OFF();
  134. }

  135. void LCD_clear_all(void)
  136. {
  137.         u8 i;
  138.   discnt = 0;
  139.         for(i=0;i<MAX_ADDR;i++) lcdImg[i] = 0x00;
  140.         LCD_Write_Datas(0,lcdImg,MAX_ADDR);
  141. }

  142. void LCD_dis_all(void)
  143. {
  144.         u8 i;
  145.   discnt = 0;
  146.         for(i=0;i<MAX_ADDR;i++) lcdImg[i] = 0x0F;
  147.         LCD_Write_Datas(0,lcdImg,MAX_ADDR);
  148. }

  149. void LCD_flash_all(void)
  150. {
  151.         u8 i;
  152.   discnt = 0;
  153.         for(i=0;i<MAX_ADDR;i++) lcdImg[i] = 0xFF;
  154.         LCD_Write_Datas(0,lcdImg,MAX_ADDR);
  155. }

  156. //------------LCD启动关闭处理结束-----------------------------------------------------------------------------------------

  157. //$局部处理部分$
  158. void mark_dis(u8 addr_v,u8 addr_h,enum MARK_DIS_OPTION type)
  159. {
  160. #ifdef HT1621_LCD_DRIVER
  161.         addr_h &= 0x0F;addr_v &= 0x1F;
  162. #endif
  163. #ifdef HT1622_LCD_DRIVER
  164.         addr_h &= 0x0F;addr_v &= 0x3F;
  165. #endif
  166.         if      (type == MARK_ON  )       {lcdImg[addr_v] |= addr_h;   lcdImg[addr_v]  &= (((~addr_h) << 4) | 0x0F);}
  167.         else if (type == MARK_OFF )       {lcdImg[addr_v] &= ~addr_h;  lcdImg[addr_v]  &= (((~addr_h) << 4) | 0x0F);}
  168.         else                                                                                                {lcdImg[addr_v] |= addr_h;   lcdImg[addr_v]  |= ((addr_h << 4)    & 0xF0);}
  169. }

  170. void seg_clear_bits(u8 addr_seg,u8 clear_bis)
  171. {
  172. #ifdef HT1621_LCD_DRIVER
  173.         clear_bis &= 0x0F;addr_seg &= 0x1F;
  174. #endif
  175. #ifdef HT1622_LCD_DRIVER
  176.         clear_bis &= 0x0F;addr_seg &= 0x3F;
  177. #endif
  178.         lcdImg[addr_seg]  &= ~clear_bis;
  179.         lcdImg[addr_seg]  &= (((~clear_bis) << 4) | 0x0F);
  180. }

  181. void seg_clear(u8 addr_seg)
  182. {
  183. #ifdef HT1621_LCD_DRIVER
  184.         addr_seg &= 0x1F;
  185. #endif
  186. #ifdef HT1622_LCD_DRIVER
  187.         addr_seg &= 0x3F;
  188. #endif
  189.         lcdImg[addr_seg]  = 0x00;
  190. }

  191. void dis_mark_out(u8 outX,enum MARK_DIS_OPTION type)
  192. {
  193.         switch (outX)
  194.         {
  195. #ifdef HT1621_LCD_DRIVER
  196.                 case 1 : mark_dis(2,1,type);break;
  197.                 case 2 : mark_dis(4,1,type);break;
  198.                 case 3 : mark_dis(4,8,type);break;
  199.                 case 4 : mark_dis(4,4,type);break;
  200.                 case 5 : mark_dis(4,2,type);break;
  201.                 case 6 : mark_dis(7,2,type);break;
  202.                 case 7 : mark_dis(7,4,type);break;
  203.                 case 8 : mark_dis(7,8,type);break;
  204.                 case 9 : mark_dis(7,1,type);break;
  205.                 case 10: mark_dis(10,1,type);break;
  206.                 case 11: mark_dis(10,8,type);break;
  207.                 case 12: mark_dis(10,4,type);break;
  208.                 case 13: mark_dis(10,2,type);break;
  209.                 case 14: mark_dis(13,2,type);break;
  210.                 case 15: mark_dis(13,4,type);break;
  211.                 case 16: mark_dis(13,8,type);break;
  212.                 case 17: mark_dis(13,1,type);break;
  213.                 case 18: mark_dis(17,1,type);break;
  214. #endif
  215. #ifdef HT1622_LCD_DRIVER
  216.                 case 1 : mark_dis(8,4,type);break;
  217.                 case 2 : mark_dis(8,2,type);break;
  218.                 case 3 : mark_dis(8,1,type);break;
  219.                 case 4 : mark_dis(9,8,type);break;
  220.                 case 5 : mark_dis(9,4,type);break;
  221.                 case 6 : mark_dis(9,2,type);break;
  222.                 case 7 : mark_dis(11,1,type);break;
  223.                 case 8 : mark_dis(11,2,type);break;
  224.                 case 9 : mark_dis(11,4,type);break;
  225.                 case 10: mark_dis(11,8,type);break;
  226.                 case 11: mark_dis(10,1,type);break;
  227.                 case 12: mark_dis(10,2,type);break;
  228.                 case 13: mark_dis(10,4,type);break;
  229.                 case 14: mark_dis(10,8,type);break;
  230.                 case 15: mark_dis(14,8,type);break;
  231.                 case 16: mark_dis(14,2,type);break;
  232.                 case 17: mark_dis(15,8,type);break;
  233.                 case 18: mark_dis(15,1,type);break;
  234.                 case 19: mark_dis(6,4,type);break;
  235.                 case 20: mark_dis(6,2,type);break;
  236.                 case 21: mark_dis(6,1,type);break;
  237.                 case 22: mark_dis(7,8,type);break;
  238.                 case 23: mark_dis(7,4,type);break;
  239.                 case 24: mark_dis(7,2,type);break;
  240.                 case 25: mark_dis(13,1,type);break;
  241.                 case 26: mark_dis(13,2,type);break;
  242.                 case 27: mark_dis(13,4,type);break;
  243.                 case 28: mark_dis(13,8,type);break;
  244.                 case 29: mark_dis(12,1,type);break;
  245.                 case 30: mark_dis(12,2,type);break;
  246.                 case 31: mark_dis(12,4,type);break;
  247.                 case 32: mark_dis(12,8,type);break;
  248.                 case 33: mark_dis(14,4,type);break;
  249.                 case 34: mark_dis(14,1,type);break;
  250.                 case 35: mark_dis(15,4,type);break;
  251.                 case 36: mark_dis(15,2,type);break;
  252. #endif
  253.                 default: break;
  254.         }
  255. }

  256. void dis_mark_setTitle(u8 setTitleX,enum MARK_DIS_OPTION type)
  257. {
  258.         switch (setTitleX)
  259.         {
  260. #ifdef HT1621_LCD_DRIVER
  261.                 case 1 : mark_dis(1,8,type);break;  //CT变比
  262.                 case 2 : mark_dis(1,4,type);break;  //保护设置
  263.                 case 3 : mark_dis(1,2,type);break;  //目标cos@
  264.                 case 4 : mark_dis(1,1,type);break;  //投切门限
  265.                 case 5 : mark_dis(0,1,type);break;  //控制延时
  266.                 case 6 : mark_dis(0,2,type);break;  //投切方式
  267.                 case 7 : mark_dis(0,4,type);break;  //电容配置
  268.                 case 8 : mark_dis(0,8,type);break;  //通信参数
  269. #endif
  270. #ifdef HT1622_LCD_DRIVER
  271.                 case 1 : mark_dis(1,1,type);break;  //CT变比
  272.                 case 2 : mark_dis(1,2,type);break;  //保护设置
  273.                 case 3 : mark_dis(1,4,type);break;  //目标cos@
  274.                 case 4 : mark_dis(1,8,type);break;  //投切门限
  275.                 case 5 : mark_dis(0,1,type);break;  //控制延时
  276.                 case 6 : mark_dis(0,2,type);break;  //投切方式
  277.                 case 7 : mark_dis(0,4,type);break;  //电容配置
  278.                 case 8 : mark_dis(0,8,type);break;  //通信参数
  279. #endif
  280.                 default: break;
  281.         }
  282. }

  283. void dis_mark_whichPhase(u8 whichPhase,enum MARK_DIS_OPTION type)
  284. {
  285.         switch (whichPhase)
  286.         {
  287. #ifdef HT1621_LCD_DRIVER
  288.                 case 1 : mark_dis(5,1,type);break;   //A相
  289.                 case 2 : mark_dis(11,1,type);break;  //B相
  290.                 case 3 : mark_dis(16,1,type);break;  //C相
  291.                 case 4 : mark_dis(24,8,type);break;  //三相
  292. #endif
  293. #ifdef HT1622_LCD_DRIVER
  294.                 case 1 : mark_dis(2,1,type);break;   //A相
  295.                 case 2 : mark_dis(3,8,type);break;   //B相
  296.                 case 3 : mark_dis(3,4,type);break;   //C相
  297.                 case 4 : mark_dis(3,2,type);break;  //三相
  298. #endif
  299.                 default: break;
  300.         }
  301. }

  302. void dis_mark_updown(u8 updown,enum MARK_DIS_OPTION type)
  303. {
  304.         switch (updown)
  305.         {
  306. #ifdef HT1621_LCD_DRIVER
  307.                 case 1 : mark_dis(2,4,type);break;  //up
  308.                 case 2 : mark_dis(2,2,type);break;  //down
  309. #endif
  310. #ifdef HT1622_LCD_DRIVER
  311.                 case 1 : mark_dis(8,8,type);break;  //up
  312.                 case 2 : mark_dis(6,8,type);break;  //down
  313. #endif
  314.                 default: break;
  315.         }
  316. }

  317. void dis_mark_alarm(enum MARK_DIS_OPTION type)
  318. {
  319. #ifdef HT1621_LCD_DRIVER
  320.         mark_dis(28,8,type); //报警符号
  321. #endif
  322. #ifdef HT1622_LCD_DRIVER
  323.         mark_dis(3,1,type); //报警符号
  324. #endif        
  325. }

  326. void dis_mark_manual(enum MARK_DIS_OPTION type)
  327. {
  328. #ifdef HT1621_LCD_DRIVER
  329.         mark_dis(2,8,type);  //手动控制
  330. #endif
  331. #ifdef HT1622_LCD_DRIVER
  332.         mark_dis(2,4,type);  //手动控制
  333. #endif
  334. }

  335. void dis_mark_objects(u8 object,enum MARK_DIS_OPTION type)
  336. {
  337.         switch (object)
  338.         {
  339. #ifdef HT1621_LCD_DRIVER
  340.                 case 1 : mark_dis(3,2,type);break;   //cos@/电流、A
  341.                 case 2 : mark_dis(3,4,type);break;   //有功、kW/无功、kVar/频率、Hz
  342.                 case 3 : mark_dis(3,1,type);break;   //电压、V
  343.                 case 4 : mark_dis(3,8,type);break;   //THDu、%/THDi、%/温度、℃
  344. #endif
  345. #ifdef HT1622_LCD_DRIVER
  346.                 case 1 : mark_dis(2,2,type);break;    //cos@
  347.                 case 2 : mark_dis(5,4,type);break;   //电压、V
  348.                 case 3 : mark_dis(4,2,type);break;   //电流、A
  349.                 case 4 : mark_dis(5,1,type);break;   //有功、kW
  350.     case 5 : mark_dis(5,8,type);break;   //无功、kVar
  351.                 case 6 : mark_dis(4,4,type);break;   //频率、Hz
  352.                 case 7 : mark_dis(5,2,type);break;   //THDu、%
  353.                 case 8 : mark_dis(4,1,type);break;   //THDi、%
  354.                 case 9 : mark_dis(4,8,type);break;   //温度、℃
  355. #endif
  356.                 default: break;
  357.         }
  358. }

  359. void clear_led(u8 ledNO)
  360. {
  361. #ifdef HT1621_LCD_DRIVER
  362.         dis_led(ledNO,255,0);//不能清除小数点
  363.         if(ledNO == 1)
  364.         {
  365.                 mark_dis(8,1,MARK_OFF);
  366.         }
  367.         else if(ledNO == 3)
  368.         {
  369.                 mark_dis(14,1,MARK_OFF);
  370.         }
  371.         else if(ledNO == 5)
  372.         {
  373.                 mark_dis(19,1,MARK_OFF);
  374.         }
  375.         else if(ledNO == 7)
  376.         {
  377.                 mark_dis(22,1,MARK_OFF);
  378.         }
  379.         else if(ledNO == 9)
  380.         {
  381.                 mark_dis(26,8,MARK_OFF);
  382.         }
  383.         else if(ledNO == 11)
  384.         {
  385.                 mark_dis(30,8,MARK_OFF);
  386.         }
  387.         else
  388.         {
  389.         }
  390. #endif
  391. #ifdef HT1622_LCD_DRIVER
  392.         u8 i;
  393. ……………………

  394. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
LCD.rar (5.85 KB, 下载次数: 132)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:774219 发表于 2021-8-16 10:19 | 显示全部楼层
请问sys.h的头文件是什么
回复

使用道具 举报

ID:863650 发表于 2022-5-19 22:23 | 显示全部楼层
内容不错,因为TM1622和HT1622是相互兼容,所以两款都可以借鉴
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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