历史上的今天
返回首页

历史上的今天

今天是:2025年04月01日(星期二)

正在发生

2018年04月01日 | ATMEAGl6L驱动16x2点阵字符液晶模块的实验

2018-04-01 来源:eefocus

  要实现对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);

  }

  }

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


推荐阅读

史海拾趣

安谱隆(Ampleon)公司的发展小趣事

在独立发展后,安谱隆不断推出创新产品,巩固其在射频市场的地位。2015年12月,安谱隆推出了基于0.5μm工艺、额定功率为10至200W的GaN on SiC射频功率晶体管。这一产品的推出不仅展示了安谱隆在射频技术方面的领先实力,也为其在移动通信、广播电视等领域的应用提供了强有力的支持。

ARRA Inc公司的发展小趣事

2022年,无锡锡产微芯半导体有限公司完成了对安谱隆的收购。这一交易金额超过百亿元,是当年中国最大的半导体并购交易事件之一。锡产微芯的收购不仅为安谱隆提供了更广阔的发展平台,也为其在半导体行业中的进一步发展注入了新的活力。在锡产微芯的支持下,安谱隆开启了新的发展阶段,继续在全球射频市场中发挥着重要作用。

这五个故事展示了安谱隆从恩智浦剥离出来到被锡产微芯收购的发展历程。在这个过程中,安谱隆不仅展现了其强大的技术实力和市场潜力,也经历了资本市场的波折与挑战。然而,正是这些经历使得安谱隆更加成熟和稳健,为其未来的发展奠定了坚实的基础。

GradConn Ltd公司的发展小趣事

GradConn Ltd的创立初期,公司便明确了其专注于电子连接器和同轴电缆组件的市场定位。这一战略选择使GradConn能够迅速在通讯、工业、医疗和汽车等领域建立起稳定的客户基础。通过不断研发创新,GradConn推出了一系列高质量的产品,如板对板连接器、电缆组件连接器以及SIM卡连接器等,满足了市场对精密、可靠连接解决方案的迫切需求。

Diodes Incorporated公司的发展小趣事

近年来,Diodes Incorporated的财务表现稳步提升。根据公司公布的财报数据显示,公司归母净利润持续增长,营业收入也保持着稳定的增长态势。这一成绩的取得,得益于公司对产品质量的严格把控、对市场需求的精准把握以及对新技术的持续投入。同时,公司还通过优化生产流程、降低生产成本等措施,进一步提升了盈利能力。

Collins Electronics Corp公司的发展小趣事

Collins Electronics Corp的创始人在电子领域拥有深厚的背景和丰富的经验。在公司创立初期,他们发现市场上的电子设备在性能和稳定性上存在巨大的提升空间。于是,他们决定创立一家公司,专注于研发和生产高品质的电子设备。经过多次试验和改进,Collins Electronics Corp推出了他们的首款产品,一款高性能的信号放大器。这款产品凭借其卓越的性能和稳定性,在市场上获得了极大的成功,也为公司的后续发展奠定了坚实的基础。

Acmelux Taiwan Inc公司的发展小趣事

面对日益激烈的国际竞争,Acmelux Taiwan Inc公司积极实施全球化战略布局。公司先后在欧美、亚洲等地设立了研发中心和生产基地,以充分利用全球资源,提升公司的整体竞争力。通过与当地企业的合作与交流,Acmelux不仅拓展了国际市场,还吸收了大量先进的技术和管理经验,为公司的持续发展注入了新的活力。

问答坊 | AI 解惑

关于直流稳压电源电流的问题

用lm317做一个0到15v可调的稳压电源,题目要求输出电流不小于80ma,请问要怎么处理电流的问题?我也不知道输出电流不小于80ma的意思,望各位高手不吝赐教,万分感谢!…

查看全部问答>

pcb出的光绘文件导入到cam350有两个警告

本信息来自合作QQ群:电子工程师技术交流(12425841) 群主在坛子ID:Kata pcb出的光绘文件导入到cam350有两个警告: 1 Warning - Zero radius arc detected. Assuming linear interpolation. 2 Warning - Apertures are used which have a size of ...…

查看全部问答>

CCD与CMOS打起来了![zt]

CCD,是英文Charge Coupled Device 即电荷耦合器件的缩写,它是一种特殊半导体器件,上面有很多一样的感光元件,每个感光元件叫一个像素。CCD由许多感光单位组成,通常以百万像素为单位。当CCD表面受到光线照射时,每个感光单位会将电荷反映在组 ...…

查看全部问答>

有谁在Windows mobile平台上开发过双camera驱动, 我们将用PXA310处理器, 如何开发,应该注意哪些? 经常出现的问题有哪些? 谢谢了。

请问大侠:     有谁在Windows mobile平台上开发过双camera驱动, 我们将用PXA310处理器, 如何开发,应该注意哪些? 经常出现的问题有哪些? 谢谢了。…

查看全部问答>

变频器的短路试验是怎么做的?

现在的变频器一般具备输出短路保护的功能,如果在设计阶段,大家一般采取什么方法来做这个实验?欢迎大家来讨论。我知道的其中一种方法是:变频器输出的任意两相接到交流接触器上,用PLC来控制交流接触器的通断,短路时间可以自由设定。但是交流接 ...…

查看全部问答>

IAR不能使用了

  我就是打开了IAR 后,然后添加.EWW文件,都打不开原来已经编译通过的程序啊。谁知道啊,谢谢了…

查看全部问答>

国嵌加密视频(破解)

国嵌加密课程:ARM精讲班视频,LINUX深入班视频,高级项目班视频,USB系统设计,课件,实验手册扫描版,试验代码,全套破解!如经济困难,又急需要学习的话,需要的请联系:2578995637!如经济允许请支持正版。。。 有需要的看看。。不需要的请不要 ...…

查看全部问答>

单片机AD接口与外部电路的连接问题

一个电路可输出变化的电压,想用430上的AD接口对这个电路输出的电压进行转换,那这个电路应该和AD接口怎么相连,是通过IO口吗?求解。…

查看全部问答>

【 一起学习器件指标】这个电阻模型我还真不懂

leobian坛友在【一起学习器件指标】你敢不敢说个大家不知道的电阻指标(https://bbs.eeworld.com.cn/thread-327176-1-1.html)中上传了这个电阻模型。这个模型看起来是一个非常完整的电阻模型,大家来发表下看法解释解释里面的阻容感元件。…

查看全部问答>

【武汉华嵌】浅谈Linux进程

作者:武汉华嵌 嵌入式学院 技术支持 涂老师 内容清单:1.    在 Linux 内核内进程表示2.    在 Linux 内进程管理3.    在 Linux 内核创建一个进程引言      Linux的用户空间进程的创建和管理 ...…

查看全部问答>