发 帖  
张飞软硬开源基于STM32 BLDC直流无刷电机驱动器开发视频套件, 👉戳此立抢👈

[经验] lcd1602显示两行怎么写程序呀

2014-4-27 22:36:39  28834
分享
2
lcd1602显示两行怎么写程序呀,感觉非常乱
xiepei01 2014-6-16 18:28:59
#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); //延时
    }
回复

举报

zds110 2015-5-11 23:04:51
xiepei01 发表于 2014-6-16 18:28
#include     
#define uint unsigned int  //预定义一下
#define uchar unsigned char

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

举报

Aidaohuakai 2015-5-11 23:10:04
  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. }

复制代码
回复

举报

jinbin 2015-12-16 23:20:35
xiepei01 发表于 2014-6-16 18:28
#include     
#define uint unsigned int  //预定义一下
#define uchar unsigned char

你的程序!~!!!!
回复

举报

jinbin 2015-12-16 23:22:02
jinbin 发表于 2015-12-16 23:20
你的程序!~!!!!

你的程序!!!!
]V{FNBA[AJV3TEIIAW5S4[S.png
回复

举报

q574448638 2015-12-16 23:46:35
zds110 发表于 2015-5-11 23:04
你好,你的程序现在是动态的,如何让它静态显示?菜鸟不懂,多谢赐教

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

举报

陈展 2016-1-9 21:22:23
做的不错,支持了
回复

举报

martin1800 2016-3-26 16:10:04
呵呵大家一起学习学习
回复

举报

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

举报

半透明丶酒杯 2016-5-22 00:57:28
那要第一行显示当前温度,第二行显示转速,都显示当前数值,该怎么写?
回复

举报

夜行者灬 2016-5-22 15:05:49
楼主我来教你:
#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);
}
回复

举报

夜行者灬 2016-5-22 15:11:10
本帖最后由 夜行者灬 于 2017-8-10 13:02 编辑

再附上一张图,证据确凿
20160522_150613.jpg
回复

举报

wkm199644 2016-7-3 13:41:46
夜行者灬 发表于 2016-5-22 15:11
再附上一张图,证据确凿。还有疑问的话加我微信zqy950923     我们一起学习

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

举报

LCX&SFY 2016-7-18 14:29:57
加图中  方框图里面的 三行代码可实现 最终保持静态!
无标题.png
回复

举报

飞飞不起飞 2016-10-27 16:09:02
夜行者灬 发表于 2016-5-22 15:05
楼主我来教你:
#include
#define uchar unsigned char

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

举报

lgs4511 2017-5-25 10:50:40
飞飞不起飞 发表于 2016-10-27 16:09
你好,我在编译这个代码的时候出现lunprintable character 0xA0 skipped 的错误请问一下应该怎么改???

不用改,直接砸电脑
回复

举报

我是电子发烧友啊 2017-6-30 20:46:27
效果不错 试过了
回复

举报

我是电子发烧友啊 2017-6-30 20:47:31
作为检测LCD的程序使用还是挺好的
回复

举报

shifeng88 2017-6-30 21:34:47
非常详细,谢谢帮忙的朋友。
回复

举报

评论

高级模式
您需要登录后才可以回帖 登录 | 注册

12下一页
发经验
课程
    关闭

    站长推荐 上一条 /8 下一条

    快速回复 返回顶部 返回列表