微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > lcd1602显示两行怎么写程序呀

lcd1602显示两行怎么写程序呀

时间:10-02 整理:3721RD 点击:
lcd1602显示两行怎么写程序呀,感觉非常乱

#include<reg52.h>     
#define uint unsigned int  //预定义一下
#define uchar unsigned char
sbit rs=P2^2;    //1602的数据/指令选择控制线
sbit rw=P2^1;        //1602的读写控制线
sbit en=P2^0;        //1602的使能控制线
uchar code  table[]="LCD1602-wjz-tjdz"; //要显示的内容1放入数组tablel
uchar code table1[]="  QQ:544806579  "; //要显示的内容2放入数组table1
void delay(uint z)       //延时函数                       
{
    uint x,y;  
    for(x=z;x>0;x--)
        for(y=122;y>0;y--);
}
void lcd_wcom(uchar com)  //1602写命令函数                 
{
    rs=0;            //选择指令寄存器
    rw=0;            //选择写
    P0=com;            //把命令字送入P2
    delay(5);            //延时一小会儿,让1602准备接收数据
    en=1;           //使能线电平变化,命令送入1602的8位数据口
    en=0;
}
void lcd_wdat(uchar dat)        //1602写数据函数      
{
    rs=1;        //选择数据寄存器
    rw=0;        //选择写
    P0=dat;        //把要显示的数据送入P2
    delay(5);        //延时一小会儿,让1602准备接收数据
    en=1;        //使能线电平变化,数据送入1602的8位数据口
    en=0;
}
void lcd_init()              //1602初始化函数      
{
    lcd_wcom(0x38);       //8位数据,双列,5*7字形      
    lcd_wcom(0x0c);      //开启显示屏,关光标,光标不闪烁
    lcd_wcom(0x06);    //显示地址递增,即写一个数据后,显示位置右移一位
    lcd_wcom(0x01);    //清屏
}
void main()            //主函数
{     
    uchar n,m=0;
    lcd_init();                 //液晶初始化
    lcd_wcom(0x80);   //显示地址设为80H(即00H,)上排第一位      
    for(m=0;m<16;m++)     //将table[]中的数据依次写入1602显示
    {
            lcd_wdat(table[m]);           
            delay(100);    //延时
    }
    lcd_wcom(0x80+0x40); //重新设定显示地址为,即下排第1位
    for(n=0;n<16;n++)   //将table1[]中的数据依次写入1602显示
    {     
            lcd_wdat(table1[n]);
           delay(100); //延时
    }

你好,你的程序现在是动态的,如何让它静态显示?菜鸟不懂,多谢赐教

  1. #include "LCD1602.h"   
  2. #include "Delay.h"      


  3. /*----------------------------
  4. //向LCD1602写入指令或数据
  5. //RS=0:写命令
  6. //RS=1:写数据         
  7. //Content:向LCD1602写入的内容  
  8. -----------------------------*/
  9. void LCD_Write(uchar RS,uchar Content)
  10. {
  11.   LCD_RS=RS;            //选择写命令或写数据模式
  12.   LCD_RW=0;
  13.   P0=Content;           //将要写的数据送到数据总线上
  14.   Delay_us(2);          //稍作延时以待数据稳定
  15.   LCD_EN=1;                    //使能端给一高脉冲,因为初始化函数中已经将lcden置0               
  16.         Delay_us(5);         
  17.         LCD_EN=0;                    //将使能端置0以完成高脉冲
  18.   Delay_us(10);         //稍作延时
  19. }

  20. /*----------------------------
  21. //向LCD1602写入一个字符 如LCD_ShowChar(1,0,'a');
  22. //x:1,第一行,2第二行
  23. //y:1到16
  24. //dat:向LCD1602写入的字符
  25. -----------------------------*/
  26. void LCD_ShowChar(uchar x,uchar y,uchar dat)
  27. {
  28.   uchar Adr;                      //LCD地址变量                    
  29.                
  30.         switch(x)
  31.         {
  32.    case 1:Adr=0x80+y;break;       //显示屏第一行
  33.    case 2:Adr=0x80+0x40+y;break;        //显示屏第二行
  34.    default:break;               
  35.   }
  36.   LCD_Write(0,Adr);
  37.         LCD_Write(1,dat);
  38. }

  39. /*----------------------------
  40. //向LCD1602写入字符串
  41. //x:1,第一行,2第二行
  42. //y:1到16
  43. *dat:指向字符串的首地址
  44. -----------------------------*/
  45. void LCD_ShowStr(uchar x,uchar y,uchar *dat)
  46. {
  47.         uchar i=0;
  48.   uchar pdat;                      //指针地址变量
  49.                
  50.         pdat= *dat;                      //把数组首地址付给指针变量
  51.         while(pdat!='\0')                //等待读完数组
  52.         {
  53.           LCD_ShowChar(x,y+i,pdat);
  54.                 pdat=*(++dat);                //指针加一后把地址赋给dat
  55.                 i++;
  56.         }
  57. }

  58. /*----------------------------
  59. //显示1个数字
  60. //x,y :起点坐标         
  61. //num:数值(0~99)         
  62. -----------------------------*/          
  63. void LCD_ShowNum(uchar x,uchar y,uchar num)
  64. {     
  65.   if(num<100)
  66.         {
  67.     LCD_ShowChar(x,y+0,num/10+'0');
  68.           LCD_ShowChar(x,y+1,num%10+'0');
  69.   }               
  70. }

  71. /*----------------------------
  72. //初始化LCD1602
  73. -----------------------------*/       
  74. void LCD_Init()        
  75. {
  76.   LCD_RS=0;
  77.   LCD_RW=0;
  78.   LCD_EN=0;
  79.   LCD_Write(0,0x38);            //设置16*2显示,5*7点阵,八位数据接口//看资料
  80.   LCD_Write(0,0x0c);            //设置开显示,不显示光标
  81.   LCD_Write(0,0x06);            //写一个字符后地址指针加1
  82.   LCD_Write(0,0x01);            //显示清0,数据指针清0
  83.         Delay(5);               //延时5ms,使之更稳定
  84. }

复制代码

你的程序!~!

你的程序!


延迟delay(100)去掉,然后试一下

做的不错,支持了

呵呵大家一起学习学习

第4脚:RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。 第5脚:RW为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS和RW共同为低电平时可以写入指令或者显示地址,当RS为低电平RW为高电平时可以读忙信号,当RS为高电平RW为低电平时可以写入数据。 第6脚:E端

那要第一行显示当前温度,第二行显示转速,都显示当前数值,该怎么写?

小编我来教你:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit rs=P3^5;
sbit lcden=P3^4;
sbit dula=P2^6;
sbit wela=P2^7;
uchar table1[]="I Love You   ";
uchar table2[]="14dianxinguan";
void delay(uint x)
{
        uint a,b;
        for(a=x;a>0;a--)
                for(b=10;b>0;b--);
}
void delay1(uint x)
{
        uint a,b;
        for(a=x;a>0;a--)
                for(b=100;b>0;b--);
}
void write_com(uchar com)
{
        P0=com;
        rs=0;
        lcden=0;
        delay(10);
        lcden=1;
        delay(10);
        lcden=0;
       
}
void write_date(uchar date)
{
        P0=date;
        rs=1;
        lcden=0;
        delay(10);
        lcden=1;
        delay(10);
        lcden=0;
       
}
void init()
{
        dula=0;
        wela=0;
        write_com(0x38);   //显示模式设置:16×2显示,5×7点阵,8位数据接口
        delay(20);
        write_com(0x0f);   //显示模式设置
        delay(20);
        write_com(0x01);   //清屏幕指令,将以前的显示内容清除
        delay(20);       
}
void main()
{
        uchar a;
        init();
        write_com(0x80);       
        delay(20);
        for(a=0;a<13;a++)
        {
        write_date(table1[a]);
        delay(20);               
        }
        write_com(0xc0);
        delay(50);
        for(a=0;a<13;a++)
        {
        write_date(table2[a]);
        delay(40);               
        }
        while(1);
}

再附上一张图,证据确凿


RS RW,E LCD一共就这三个使能端  你多出来的是接哪的

加图中  方框图里面的 三行代码可实现 最终保持静态!


你好,我在编译这个代码的时候出现lunprintable character 0xA0 skipped 的错误请问一下应该怎么改?

不用改,直接砸电脑

效果不错 试过了

作为检测LCD的程序使用还是挺好的

非常详细,谢谢帮忙的朋友。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top