微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > pic18控制1602液晶屏只显示一行黑格,急!

pic18控制1602液晶屏只显示一行黑格,急!

时间:10-02 整理:3721RD 点击:
求助各位大神,帮帮小弟!用的是pic18f452,KS0066U 普通的1602液晶屏

程序都是书上的例子,8位控制

D0-D7=PORTD0-PORTD7
RS=PORTA4
RW=PORTA5
E=PORTE0
不管怎么弄运行后都只显示一行黑格..

  1. /*   PIC18F4520   LCD1602液晶驱动程序  滚屏显示     */

  2. #include<p18f452.h>



  3. #define uchar unsigned char
  4. #define uint    unsigned int

  5. #define LCDRS  PORTAbits.RA4
  6. #define LCDRW  PORTAbits.RA5
  7. #define LCDEN  PORTEbits.RE0

  8. const unsigned char table1[]="PIC18F4520+LCD1602 TEST PROGRAM";
  9. const unsigned char table2[]="QQ:710878209    TEL:13804638210";
  10.                               //定义显示字符串

  11. void delay(uint t);           //延时函数声明
  12. void write_com(uchar com);    //向1602液晶写命令函数声明
  13. void write_inf(uchar inf);    //向1602液晶写数据函数声明
  14. void init_lcd();              //1602液晶初始化函数声明

  15. /**********主函数**********/
  16. void main()
  17. {
  18.         uchar num;  //定义循环变量NUM
  19.         init_lcd(); //初始化1602液晶
  20.         delay(5);   //延时以等待液晶清屏指令完成

  21.     for(num=0;num<31;num++)
  22.         {
  23.                 write_inf(table1[num]);  //在LCD第一行写入字符串
  24.                 delay(1);
  25.         }
  26.         for(num=0;num<31;num++)
  27.         {
  28.                 write_com(0x80+0x40+num);//将地址设为LCD的第二行               
  29.                 write_inf(table2[num]);  //在LCD第二行写入字符串
  30.                 delay(1);
  31.         }
  32.            while(1)
  33.         {
  34.                 write_com(0x18);         //让屏幕循环左移
  35.                 delay(1000);
  36.         }
  37. }
  38. /**********延时函数**********/
  39. void delay(uint t)
  40. {
  41.         uint  x,y;
  42.         for(x=t;x>0;x--)
  43.                for(y=100;y>0;y--);
  44. }
  45. /**********向1602液晶写命令函数**********/
  46. void write_com(uchar com)
  47. {
  48.         LCDRW=0;    //将R/W端清0表示写操作
  49.         LCDRS=0;    //将RS端清0表示写命令
  50.         PORTD=com;  //数据由PORTD端口送出
  51.         delay(2);   //延时
  52.         LCDEN=1;    //将E端置高
  53.         delay(2);   //延时
  54.         LCDEN=0;    //将E端置低产生下降沿,命令写入
  55. }
  56. /*********向1602液晶写数据函数***********/
  57. void write_inf(uchar inf)
  58. {
  59.         LCDRW=0;    //将R/W端清0表示写操作
  60.         LCDRS=1;    //将RS端置1表示写命令数据
  61.         PORTD=inf;  //命令由PORTD端口送出
  62.         delay(2);   //延时
  63.         LCDEN=1;    //将E端置高
  64.         delay(2);   //延时
  65.         LCDEN=0;    //将E端置低产生下降沿,数据写入
  66. }
  67. /**********初始化1602液晶**********/
  68. void init_lcd()
  69. {
  70.         TRISD=0x00;
  71.         TRISA4=0;
  72.         TRISA5=0;
  73.         TRISE0=0;

  74.         LCDRW=0;
  75.         LCDEN=0;
  76.         LCDRS=0;

  77.            write_com(0x38); //8位数据线格式,2行字符,5x7点阵
  78.         write_com(0x0f); //显示功能开,有光标且光标闪烁
  79.         write_com(0x06); //写入新数据后光标右移,显示屏不移动。
  80.         write_com(0x01); //清屏
  81. }
  82. /**********结束**********/

复制代码







这个我刚遇到了,把PORTAbits.RA4、PORTAbits.RA5、PORTEbits.RE0等变成LATAbits.LATA4、LATAbits.LATA5、LATEbits.LATE0。PORT只能读不能写、芯片手册上写的,好好看看

是只有上面一行是黑格么?如果是的话可能跟程序有关了,1602没有被正确初始化吧,如果正确初始化不给屏写命令1602应该什么都不现实,如果是两行全是黑格的话你先看看调节亮度的电位器哪里有没有问题

我刚刚遇到这个问题了,初始化函数函数里加上lcdRW=0就好了,在这里得到了启发,非常感谢!

小编问题解决了吗?想知道怎么解决的~

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

网站地图

Top