HT1622或HT1621,简单修改一下源文件就可以用了,原创源码。
单片机源程序如下:
- #include "LCD.h"
- #include "LCD_LIST.h"
- #define delay_ns(m) {u8 i;for(i=(m);i>0;i--);}
- static u8 lcdImg[MAX_ADDR];
- static u8 discnt;
-
- //-----------硬件驱动部分---------------------------------------------------------------------------------------------
- void LCD_en(void)//使能LCD读写许可
- {
- LCD_CS_H;
- LCD_WRITE_H;
- delay_ns(20);
- LCD_CS_L;
- delay_ns(20);
- }
- void LCD_dis(void)//禁止LCD读写
- {
- LCD_WRITE_H;
- LCD_CS_H;
- delay_ns(20);
- }
- void LCD_Write(u16 data,u8 len)//将data的低len位写入到LCD_DRIVER
- {
- for(;len>0;len--)
- {
- LCD_WRITE_L;
- delay_ns(5);
- if(data & (1<<(len-1))){LCD_DATA_H;}else{LCD_DATA_L;}
- delay_ns(5);
- LCD_WRITE_H;
- delay_ns(10);
- }
- }
- //------------硬件驱动结束-----------------------------------------------------------------------------------------------
- //@@@@@@@@@@@@指令处理部分@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
- void LCD_command_1(u16 com)
- {
- LCD_en();
- LCD_Write(com,12);
- LCD_dis();
- }
- void LCD_commands_n(u16 * com,u8 len)
- {
- if(len)
- {
- LCD_en();
- LCD_Write(4,3);
- for(;len > 0;len--,com++)
- {
- LCD_Write(*com,9);
- }
- LCD_dis();
- }
- }
- //@@@@@@@@@@@@指令处理结束@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
- //############数据发送部分################################################################################################
- void LCD_Write_Data(u16 addr,u8 dt)
- {
- LCD_en();
- LCD_Write(5,3);
- LCD_Write(addr,6);
- LCD_Write((u16)(dt),4);
- LCD_dis();
- }
- void LCD_Write_Datas(u16 addr,u8 *dt,u8 len)
- {
- if(len)
- {
- LCD_en();
- LCD_Write(5,3);
- LCD_Write(addr,6);
- for(;len > 0;len--,dt++)
- {
- LCD_Write((u16)(*dt),4);
- }
- LCD_dis();
- }
- }
- void LCD_Flush(u8 init)
- {
- u8 copyImg[MAX_ADDR],cnt;
- if(init && discnt == 0){LCD_init(1,0);}
- if( discnt++ >= 10) discnt = 0;
- if( discnt < 5 )
- {
- LCD_Write_Datas(0,lcdImg,MAX_ADDR);
- }
- else
- {
- for(cnt=0;cnt<MAX_ADDR;cnt++)
- {
- copyImg[cnt] = lcdImg[cnt] & (~(lcdImg[cnt]>>4));
- }
- LCD_Write_Datas(0,copyImg,MAX_ADDR);
- }
- }
- //############数据发送结束################################################################################################
- //------------LCD启动、关闭-----------------------------------------------------------------------------------------------
- void LCD_init(u8 fastinit,u8 whethclear)
- {
- #ifdef HT1621_LCD_DRIVER
- u16 coms[] = {LCD_RC_256K,LCD_SYS_EN,LCD_BIAS_3_4,LCD_TNORMAL,LCD_LCD_ON};//
- #endif
- #ifdef HT1622_LCD_DRIVER
- u16 coms[] = {LCD_RC_32K,LCD_SYS_EN,LCD_TNORMAL,LCD_LCD_ON};//LCD_RC_32K和LCD_TNORMAL是默认值
- #endif
- if(fastinit)
- {
- LCD_commands_n(coms,sizeof(coms)/sizeof(coms[0]));
- }
- else
- {
- #ifdef HT1621_LCD_DRIVER
- LCD_command_1(LCD_RC_256K);
- LCD_command_1(LCD_SYS_EN);
- LCD_command_1(LCD_BIAS_3_4);
- LCD_command_1(LCD_TNORMAL);
- LCD_command_1(LCD_LCD_ON);
- #endif
- #ifdef HT1622_LCD_DRIVER
- LCD_command_1(LCD_RC_32K);
- LCD_command_1(LCD_SYS_EN);
- LCD_command_1(LCD_TNORMAL);
- LCD_command_1(LCD_LCD_ON);
- #endif
- }
- if(whethclear) LCD_clear_all();
- }
- void LCD_off(void)
- {
- u16 coms[] = {LCD_SYS_DIS,LCD_SYS_DIS};
- LCD_commands_n(coms,sizeof(coms)/sizeof(coms[0]));
- LCD_BKG_OFF();
- }
- void LCD_clear_all(void)
- {
- u8 i;
- discnt = 0;
- for(i=0;i<MAX_ADDR;i++) lcdImg[i] = 0x00;
- LCD_Write_Datas(0,lcdImg,MAX_ADDR);
- }
- void LCD_dis_all(void)
- {
- u8 i;
- discnt = 0;
- for(i=0;i<MAX_ADDR;i++) lcdImg[i] = 0x0F;
- LCD_Write_Datas(0,lcdImg,MAX_ADDR);
- }
- void LCD_flash_all(void)
- {
- u8 i;
- discnt = 0;
- for(i=0;i<MAX_ADDR;i++) lcdImg[i] = 0xFF;
- LCD_Write_Datas(0,lcdImg,MAX_ADDR);
- }
- //------------LCD启动关闭处理结束-----------------------------------------------------------------------------------------
- //$局部处理部分$
- void mark_dis(u8 addr_v,u8 addr_h,enum MARK_DIS_OPTION type)
- {
- #ifdef HT1621_LCD_DRIVER
- addr_h &= 0x0F;addr_v &= 0x1F;
- #endif
- #ifdef HT1622_LCD_DRIVER
- addr_h &= 0x0F;addr_v &= 0x3F;
- #endif
- if (type == MARK_ON ) {lcdImg[addr_v] |= addr_h; lcdImg[addr_v] &= (((~addr_h) << 4) | 0x0F);}
- else if (type == MARK_OFF ) {lcdImg[addr_v] &= ~addr_h; lcdImg[addr_v] &= (((~addr_h) << 4) | 0x0F);}
- else {lcdImg[addr_v] |= addr_h; lcdImg[addr_v] |= ((addr_h << 4) & 0xF0);}
- }
- void seg_clear_bits(u8 addr_seg,u8 clear_bis)
- {
- #ifdef HT1621_LCD_DRIVER
- clear_bis &= 0x0F;addr_seg &= 0x1F;
- #endif
- #ifdef HT1622_LCD_DRIVER
- clear_bis &= 0x0F;addr_seg &= 0x3F;
- #endif
- lcdImg[addr_seg] &= ~clear_bis;
- lcdImg[addr_seg] &= (((~clear_bis) << 4) | 0x0F);
- }
- void seg_clear(u8 addr_seg)
- {
- #ifdef HT1621_LCD_DRIVER
- addr_seg &= 0x1F;
- #endif
- #ifdef HT1622_LCD_DRIVER
- addr_seg &= 0x3F;
- #endif
- lcdImg[addr_seg] = 0x00;
- }
- void dis_mark_out(u8 outX,enum MARK_DIS_OPTION type)
- {
- switch (outX)
- {
- #ifdef HT1621_LCD_DRIVER
- case 1 : mark_dis(2,1,type);break;
- case 2 : mark_dis(4,1,type);break;
- case 3 : mark_dis(4,8,type);break;
- case 4 : mark_dis(4,4,type);break;
- case 5 : mark_dis(4,2,type);break;
- case 6 : mark_dis(7,2,type);break;
- case 7 : mark_dis(7,4,type);break;
- case 8 : mark_dis(7,8,type);break;
- case 9 : mark_dis(7,1,type);break;
- case 10: mark_dis(10,1,type);break;
- case 11: mark_dis(10,8,type);break;
- case 12: mark_dis(10,4,type);break;
- case 13: mark_dis(10,2,type);break;
- case 14: mark_dis(13,2,type);break;
- case 15: mark_dis(13,4,type);break;
- case 16: mark_dis(13,8,type);break;
- case 17: mark_dis(13,1,type);break;
- case 18: mark_dis(17,1,type);break;
- #endif
- #ifdef HT1622_LCD_DRIVER
- case 1 : mark_dis(8,4,type);break;
- case 2 : mark_dis(8,2,type);break;
- case 3 : mark_dis(8,1,type);break;
- case 4 : mark_dis(9,8,type);break;
- case 5 : mark_dis(9,4,type);break;
- case 6 : mark_dis(9,2,type);break;
- case 7 : mark_dis(11,1,type);break;
- case 8 : mark_dis(11,2,type);break;
- case 9 : mark_dis(11,4,type);break;
- case 10: mark_dis(11,8,type);break;
- case 11: mark_dis(10,1,type);break;
- case 12: mark_dis(10,2,type);break;
- case 13: mark_dis(10,4,type);break;
- case 14: mark_dis(10,8,type);break;
- case 15: mark_dis(14,8,type);break;
- case 16: mark_dis(14,2,type);break;
- case 17: mark_dis(15,8,type);break;
- case 18: mark_dis(15,1,type);break;
- case 19: mark_dis(6,4,type);break;
- case 20: mark_dis(6,2,type);break;
- case 21: mark_dis(6,1,type);break;
- case 22: mark_dis(7,8,type);break;
- case 23: mark_dis(7,4,type);break;
- case 24: mark_dis(7,2,type);break;
- case 25: mark_dis(13,1,type);break;
- case 26: mark_dis(13,2,type);break;
- case 27: mark_dis(13,4,type);break;
- case 28: mark_dis(13,8,type);break;
- case 29: mark_dis(12,1,type);break;
- case 30: mark_dis(12,2,type);break;
- case 31: mark_dis(12,4,type);break;
- case 32: mark_dis(12,8,type);break;
- case 33: mark_dis(14,4,type);break;
- case 34: mark_dis(14,1,type);break;
- case 35: mark_dis(15,4,type);break;
- case 36: mark_dis(15,2,type);break;
- #endif
- default: break;
- }
- }
- void dis_mark_setTitle(u8 setTitleX,enum MARK_DIS_OPTION type)
- {
- switch (setTitleX)
- {
- #ifdef HT1621_LCD_DRIVER
- case 1 : mark_dis(1,8,type);break; //CT变比
- case 2 : mark_dis(1,4,type);break; //保护设置
- case 3 : mark_dis(1,2,type);break; //目标cos@
- case 4 : mark_dis(1,1,type);break; //投切门限
- case 5 : mark_dis(0,1,type);break; //控制延时
- case 6 : mark_dis(0,2,type);break; //投切方式
- case 7 : mark_dis(0,4,type);break; //电容配置
- case 8 : mark_dis(0,8,type);break; //通信参数
- #endif
- #ifdef HT1622_LCD_DRIVER
- case 1 : mark_dis(1,1,type);break; //CT变比
- case 2 : mark_dis(1,2,type);break; //保护设置
- case 3 : mark_dis(1,4,type);break; //目标cos@
- case 4 : mark_dis(1,8,type);break; //投切门限
- case 5 : mark_dis(0,1,type);break; //控制延时
- case 6 : mark_dis(0,2,type);break; //投切方式
- case 7 : mark_dis(0,4,type);break; //电容配置
- case 8 : mark_dis(0,8,type);break; //通信参数
- #endif
- default: break;
- }
- }
- void dis_mark_whichPhase(u8 whichPhase,enum MARK_DIS_OPTION type)
- {
- switch (whichPhase)
- {
- #ifdef HT1621_LCD_DRIVER
- case 1 : mark_dis(5,1,type);break; //A相
- case 2 : mark_dis(11,1,type);break; //B相
- case 3 : mark_dis(16,1,type);break; //C相
- case 4 : mark_dis(24,8,type);break; //三相
- #endif
- #ifdef HT1622_LCD_DRIVER
- case 1 : mark_dis(2,1,type);break; //A相
- case 2 : mark_dis(3,8,type);break; //B相
- case 3 : mark_dis(3,4,type);break; //C相
- case 4 : mark_dis(3,2,type);break; //三相
- #endif
- default: break;
- }
- }
- void dis_mark_updown(u8 updown,enum MARK_DIS_OPTION type)
- {
- switch (updown)
- {
- #ifdef HT1621_LCD_DRIVER
- case 1 : mark_dis(2,4,type);break; //up
- case 2 : mark_dis(2,2,type);break; //down
- #endif
- #ifdef HT1622_LCD_DRIVER
- case 1 : mark_dis(8,8,type);break; //up
- case 2 : mark_dis(6,8,type);break; //down
- #endif
- default: break;
- }
- }
- void dis_mark_alarm(enum MARK_DIS_OPTION type)
- {
- #ifdef HT1621_LCD_DRIVER
- mark_dis(28,8,type); //报警符号
- #endif
- #ifdef HT1622_LCD_DRIVER
- mark_dis(3,1,type); //报警符号
- #endif
- }
- void dis_mark_manual(enum MARK_DIS_OPTION type)
- {
- #ifdef HT1621_LCD_DRIVER
- mark_dis(2,8,type); //手动控制
- #endif
- #ifdef HT1622_LCD_DRIVER
- mark_dis(2,4,type); //手动控制
- #endif
- }
- void dis_mark_objects(u8 object,enum MARK_DIS_OPTION type)
- {
- switch (object)
- {
- #ifdef HT1621_LCD_DRIVER
- case 1 : mark_dis(3,2,type);break; //cos@/电流、A
- case 2 : mark_dis(3,4,type);break; //有功、kW/无功、kVar/频率、Hz
- case 3 : mark_dis(3,1,type);break; //电压、V
- case 4 : mark_dis(3,8,type);break; //THDu、%/THDi、%/温度、℃
- #endif
- #ifdef HT1622_LCD_DRIVER
- case 1 : mark_dis(2,2,type);break; //cos@
- case 2 : mark_dis(5,4,type);break; //电压、V
- case 3 : mark_dis(4,2,type);break; //电流、A
- case 4 : mark_dis(5,1,type);break; //有功、kW
- case 5 : mark_dis(5,8,type);break; //无功、kVar
- case 6 : mark_dis(4,4,type);break; //频率、Hz
- case 7 : mark_dis(5,2,type);break; //THDu、%
- case 8 : mark_dis(4,1,type);break; //THDi、%
- case 9 : mark_dis(4,8,type);break; //温度、℃
- #endif
- default: break;
- }
- }
- void clear_led(u8 ledNO)
- {
- #ifdef HT1621_LCD_DRIVER
- dis_led(ledNO,255,0);//不能清除小数点
- if(ledNO == 1)
- {
- mark_dis(8,1,MARK_OFF);
- }
- else if(ledNO == 3)
- {
- mark_dis(14,1,MARK_OFF);
- }
- else if(ledNO == 5)
- {
- mark_dis(19,1,MARK_OFF);
- }
- else if(ledNO == 7)
- {
- mark_dis(22,1,MARK_OFF);
- }
- else if(ledNO == 9)
- {
- mark_dis(26,8,MARK_OFF);
- }
- else if(ledNO == 11)
- {
- mark_dis(30,8,MARK_OFF);
- }
- else
- {
- }
- #endif
- #ifdef HT1622_LCD_DRIVER
- u8 i;
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
LCD.rar
(5.85 KB, 下载次数: 135)
|