找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2541|回复: 6
收起左侧

1602液晶屏D0到D7我用了两个接口输出,但网上单片机程序都用了一个,应该怎么解决

[复制链接]
ID:839796 发表于 2020-12-15 23:49 | 显示全部楼层 |阅读模式
1602液晶显示屏一直无法进行初始化,经过查看原理图发现:液晶屏的D0-D7引脚我有的接在了P0口,有的接在了P2口,在网上找的程序发现:在写入时,都是接在了一个口,这个问题我应该怎么解决,希望大佬们帮忙看看,十分感谢!
1111图片.png 2222.png 333333.png

回复

使用道具 举报

ID:839796 发表于 2020-12-16 00:05 | 显示全部楼层
我知道了,可以直接用#define 定义
回复

使用道具 举报

ID:839796 发表于 2020-12-16 01:10 来自手机 | 显示全部楼层
大佬们,在帮帮吧,直接用#define定义不对,还是不能写入
回复

使用道具 举报

ID:839796 发表于 2020-12-16 01:11 来自手机 | 显示全部楼层
希望大佬们能给个解决这个问题的具体代码,十分感谢
回复

使用道具 举报

ID:213173 发表于 2020-12-16 13:15 | 显示全部楼层
gagaga123 发表于 2020-12-16 01:11
希望大佬们能给个解决这个问题的具体代码,十分感谢

异组端口字节操作驱动LCD的方法在你这个帖子里,把延时函数换一个即可。
http://www.51hei.com/bbs/dpj-199732-1.html
回复

使用道具 举报

ID:517951 发表于 2020-12-16 13:32 | 显示全部楼层
显示屏的DB0-DB7 的数据线,在通常情况下都是接到同一个端口下P0,或者P1,P2,P3 方便数据线连接,不然时间一长自己都会忘记线路接法。还有软件编写也会简化,一条指令数据就传输到位,两个端口就需要两行指令。
回复

使用道具 举报

ID:155507 发表于 2020-12-16 13:48 | 显示全部楼层
给你写一个异组端口驱动LCD示例

  1. #include <reg51.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. sfr P1M1 = 0x91;    //PxM1.n,PxM0.n     =00--->Standard,    01--->push-pull
  5. sfr P1M0 = 0x92;    //                  =10--->pure input,  11--->open drain
  6. sfr P0M1 = 0x93;
  7. sfr P0M0 = 0x94;
  8. sfr P2M1 = 0x95;
  9. sfr P2M0 = 0x96;
  10. sfr P3M1 = 0xB1;
  11. sfr P3M0 = 0xB2;

  12. sbit LCD_RW=P1^1;
  13. sbit LCD_RS=P1^2;      
  14. sbit LCD_EN=P1^0;      

  15. sbit code0=P0^3;                           //定义LCD数据端口
  16. sbit code1=P0^2;
  17. sbit code2=P0^1;
  18. sbit code3=P0^0;
  19. sbit code4=P2^7;
  20. sbit code5=P2^6;
  21. sbit code6=P2^5;
  22. sbit code7=P2^4;      

  23. uchar table1[]="0123456789ABCDEFG";        //第一行
  24. uchar table2[]="HIJKLMNOPQRSTUVWX";        //第二行


  25. void PX(uchar i)                           //写入8位数据
  26. {   
  27.         code0=i&0x01;i>>=1;      
  28.         code1=i&0x01;i>>=1;
  29.         code2=i&0x01;i>>=1;
  30.         code3=i&0x01;i>>=1;
  31.         code4=i&0x01;i>>=1;
  32.         code5=i&0x01;i>>=1;
  33.         code6=i&0x01;i>>=1;
  34.         code7=i&0x01;
  35. }
  36. /*******100us延时程序********/
  37. void delay(uint x)
  38. {
  39.         uint a,b;
  40.         for(a=x;a>0;a--)
  41.         for(b=10;b>0;b--);
  42. }
  43. /*******液晶写指令程序********/
  44. void write_com(uchar com)
  45. {
  46.         LCD_RW=0;
  47.         LCD_EN=0;        //初始设置LCD_EN低电平
  48.         LCD_RS=0;        //允许写指令
  49.         PX(com);         //传递指令
  50.         delay(10);       //延时1ms
  51.         LCD_EN=1;        //使能写入
  52.         delay(10);        //延时1ms
  53.         LCD_EN=0;        //低跳变执行
  54.       
  55. }
  56. /*******液晶写数据程序********/
  57. void write_date(uchar date)
  58. {
  59.         LCD_RW=0;
  60.         LCD_RS=1;        //允许写数据
  61.         PX(date);        //传递数据
  62.         delay(10);        //延时1ms
  63.         LCD_EN=1;        //使能写入
  64.         delay(10);        //延时1ms
  65.         LCD_EN=0;        //低跳变执行
  66.       
  67. }
  68. /*******液晶初始化程序********/
  69. void init()                //设置显示模式、
  70. {

  71.         write_com(0x38);//设置16*2显示,5*7点阵,8位数据接口
  72.         write_com(0x01);//显示清零,数据指针清零
  73.         write_com(0x0c);//设置开显示,不显光标
  74.         write_com(0x06);//设置写一个字符后地址指针加1
  75.         write_com(0x80);//数据指针初始化,设置显示初始位置
  76. }
  77. /**********************主程序*************************/
  78. void main()
  79. {
  80.         uchar i;                                        //定义循环变量
  81.         P0M0 = 0x00;
  82.         P0M1 = 0x00;
  83.         P1M0 = 0x00;
  84.         P1M1 = 0x00;
  85.         P2M0 = 0x00;
  86.         P2M1 = 0x00;
  87.         P3M0 = 0x00;
  88.         P3M1 = 0x00;
  89.         init();                                                //初始化程序
  90.         /******用for循环按字节逐个写********/
  91.         write_com(0x80);                        //数据指针第一行起始0x80位置
  92.         for(i=0;i<16;i++)                        //每循环一次写一个字节数据
  93.         {
  94.                 write_date(table1[i]);        //写一个字节数据               
  95.         }
  96.         write_com(0xc0);                        //数据指针第二行起始位置0x80+0x40=0xc0
  97.         for(i=0;i<16;i++)                        //每循环一次写一个字节数据
  98.         {
  99.                 write_date(table2[i]);        //写一个字节数据               
  100.         }
  101.         while(1);
  102. }

复制代码


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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