[讨论] 写给第一次接触lcd1602的初学者,并行显示字符串

天才小熊猫   2014-10-5 00:35 楼主
  #include
  #include //后面字符串函数中取得数组的个数中用到;调用strlen函数

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

//重新定义各个控制引脚的名称,  sbit 意思为<重定义>,,不要跟 bit 搞混,bit是汇编中 "位"

  sbit rs = P1^0;         //重定义,rs电平为1则传送数据,为0则转送指令
  sbit rw = P1^1;        //控制LCD读或者写;为1则读LCD,为0则写入LCD
  sbit en = P1^2;        //LCD行动控制,EN为下降沿则交互执行,即EN = 1;跟着EN = 0;
  unsigned char code shuzu [] = {"I Love You,Baby!!"}; //定义一个需要显示的数组
/**************************************************************************************/




/**************************************************************************************/
/*延时程序,作用在需要时进行延时,延时时长可以在调用函数中改变,如主程序中调用:  ys (5); 括号中的"5"即为本函数中i的数值;*/
  
  void ys (int i)                                                //无返回值 函数名 (定义整形变量  名称 i)
  {
     int t;                                                        //定义整形变量 名称t
         for (; i >= 1; i --)                                //循环 (空函数; 判断i是否大于或等于1; i减1<自减>) i的值是调用此函数时设定的
         {                                                        //若i的值大于或等于1;则进入下面一个循环
            for (t = 120; t > 1; t--)                        //循环 (t赋值120; 判断t的值是否大于1; t自减)
                  {                                                //空函数
                  }
         }
  }
/*********************************************延时程序结束*****************/






/*********************************************读忙子程序**************/
// 读忙字程序,用于判断LCD液晶是否忙状态.如果不进行判断可能会导致数据写入LCD失败.

   void dm ()                                                                          //无返回值 函数名 (空)
   {
     P0 = 0xff;                                                                          //把0xff发送给LCD的数据总线
         rs = 0;                                                                          //选指令
         rw = 1;                                                                          //选择读
         en = 1;                                                                          //使能端置1(高电平)
         while (P0 & 0x80);                                                          //循环 (如果P0和0x80相等的话) P0 & 0x80                                   相与,即P0总线的8位二进制数与10000000比较,
                                                      //全部相同则结果为 1<真>;忙状态成立,程序在此处死循环相与
         en = 0;                                                                          //使能端置0(低电平)
   }
/**************************************************************************************/




/***********************************************写数据或指令子程序*******************/
  void ddata (int x, unsigned char  DATA)//无返回值 函数名 (定义整形变量 x, 定义长字符型变量 DDATA)
  {
      dm ();                                                         //读忙子程序
          P0 = DATA;                                         //如果不忙,则把参数 DDATA 获取到的变量赋值给 总线
          rw = 0;                                                 //读写端选择为 写<0>
      rs = x;                                                         //数据或指令端选择为参数 的值, x的值为0或者1;为0表示总线传输的是控制LCD指令,为1表示要显示的数据
          en = 1;                                                 //使能端置1
          en = 0;                                                 //使能端置0; 接上一条指令形成一个下降沿,LCD识别到下降沿信号则读取总线内容
  }
/**************************************************************************************/





/************************************************LCD初始化函数******************/
  void lcd1602 ()                   //无返回值 函数名 (空)
  {
     rs = 1;                           //rs设置为 数据
         rw = 1;                   //rw设置为 读
         en = 1;                   //en设置为高电平
         P0 = 0xff;                   //总线写入0xff
         ys (15);                   //长延时
         ddata (0, 0x38);  //函数名 (指令, 指令内容)  //  0发送给ddata函数中的x,再经ddata函数发送给rs,即rs设置为指令;;0x38为指令内容
         ys (5);                   //短延时
         ddata (0, 0x38);  //0x38  表示设置16*2显示,5*7点阵,8位数据接口
         ddata (0, 0x08);  //0x08  表示只开显示
         ddata (0, 0x01);  //0x01  表示清屏
         ddata (0, 0x06);  //0x06  表示地址加1,当写入数据的时候光标右移
         ddata (0, 0x0c);  //0x0c  表示开显示,不显示光标
  }
/*************************************************************************************/







/*************************************************显示单个字符*********************/
  void xianshi (unsigned char i, unsigned char j, unsigned char DDATA)          //无返回值 函数名 (定义字符形参i, 字符形参j, 字符形参DDATA)
  {
     if (i)                                                                                                                                  //如果 (i的值为1<真>)
         {
  j = j + 0x40;   //第二行起始地址加上列数为字符显示地址                                  //则把j加0x40后的值赋给j;;等同于j += 0x40        ,
  }
  j = j + 0x80;                                                                                                                          //同上,0x80指第一行首列的地址,若if语句有效, 则最终j=  第二行首字母的地址
         ddata (0, j);                                                                                                                  //函数名 (指令, 内容)
         ddata (1, DDATA);                                                                                                          //函数名 (数据, 内容)
  }
/**************************************************************************************/





/***************************************************显示字符串************************/
void xianshi1 (unsigned char y, unsigned char x, unsigned char shuzu0[])  //函数名 参数定义
{
     unsigned char j;                           //参数定义
         unsigned char i;                           //参数定义
         int k = 1;                                           //定义整形参数k并赋值为1
         i = 0;                                                   //i赋值为0
         j = strlen (shuzu0)+x;                   //j = 取数组个数加上x<首列位置>的值,最终j的值为数组中最后一位字符的列,j最终值在0~15之间

         for (; k > 0;)                                   //循环 (空; 如果k大于0;空)                                                                        !
         {                                                           //则                                                                                                                        !
                                                                    //判断                                                                                                                ! 所有加 "!" 备注的代码可以压缩为:
         if (x < j)                                           //如果 (当前显示列数x < 最后一位字符的列数j)                                        ! while (x < j)
         {                                                           //则                                                                                                                        ! {
           xianshi (y, x, shuzu0[i]);  //函数名 (行y<0或1>送出, 列x<0~15>送出, 数组[第i位]送出)                !         xianshi (y, x, shuzu0[i]);
           x ++;                                           //列数加1                                                                                                        !         x++;
           i ++;                                           //数组第i位加1                                                                                                !         i++;
         }                                                                                //                                                                                                        !  }
         else                                                    //否则                                                                                                                !
         {                                                                                //                                                                                                        !
           k = 0;                                           //k 置0,  for循环退出                                                                                !
         }
         }
}
/****************************************************主函数***********************/





/**************************************************************************************/
  void main ()                                  //主函数
  {

     ys (15);                                  //长延时
         lcd1602 ();                          //初始化LCD
         xianshi (1, 3, 'a');          //显示单个字符
         xianshi1(0, 0, shuzu);          //显示字符串
         while (1);                                  //程序停留在此
  }
/**************************************************************************************/

回复评论 (4)

备注中有几处有错别字,大家自己脑补.程序已经上机测试通过
点赞  2014-10-5 00:40
不错 不错!
生活就是油盐酱醋再加一点糖,快活就是一天到晚乐呵呵的忙 =================================== 做一个简单的人,踏实而务实,不沉溺幻想,不庸人自扰
点赞  2014-10-5 11:08
测试通过,表示遇到高手
















www.qmgfw.com集成墙面 www.315jcz.com集成灶 www.315dbw.com地板十大品牌 www.tmjcq.com集成墙面
点赞  2014-10-6 17:28
支持一下楼主
点赞  2014-10-6 17:56
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复