单片机lcd1602程序,通用型51单片机lcd1602驱动代码

光电显示

1051人已加入

描述

  单片机又称单片微控制器,它不是完成某一个逻辑功能的芯片,而是把一个计算机系统集成到一个芯片上。相当于一个微型的计算机,和计算机相比,单片机只缺少了I/O设备。

  概括的讲:一块芯片就成了一台计算机。它的体积小、质量轻、价格便宜、为学习、应用和开发提供了便利条件。同时,学习使用单片机是了解计算机原理与结构的最佳选择。单片机的使用领域已十分广泛,如智能仪表、实时工控、通讯设备、导航系统、家用电器等。各种产品一旦用上了单片机,就能起到使产品升级换代的功效。

  而LCD1602是一种工业字符型液晶,能够同时显示16x02即32个字符。LCD1602液晶显示原理 LCD1602液晶显示的原理是利用液晶的物理特性,通过电压对其显示区域进行控制,有电就有显示,这样即可以显示出图形。经常会有人问单片机的lcd1602程序是,这篇文章给了一篇用型51单片机lcd1602驱动代码很实用,希望对大家有用。

  

  通用型51单片机lcd1602驱动代码

  文件:lcd_1602.h

  #ifndef _LCD1602_TRAVELER_H_

  #define _LCD1602_TRAVELER_H_

  /*************************待配置项*******************************/

  #define DATA_LCD P0 //液晶与MCU 数据口

  sbit RS_LCD = P2^5; // 液晶的RS、RW、E 端在 MCU端的连线

  sbit RW_LCD = P2^6;

  sbit E_LCD = P2^7;

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

  void lcdInit(void);

  //lcdInit() 液晶初始化、所有对液晶的操作之前均需要调用此函数

  void lcdDelayMs(const unsigned char ms);

  // lcdDelayMs(ms) 液晶内部使用的毫秒级延时函数 如不需要请自行删除

  // 该驱动函数须在不超过12MHz的晶振频率下才能正常工作

  void lcdDelayUs(const unsigned char us);

  // lcdDelayMs(ms) 液晶内部使用的微秒级延时函数 如不需要请自行删除

  // 该驱动函数须在不超过12MHz的晶振频率下才能正常工作

  void lcdWriteCmd(const unsigned char cmd);

  // lcdWriteCmd(cmd) 向液晶写命令字函数

  void lcdWriteChar(const unsigned char chr);

  // lcdWriteChar(chr) 向液晶写字符函数

  void lcdWriteData(const unsigned char pos,const unsigned char dat);

  //lcdWriteData(pos,dat)向液晶板上指定位置写字符函数

  void lcdWriteString(const unsigned char line,unsigned char *str,const unsigned char offset);

  //lcdWriteString(line,*str,offset) 向液晶面板指定行、写字符串 可指定首字符偏移量 所显示的区域限制在当前行内

  bit lcdReadBusy();

  //读lcd的忙标志 忙 返回1 不忙 返回0

  void lcdWriteUint(unsigned char line,unsigned int c,unsigned char offset);

  //lcdWriteUint(unsigned char line,unsigned int c,unsigned char offset)写无符号整形数 到lcd (占位 5 字符)

  //line 指明所在行、c要写的数据、offset 距首列偏移量

  #endif

  ——————————————————

  文件:lcd_1602.c

  #include

  #include “lcd_1602.h”

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

  /***********************12MHz晶振下微秒级延时*****************************/

  void lcdDelayUs(const unsigned char us){

  unsigned char cin = us》》1; //prepare for clause while calculating time

  cin++;

  while(--cin);// ‘dec cin’ and ‘jnz cin’ 2 circles

  }

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

  /***********************12MHz晶振下毫秒级延时*****************************/

  void lcdDelayMs(const unsigned char ms){

  unsigned char cin = ms+1;

  while(--cin){

  lcdDelayUs(250);

  lcdDelayUs(250);

  lcdDelayUs(250);

  lcdDelayUs(250);

  }

  }

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

  /**************************写命令字***************************************/

  void lcdWriteCmd(const unsigned char cmd){

  while(lcdReadBusy());

  E_LCD = 0;

  RS_LCD = 0;

  RW_LCD = 0;

  DATA_LCD = cmd;

  lcdDelayUs(40);

  E_LCD = 1;

  lcdDelayUs(250);

  E_LCD = 0;

  lcdDelayUs(250);

  }

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

  /************************写字符********************************************/

  void lcdWriteChar(const unsigned char chr){

  while(lcdReadBusy());

  E_LCD = 0;

  RS_LCD = 1;

  RW_LCD = 0 ;

  DATA_LCD = chr;

  lcdDelayUs(40);

  E_LCD = 1;

  lcdDelayUs(250);

  E_LCD = 0;

  lcdDelayUs(250);

  }

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

  /*******************向指定位置写字符**************************************/

  void lcdWriteData(const unsigned char pos,const unsigned char dat){

  unsigned char p;

  if(pos》=16) p = 0xb0 + pos ;

  else p = 0x80 + pos ;

  lcdWriteCmd(p);

  lcdWriteChar(dat);

  }

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

  /**************************写字符串***************************************/

  void lcdWriteString(const unsigned char line,unsigned char *str,const unsigned char offset){

  unsigned char p;

  unsigned char curlineend = (line)?32:16; //每次写字符串最多允许写完单行,不允许跨行写

  unsigned char i=0;

  if(line) p = 16;else p = 0;

  p = p + offset;

  while(p!=curlineend){

  if(!str[i])break;//如果到字符尾则退出

  lcdWriteData(p++,str[i++]);

  }

  }

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

  /************************初始化液晶***************************************/

  void lcdInit(void){

  lcdDelayMs(15);

  lcdWriteCmd(0x38);

  lcdWriteCmd(0x38);

  lcdWriteCmd(0x38);

  lcdWriteCmd(0x06);

  lcdWriteCmd(0x0c);

  lcdWriteCmd(0x01);

  lcdWriteData(1,‘ ’);//此为驱动的bug,未消除bug之前请勿删除此行及下行两行

  lcdWriteCmd(0x0c);

  }

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

  bit lcdReadBusy(){

  bit i = 1;

  E_LCD = 0;

  RS_LCD = 0;

  RW_LCD = 1;

  E_LCD = 1;

  i = DATA_LCD & 0x80;

  return i;

  }

  //lcdWriteUint(unsigned char line,unsigned int c,unsigned char offset)写无符号整形数 到lcd (占位 5 字符)

  //line 指明所在行、c要写的数据、offset 距首列偏移量

  void lcdWriteUint(unsigned char line,unsigned int c,unsigned char offset){

  unsigned char i,j;

  unsigned char arrTmp[6] = {“ ”};

  j = 0;

  do{

  i = c % 10;

  arrTmp[4 - j] = i + ‘0’;

  j ++ ;

  c /= 10;

  }while(c);

  lcdWriteString(line,arrTmp,offset);

  }

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分