LCD驱动芯片HT1622 MCU源码

发布者:快乐行者最新更新时间:2020-09-14 来源: 51hei关键字:LCD  驱动芯片  HT1622  MCU 手机看文章 扫描二维码
随时随地手机看文章

单片机源程序如下:

#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                {

                        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        LCD_Write_Datas(0,lcdImg,MAX_ADDR);

}


void LCD_dis_all(void)

{

        u8 i;

  discnt = 0;

        for(i=0;i        LCD_Write_Datas(0,lcdImg,MAX_ADDR);

}


void LCD_flash_all(void)

{

        u8 i;

  discnt = 0;

        for(i=0;i        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;

[1] [2] [3]
关键字:LCD  驱动芯片  HT1622  MCU 引用地址:LCD驱动芯片HT1622 MCU源码

上一篇:基于AT89S52单片机的电子密码锁
下一篇:单片机模拟空调温度控制器,按键设定温度和控制风力

推荐阅读最新更新时间:2024-11-17 08:53

单片机系统的三相桥式全控整流电路
多单片机直流电源控制系统的变流主电路是三相桥式全控 整流电路 ,整流变压器一次侧控制保护器件有继电器、控制开关、熔断器、电源指示灯等,一次侧接380 V 交流电源。变压器二次侧作为三相桥式全控整流电路供电电源,主电路中有六个晶闸管。
[电源管理]
多<font color='red'>单片机</font>系统的三相桥式全控整流电路
Infineon汽车照明低成本通用单片机方案
【方案应用场景描述】: 随着当今社会的发展,汽车已成为人们生活中必不可少的交通工具,所以其安全问题也受到极大的关注。其中车尾灯扮演了重要的角色,是汽车安全必不可少的重要环节。它的存在极大的减少了交通事故的发生。汽车尾灯的实际价值不可估量,而如何设计实现汽车尾灯的各种功能,则是汽车尾灯控制电路的设计目的,现在汽车尾灯的设计也是花样百出,不仅是外观上的多变,而且功能上也是有了很大的提高。实现汽车尾灯控制电路的功能,可以采取很多不同的方案,今天我们来一起看看基于 CK8CKIT-044 的评估方案。 【方案特色】: CK8CKIT-044 是基于 Cypress PSoC4200M 系列芯片的评估板, PSoC4200M
[汽车电子]
Infineon汽车照明低成本通用<font color='red'>单片机</font>方案
改善8051系统用电效率的微控制器
摘要:一种改进架构的高性能8051设计、外围功能集成、选用合适的时钟源以降低功耗;并介绍节省电能的软件技术及采用待机模式降低功耗的技巧。 关键词:停机模式 空闲模式 功率管理模式 便携式产品的功能和性能日新月异。 消费者对产品性能的要求也越来越高,需要更强大的运算能力支持;另一方面,希望产品具有更低的功耗。 尽管已经出现了很多功耗处理器,但它们的性能通常很有限。Dallas公司的系列高速微控制器在性能和功耗之间取得了一个很好的折衷,采用了8051架构——世界上最流行的微控制器之一。简单易用、丰富的I/O资源使这种微控制器深受设计者的喜爱,并被广泛接受。它的流行势头已蔓延到了便携式领域,在很多应用中都有其用武之地。 本文
[应用]
技术科:你知道51单片机如何存储程序吗
MCS-51使用哈弗结构,它的程序空间和数据空间是分开编址的,即各自有各自的地址空间,互不重叠。所以即使地址一样,但因为分开编址,所以依然要说哪一个空间内的某地址。而ARM(甚至是x86)这种冯诺依曼结构的MCU/CPU,它的地址空间是统一并且连续的,代码存储器/RAM/CPU寄存器,甚至PC机的显存,都是统一编址的,只是不同功能的存储器占据不同的地址块,各自为政。 好,说回MCS-51。 对于程序存储器,有片内和片外两部分。而且无论片内程序存储器,还是片外程序存储器,他们的地址是共享的。如果片内4k ROM的话,地址就是0x0000-0x0FFF,从0x1000-0xFFFF就是外部ROM的地址空间。可外部ROM的0x0
[单片机]
技术科:你知道51<font color='red'>单片机</font>如何存储程序吗
从零开始学单片机(五)A/D转化
所谓A/D转换器就是模拟/数字转换器(Analog to Digital Converter 简称ADC)是将输入的模拟信号转换成为数字信号。这里我们用ADC0804做这个试验,下面的图示它的引脚图。 /CS:芯片选择信号。 VREF:辅助参考电压。 /WR:用来启动转换的控制,当/WR自1变为0时,转换器被清除;当/WR回到1时,转换正式启动。 /RD:外部读取转换结果的控制脚输出信号。 /INTR:中断请求信号输出,低电平动。 AGND,DGND:模拟信号以及数字信号接地。 CLK IN,CLK R:时钟输入或接振荡元件(R,C),频率约限制在100KHz~1460KHz。 VIN(+),VIN(-):差动模拟电压输入。输入
[单片机]
从零开始学<font color='red'>单片机</font>(五)A/D转化
智能化STM32 F7微控制器如何满足嵌入式系统更高处理性能需求
意法半导体(ST)推出业界首款基于ARM最新Cortex-M7内核的STM32 F7系列微控制器,其性能远超ST之前的32位STM32F4微控制器,通过无缝升级路径可将处理性能和DSP性能提高一倍。 “作为STM32微控制器产品家族的高端产品,STM32 F7使内存和外存的性能达到一个新的水平,给开发人员带来新的创新机会,保证他们不需要再根据存储器性能调整代码。”ST微控制器市场总监Daniel Colonna表示,“而之所以能够在业内率先推出基于Cortex-M7的产品,首先得益于ST与ARM密切的合作关系。其次,ST也与第三方客户保持着广泛的合作,确保他们能够及时得到ARM最新的技术支持并推出新产品。强大的开发生态系统结合多元
[单片机]
智能化STM32 F7<font color='red'>微控制器</font>如何满足嵌入式系统更高处理性能需求
单片机软件IAP策略
在开发阶段,通常采用ICP或者ISP的方式更新单片机软件,例如在stm32系列MCU上不仅可以更新程序,而且还能够调试实时观测内存数据、外设状态和全局变量以及单步运行、设置断点等。 但是当产品发布以后,这种单片机或者微控系统被嵌入某个对象系统中,很难采用ICP方式进行单片机程序更新;因此需要一种仅通过uart、can、eth等通信接口就可以实现单片机程序更新的技术,IAP便是其中一种; IAP全称In Application programmer即在应用编程。IAP技术将程序存储器分为若干区域,其中一种是IAP+APP区域,APP用来存储正常工作的程序,IAP用来存储通过通信接口修改APP区域的程序; 本文还是以stm32为例,介
[单片机]
单片机模拟I2C总线控制EEPROM读写程序
之前写的EEPROM程序虽然能够软仿成功,但烧到单片机里的时候却不能用,无疑是时序的问题,今天修正了时序,总算硬仿成功了。对照上次的程序可以发现就是添加了头函数: intrins.h ,这样就可以通过 _nop_() 指令较为准确的控制时序。 上次那个问题依然没有解决:就是接收缓冲区的数据是从readbuf 开始的,以这个程序为例: readbuf 中存放0x96 readbuf 中存放0x84 readbuf 中存放0xd5 readbuf 中存放0x63 readbuf 中存放0x7c readbuf 中存放0x8c 其实我是想把收到的数据存放在readbuf ~ 中的,我也不知道为什么结果会这样,有知道的麻烦指教
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved