ATMEAGl6L驱动16x2点阵字符液晶模块的实验

发布者:EnchantedMelody最新更新时间:2018-04-01 来源: eefocus关键字:ATMEAGl6L  驱动  点阵  字符液晶模块 手机看文章 扫描二维码
随时随地手机看文章

  要实现对16x2点阵字符液晶模块的高效控制,必须按照模块设计方式,建立起相关的子程序,下面先详细介绍驱动16x2点阵字符液晶模块的各功能子程序。

  1.写命令到LCM子函数

  vOid LCDWriteCommand(uchar CMD,uchar Attribc)

  /*函数名为WriteCommandLCM的写指令到LCM子函数。

  定义CMD、Attribc 为无符号字符型变量。*/

  {

  if(Attribc)WaitForEnable();

  /*若Arrribc为“真”,则调用WaitForEnable子函数进行忙检测*/

  LCM_RS_0;LCM_RW_0;_NOP0;

  /*选中指令寄存器,写模式*/

  DataPort=CMD;_NOP();

  /*将变量WCLCM中的指令传送至数据口

  LCM_EN_1;_NOP0;_NOP();LCM_EN_O:

  /*LCM_EN端产生脉冲下降沿。*/

  }

  /*WriteCommandLCM 子函数结束。*/

  2,写数据到LCM子函数

  void LcdWritEDAta(dchar dataW)

  /*函数名为WriteDataLCM的写数据到LCM子函数。定义

  dataW 为无符号字符型变量。*/

  {

  /*WriteDataLCM子函数开始。*/

  WaitForEnable();    */

  LCM_RS_1;LCM_RW_0;_NOP0;

  /*选中数据寄存器,写模式。*/

  DataPort=dataW;_NOP();

  /*将变量dataQW中数据传送至数据口。*/

  LCM_EN_1;_NOP();_NOP0;LCM_EN_O:

  /*LCM_EN端产生脉冲下降沿。WriteDataLCM子函数

  结束*/

  3.检测LCD忙信号子函数

  void WaitForEnable(void)

  /*函数名为WaitForEnable的检测忙信号子程序子函数。

  /*WaitForEnable子函数开始。*/

  uchar val;

  /*定义局部变量val。*/

  DataPOrt=Oxff;

  /*置数据口为全1。*/

  LCM_RS_0;LCM_RW_1;_NOP();

  /*选中指令寄存器,读模式。*/

  LCM_EN_1;_NOP();_NOP();

  /*置LCM_EN端为高电平,读使能。*/

  DDRA=0x00;

  /*数据口置为输入*/

  val=PINA:

  /*读取数据*/

  while(val&Busy)val=PINA:

  /*检测忙信号。当数据口内容与0x80相与后不为零时,

  程序原地踏步继续读取数据并检测忙信号。*/

  LCM_EN_O:

  /*置LCM_EN端为低电平。*/

  DDRA=0xff;

  /*数据口置为输出*/

  }

  /*WaitForEnable子函数结束。*/

  4.显示光标定位子函数

  void LOCateXY(char posx.char posy)

  /*显示光标定位子函数,函数名为LocareXY,定义posx,

  posxxy为字符型变量。*/

  {

  /*LocateXY子函数开始。*/

  uchar temp;

  /*定义temp为无符号字符型变量。*/

  temp&=0x7f;

  /*temp的变化范围0-15。*/

  temp=posx&0xof;

  /*屏蔽高4位。*/

  posy&=0x01;

  /*posy的变化范围0-1。*/

  if(posy)tempㄧ=0x40;

  /*若posy为1(显示第二行),地址码+0x40*/

  tempㄧ=0x80;

  /*指令码为地址码+0x80。*/

  WriteCommandLCM(temp,0);

  /*将指令temp写入LCM,忽略忙信号检测。*/

  }

  /*LocateXY子函数结束。*/

  5.显示指定座标的一个字符(x=0~15,y=0~1)子函数

  void DisplayOneChar(uchar x,uchar y,uchar Wdata)

  /*显示指定座标的一个字符(x=0-15.y=0-1)子函数,函

  数名为DispOneChar,定义x、y、Wdata为无符号字符型变量。

  */

  {

  /*DispOneChar函数开始*/

  LocateXY(x,y):

  /*调用LocateXY函数定位显示地址。*/

  WriteDataLCM(Wdata);

  /*将数据Wdata写入LCM。*/

  }

  /*DispONeChar函数结束。*/

  6.演示第二行移动字符串子函数

  void Display(uchar dd)

  /*演示第二行移动字符串子函数,函数名为Dispiay,定义

  dd为无符号字符型变量。*/

  {

  /*Display子函数开始。*/

  uchari:

  /*定义;为无符号字符型变量。*/

  for(i=O;i<16:i++){

  /*进入for语句循环。*/

  DisplayOneChar(i,1,dd++);

  /*显示单个字符。*/

  dd&=Ox7f;

  /*dd的变化范围0-127。*/

  if(dd<32)dd=32:

  /*dd的最小值为32,这样dd的变化范围为32-127。*/

  }

  /*for语句结束。*/

  }

  /*Display函数结束。*/

  7.显示指定座标的一串字符子函数

  void ePutstr(uchar x.uchar v,uchar code *ptr)

  /*显示指定座标的一串字符(x=0-15,y=0-1)子函数,函

  数名为ePutstr,定义x、y为无符号字符型变量,ptr为指向

  code区的无符号字符型指针变量。*/

  {

  /*ePutetr子函数开始。*/

  uchar i,I=O;

  /*定义i,i为无符号字符型变量。*/

  while(ptr[I]>31)(I++;}

  /*ptr[I]大于31时,为ASCII码,进入While语句循环,I累

  加,计算出字符串长度。*/

  for(i=0;i

  /*进入for语句循环。*/

  DisplayOneChar(x++,y,ptr[i]);

  /*显示单个字符,同时x轴座标递增。*/

  if(x==1 6){

  /*若x等于16,进入if语句。*/

  x=O;y^=1;

  /*x赋0,y与1按位异或(取反)。*/

  }

  /*if语句结束。*/

  }

  /*for语句结束。*/

  }

  /*ePutstr子函数结束。*/

  8.在AVR单片机综合试验板上实现16x2LCM演示程序1

  第一行显示“-This is a LCD-!”,第二行的第1个字符位置

  显示“A”。过2秒后变为第一行的第8个字符位置显示“B”,第

  二行显示“-Design by ZXH-!”。然后无限循环。

  在我的文档中新建一个ac18的文件夹。建立一个ac18.prj

  的工程项目,最后建立源程序文件ac18 C。输入下面的程序:

  #include

  /*包含头文件*/

  #include

  /*------------------------------------------*/

  #define uchar unsigned char

  /*变量类型的宏定义*/

  #define uint unsigned int

  /*----------------引脚电平的宏定义----------------*/

  #define LCM_RS_1 PORTBㄧ=BIT(PB0)

  /*RS脚输出高电平的宏定义*/

  #define LCM_RS_0 PORTB&=~BIT(PBO)

  /*RS脚输出低电平的宏定义*/

  #define LCM_RW_1 PORTBㄧ=BIT(PB1)

  /*RW脚输出高电平的宏定义*/

  #define LCM_RW_O PORTB&=~BIT(PB1)

  /*RW脚输出低电平的宏定义*/

  #define LCM_EN_1 PORTBㄧ=BlT(PB2)

  /*EN脚输出高电平的宏定义*/

  #define LCM_EN_0 PORTB&=~BIT(PB2)

  /*EN脚输出低电平的宏定义*/

  /*===============================*/

  #define DataPort PORTA

  /*数据端口宏定义*/

  #define Busy 0x80

  /*忙信号的宏定义*/

  #define xtaI 8

  /*晶振频率宏定义*/

  /*===============================*/

  const uchar str0[]={“-This is a LCD-!”}

  /*待显字符*/

  const uchar str1 []={"-Design by ZXH-!"};

  /*待显示字符串*/

  /*==============函数说明===================*/

  void Delay_1 ms(void);

  void Delay_nms(uint n):

  void WaitFOrEnable(void):

  void LcdWriteData(uchar W):

  void LcdWriteCommand(uchar CMD,uchar Attribc);

  void InitLcd(void);

  void Display(uchar dd):

  void DispIayoneChar(uchar×.uchar y,uchar Wdata);

  void ePutstr(uchar x,uchar y,uchar const*ptr);

  /**********************************************/

  void main(void)

  /*定义主函数*/

  {

  Delay_nms(400);

  /*延时400mS等待电源稳定*/

  DDRA=0xff;PORTA=0x00;

  /*初始化I*O口*/

  DDRB=0xff;PORTB=0x00;

  InitLcd();

  /*LCD初始化*/

  /**************************************/

  while(1)

  /*无限循环*/

  {

  LcdWriteCommand(0x01.1):

  /*清屏*/

  LcdWriteCommand(0xoc,1):

  /*开显示*/

  DisplayOneChar(O,1,0x41):

  /*第二行的第1个字符位置显示A*/

  ePutstr(0.0.str0);

  /*第一行显示-This is a LCD-!*/

  Delay_nms(2000);

  /*延时2S*/

  LcdWriteCommand(0x01.1):

  /*清屏*/

  LcdWriteCommand(0xoc,1):

  /*开显示*/

  DisplayOneChar(8,0,0x42);

  /*第一行的第8个字符位置显示B*/

  ePutstr(0.1,str1):

  /*第二行显示-Design by AXH-!*/

  Delay_nms(2000);

  /*延时2S*/

  }

  }

  /*************显示指定座标的一串字符子函数***************/

  void ePutstr(uchar x,uchar y,uchar const*ptr)

  {

  uchar i.I=0:

  while(ptr[I]>31){I++;)

  for(i=0;i

  DisplayoneChar(x++,Y,pt r[i]);

  if(X==16){

  x=0;y^=1:

  }

  }

  }

  /***************

  void LocateXY(char posx,char posy)

  {

  uchar temp;

  temp&=0x7f;

  temp=posx&0xof;

  posy&=0x01;

  if(posy)templ=0x40;

  templ=0x80;

  LcdWriteCommand(temp,0):

  }

  /**************显示指定座标的一个字符子函数************/

  void DisplayOneChar(uchar X.uchar y,uchar Wdata)

  {

  LocateXY(x,y):

  LcdWriteData(Wdata);

  }

  /**************LCD初始化子函数******************/

  void lnitLcd(void)

  {

  LcdWriteCommand(0x38,O):

  /*8位数据传送,2行显示,5*7字形,不检测忙信号*/

  Delay_nms(5);

  LcdWriteCommand(Ox38,O):

  /*8位数据传送;2行显示,5*7字形,不检测忙信号*/

  Delay_nms(5);

  LcdWriteCommand(0x38.0):

  /*8位数据传送,2行显示,5*7字形,不检测忙信号*/

  Delay_nms(5);

  LcdWriteCommand(0x38,1):

  /*8位数据传送,2行显示,5/7字形、检测忙信号*/

  LcdWriteCommand(0x08,1):

  /*关闭显示,检测忙信号*/

  LcdWriteCommand(0x01,1);

  /*清屏,检测忙信号*/

  LcdWriteCommand(0x06,1):

  /*显示光标右移设置,检测忙信号*/

  LcdWriteCommand(0xoc,1):

  /*显示屏打开,光标不显示、不闪烁,检测忙信号*/

  }

  /****************写命令到LCM子函数*******************/

  void LcdWfiteCommand(uchar CMD,uchar Attribc)

  {

  if(Attribc)WaitForEnable():

  LCM_RS_0;LCM_RW_0;_NOP();

  DataPort=CMD;_NOP();

  LCM_EN_1;_NOP0;_NOP();LCM_EN_O;

  }

  /***************写数据到LCM子函数***************/

  void LEDWriteData(uchar dataW)

  {

  WaitF0rEnable();

  LCM_RS_1;LCM_RW_O;_NOP();

  DataPort=dataW;_NOP();

  LCM_EN_1:_NOP();_NOP();LCM_EN_0;

  }

  /************检测LCD忙忙信号子函数**************/

  void WaitFOrEnable(vOid)

  {

  uchar val;

  DataPort=0xff;

  LCM_RS_0;LCM_RW_1;_NOP();

  LCM_EN_1:_NOP0;_NOP();

  DDRA=0x00;

  vaI=PINA;

  while(val&Busy)val=PINA;

  LCM_EN_O;

  DDRA=0xff;

  }

  /************************************************/

  void Delay_1 ms(void)

  /*1mS延时子函数*/

  { uint i;

  for(i=1;i<(uint)(xtal*143-2):i++)

  }

  /*==========================*/

  void Delay_nms(uint n)

  /*n*1mS延时子函数*/

  {

  uint i=0:

  while(i

  {Delay_1 ms();

  i++:

  }

  }

  编译通过后,将ac18.hex文件下载到AVR单片机综合试验板上进行实际演示。标示“LCD16*2”的单排座上正确插上16x2液晶模块(脚号对应,不能插反),在标示“DC5V”电源端输入5V稳压电压。我们看到液晶屏上的显示与我们设计的目标完全一致。

  9.在AVR单片机综合试验板上实现16x2LCM演示程序--2一开始第一行及第二行显示预定的字符串(第一行显示“--ELECTRONICS--”,第二行显示“WORLDMAgazine”),随后第二行显示移动的ASCII字符。

  在我的文档中新建一个acl9的文件夹。建立一个acl9.pri的工程项目,最后建立源程序文件ac19.C。输入下面的程序:

  #include

  #include

  /*---------------------------------*/

  #define uchar unsigned char

  #define uint unsigned int

  #define LCM_RS_1 PORTBI=BlT(P80)

  #define LCM_RS_O PORTB&=~BIT(PB0)

  #define LCM_RW_1 PORTBI=BIT(PBl)

  #define LCM_RW_0 PORTB&=~BlT(PBl)

  #define LCM_EN_1 PORTBl=BlT(PB2)

  #define LCM_EN_O PORTB&=~BIT(PB2)

  #define DataPort PORTA

  #define Busy 0x80

  #define xtal 8

  /*-----------------------------*/

  const uchar exampl[]=“--ELECTRONlCS--WORLD

  magazine\n”;

  void Delay_1 ms(void);

  void Delay_nms(uint n);

  void WaitFOrEnabIe(void):

  void LcdWmeData(uchar W):

  void LcdWriteCommand(uchar CMD,uchar Attribc);

  void InitLcd(void);

  void Display(uchar dd):

  void DlsplayoneChar(uchar×,uchar y,uchar Wdata);

  void ePutstr(uchar x,uchar y,uchar const*ptr);

  /******************************************/

  void main(void)

  {

  uchar temp;

  Delay_nms(400);

  DD RA:0xff:PO RTA=0x00;

  DDRB=0xff:PORTB=0x00;

  InitLcd();

  temp=32;

  ePutstr(0,0,exampl);

  Delay_nms(3200);

  while(1)

  {

  temp&=0x7f;

  if(temp<32)temp=32;

  Display(temp++);

  Delay_nms(400);

  }

  }

  /*********************************/


关键字:ATMEAGl6L  驱动  点阵  字符液晶模块 引用地址:ATMEAGl6L驱动16x2点阵字符液晶模块的实验

上一篇:基于单片机与CPLD的混合式步进电机PWM驱动技术
下一篇:采用ATmega8控制器的倾角测量系统设计

推荐阅读最新更新时间:2024-03-16 15:58

能用直流信号驱动LED的简单PWM调制器电路
利用可变占空比(脉宽调制或PWM)的方法,可实现LED驱动电路的调光。PWM方法可充分利用LED的功能,因为电流越大,特定功耗(温度)水平下的LED光输出就越大。因此,在LED两端施加PWM电流后,其输出的平均功耗与采用直流控制方法所产生的平均功耗相当,但工作电流更大,光输出更高。 即使可用的控制信号是直流信号,也可以用性能可预测且具良好线性的简单电路实施PWM控制。这个电路由一个双路比较器和一些外部元件组成,采用0~5V控制信号产生500Hz PWM信号,非线性度为2%,占空比可调范围为0~100%(图1)。 比较器的“B”端被配置为工作在500Hz左右的振荡器。正输入端产生三角波,振幅约为电源电压的1/10.比较器的
[电源管理]
能用直流信号<font color='red'>驱动</font>LED的简单PWM调制器电路
恩智浦推出面向紧凑非调光灯的LED驱动器IC
恩智浦半导体NXP Semiconductors N.V.近日宣布,推出针对紧凑非调光、改进型LED灯的数款新型LED驱动器IC,这是继SSL21081之后SSL2108x系列产品家族中的又一新成员。随着SSL21082、SSL21083和SSL21084的加入,恩智浦目前为灯具设计师提供了一个统一的设计平台,可以开发面向100V – 120V和230V电源电压以及功率最高25 W的产品。SSL2108x系列基于GreenChip™技术,专门针对高输出电压的非隔离式拓扑结构以及无需TRIAC调光器兼容性的应用而优化。 紧凑非调光LED灯在日本等市场日渐盛行。SSL2108x系列为这些市场提供了一种业界最佳的解决方案,具有突出的能
[电源管理]
信号灯的线性LED驱动器电路设计攻略
  电路说明: 本应用笔记介绍了一款线性LED 驱动方案,用于驱动6串LED 信号灯,每串包含4只串联LED。每串LED 负载具有独立的阳极接点,阴极连接在一起。该电路采用汽车电池供电, 最低电压为10V,最高电压为28V,能够为每串LED 提供350mA 电流。由于使用共阴极架构,检流电阻必须放置在LED 串的阳极端。LED 驱动器(MAX16836)电流检测输入端的最大共模电压限制在4V,因此,检流电阻两端的电压必须经过电平转换,以地为参考,以符合驱动器的要求。一对PNP 晶体管把LED 检流电阻的电压转换成以GND 为参考的电压,送入 MAX16836 电流检测引脚。下式提供了R1、R2、R3和R4 (电路图中U1部分)的计
[电源管理]
信号灯的线性LED<font color='red'>驱动</font>器电路设计攻略
74HC595驱动程序2例
void WriteSIOByte(unsigned char val) { unsigned char i; ACC = val; for (i = 8; i 0; i --) { SRCLK = 0;//拉低74HC595时钟 _rrca_();//右移一位数据 SER = CY;//发送74HC595一位串行数据 SRCLK = 1;//拉高74HC595时钟 _nop_();//延时 } SER = 1;//释放数据总线 //以下3条指令若在多字节时,应该移入多字节全发送完后在执行此3条指令 RCLK = 0; _nop_();//延时 RCLK = 1;//打入并行数据 } 7
[单片机]
汽车行驶记录仪中USB HOST相关模块的设计
USB HOST相关模块的总体设计   汽车行驶记录仪中的USB HOST相关模块由单片机、USB HOST接口、FLASH、铁电存储体(FRAM)、实时时钟和电源管理等部分组成,其功能框图如图1所示。汽车行驶记录仪工作时,由单片机通过前端接口电路拾取汽车行驶状态的各种信息,包括车速、发动机转速和各种车辆开关信号等。汽车行驶记录仪以实时时钟为基准,把车辆信息按类别分别存入FRAM和FLASH。需要从汽车行驶记录仪中获取汽车记录状态信息时,用户插入优盘,单片机自动识别优盘并加载驱动程序,当完成设备枚举和Bulk_Only传输协议后,单片机就可以把汽车行驶记录仪中记录的状态信息以文件的形式传输到优盘。本文重点介绍电源模块、USB H
[汽车电子]
EEPROM驱动代码常见操作
相信很多读者都使用过类似AT24C0x这种使用I²C读写的EEPROM,在项目中,使用不当就容易导致数据丢失,或者异常的情况。 今天就来讲讲关于EEPROM的内容。 1I²C读写EEPROM基础原理 市面上大部分使用I2C通信的EEPROM,控制时序和读写流程都基本相同。 I²C通信原理,说简单不简单,但说难也不难,主要理解基础原理和时序即可。 可以参看我分享的文章:通信教程 | I²C基础原理及通信协议通信教程 | 详述I²C总线时序通信教程 | I²C几种速度及区别 2EEPROM底层驱动 真正实际做过项目的人都知道,好的底层驱动,会给上层应用开发带来很大便利,节省开发时间,以及减少bug发生率。 而大部分初
[单片机]
STM32之DRV8834电机驱动(PWM方式)
一、简介 本文介绍如何使用STM32通过DRV8834控制步进电机,使用PWM方式控制转动。 二、实验平台 库版本:STM32F10x_StdPeriph_Lib_V3.5.0 编译软件:MDK4.53 硬件平台:STM32开发板(主芯片stm32f103c8t6) 仿真器:JLINK 三、版权声明 四、实验前提 1、在进行本文步骤前,请先阅读以下博文: 1)《STM32之DRV8834电机驱动(IO方式)》:http://blog.csdn.net/feilusia/article/details/52853951 2、在进行本文步骤前,请先实现以下博文: 1)《STM32之系统滴答定时器》:
[单片机]
STM32之DRV8834电机<font color='red'>驱动</font>(PWM方式)
基于LT3743 LED驱动器新型调光方案详解
在许多照明应用中,人们都采用了能够产生已调大电流脉冲的功率 驱动 器,从DLP 投影机 中的大电流 led 到高功率激光 二极管等等。例如:在高端视频投影机中,高功率 LED 用于产生彩色照明。这些投影机中的RGB LED 需要精准的调光控制以实现准确的彩色混合 ── 在该场合中,除了简单的 PWM 调光以外,还能够提供更多的控制功能。通常,为了实现彩色混合中所要求的宽动态范围,LED 驱动器必须要能够在两种完全不同的已调峰值电流状态之间快速切换,并叠加 PWM 调光而不造成任何损坏。LT3743 能够满足这些苛刻的准确度和速度要求。   LT3743 是一款同步降压型 DC/DC 控制器 ,它运用固定频率、平均电流模式控制
[电源管理]
基于LT3743 LED<font color='red'>驱动</font>器新型调光方案详解
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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