找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6028|回复: 11
收起左侧

LCD1602的8个数据口,怎么定义到单片机引脚

  [复制链接]
ID:608872 发表于 2020-1-6 17:29 | 显示全部楼层 |阅读模式
我原来用STC89C52做的LCD1602显示,现在想改成个头小的STC15F204,哪位大神可以告知




现在想把引脚改成这样,应该怎么写程序呢

现在想把引脚改成这样,应该怎么写程序呢

原来直接定义到P0口 #define lcddata P0

原来直接定义到P0口    #define lcddata P0
回复

使用道具 举报

ID:403593 发表于 2020-1-6 19:47 | 显示全部楼层
这样做不行,8位的并口,所有的数据线必须都在单片机的同一组IO口上
回复

使用道具 举报

ID:213173 发表于 2020-1-6 21:19 | 显示全部楼层
给你写一个异组端口驱动LCD示例
无标题.jpg

  1. #include <reg51.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char

  4. sbit LCD_RW=P2^5;
  5. sbit LCD_RS=P2^6;       
  6. sbit LCD_EN=P2^7;       

  7. sbit code0=P1^1;                                        //定义LCD数据端口
  8. sbit code1=P1^0;
  9. sbit code2=P3^7;
  10. sbit code3=P3^6;
  11. sbit code4=P3^3;
  12. sbit code5=P3^2;
  13. sbit code6=P3^1;
  14. sbit code7=P3^0;       

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


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

  63.         write_com(0x38);//设置16*2显示,5*7点阵,8位数据接口
  64.         write_com(0x01);//显示清零,数据指针清零
  65.         write_com(0x0c);//设置开显示,不显光标
  66.         write_com(0x06);//设置写一个字符后地址指针加1
  67.         write_com(0x80);//数据指针初始化,设置显示初始位置
  68. }
  69. /**********************主程序*************************/
  70. void main()
  71. {
  72.         uchar i;                                        //定义循环变量
  73.         init();                                                //初始化程序
  74. /******用for循环按字节逐个写********/
  75.         write_com(0x80);                        //数据指针第一行起始0x80位置
  76.         for(i=0;i<16;i++)                        //每循环一次写一个字节数据
  77.         {
  78.                 write_date(table1[i]);        //写一个字节数据               
  79.         }
  80.         write_com(0xc0);                        //数据指针第二行起始位置0x80+0x40=0xc0
  81.         for(i=0;i<16;i++)                        //每循环一次写一个字节数据
  82.         {
  83.                 write_date(table2[i]);        //写一个字节数据               
  84.         }
  85.         while(1);
  86. }
复制代码



评分

参与人数 1黑币 +15 收起 理由
m182892 + 15

查看全部评分

回复

使用道具 举报

ID:155507 发表于 2020-1-6 21:57 | 显示全部楼层
LCD1602还有一种使用高4位数据线的接法,可以减少单片机的负担。
另外,RW的控制也并非是必用的,如果仅仅是用于读取LCD1602“忙”的状态,就可以用稍事等待来代替。这样一来,RW就可以直接接地,使LCD1602永远处于写入的状态。

那么,LCD1602和单片机之间就仅仅需要6条线了,这就是LCD1602最简洁的连接方法。
NewLCD1602_4Bit6WireProject.jpg


  1. /*
  2. 详解一种LCD1602 的4线接法
  3. LCD1602还有一种使用高4位数据线的接法,可以减少单片机的负担。
  4. 另外,RW的控制也并非是必用的,如果仅仅是用于读取LCD1602“忙”的状态,就可以用稍事等待来代替。这样一来,RW就可以直接接地,使LCD1602永远处于写入的状态。

  5. 那么,LCD1602和单片机之间就仅仅需要6条线了,这就是LCD1602最简洁的连接方法。

  6. */
  7. #include <reg51.h>
  8. #include <stdio.h>

  9. #define Hi 1
  10. #define Lo 0

  11. #ifndef TRUE
  12. #define TRUE 1
  13. #endif

  14. #ifndef FALSE
  15. #define FALSE 0
  16. #endif

  17. #define RIGHT 0
  18. #define LEFT  1

  19. void init_lcd(void);      //LCD初始化
  20. //void write_high_lcd(unsigned char Val);
  21. void gotoxy_lcd(unsigned char col,unsigned char line);  //按指定坐标
  22. void putc_lcd(unsigned char byte);        //显示一个字符
  23. void print_lcd(char String[]);            //显示一串字符
  24. void delay_lcd(void);                     //LCD显示延时
  25. void write_lcd(unsigned char Val);        //发送一个字符
  26. //void write_low_lcd(unsigned char Val);
  27. void write_command_lcd(char cmd);         // 写入指令
  28. //void scroll_lcd(char enable, char dir);
  29. //void clear_lcd();
  30. void write_nibble_lcd(unsigned char Val);  //使用的是4位数据传输

  31. //数据口
  32. sbit RS = P3^7;  //LCD寄存器选择
  33. sbit En = P3^6;  //LCD使能控制
  34. sbit D0 = P3^3; //由4位的接线是接到LCD口的高四位
  35. sbit D1 = P3^2;
  36. sbit D2 = P3^1;
  37. sbit D3 = P3^0;


  38. void delay (unsigned int m) //延时函数
  39. { while(--m); }

  40. void delay_lcd (void) //LCD显示延时
  41. {
  42.         unsigned int del1, del2;
  43.         for(del1=0;del1<10;del1++)
  44.         {
  45.                 for(del2=0;del2<200;del2++);
  46.         }
  47. }


  48. void init_lcd (void)    //LCD初始化
  49. {
  50.         RS = Lo;  //写入命令   0 选择发送命令    1 选择发送数据
  51.         write_nibble_lcd(0x03);        delay_lcd();
  52.         write_nibble_lcd(0x03);        delay_lcd();
  53.         write_nibble_lcd(0x02);        delay_lcd();
  54.         write_lcd(0x28);    //在四位线下的初始化
  55.         write_lcd(0x06);    //写一个指针加1
  56.         write_lcd(0x0c);    //开显示不显示光标
  57.         write_lcd(0x01);    //清屏
  58. }  

  59. void gotoxy_lcd(unsigned char col,unsigned char line) //按指定坐标
  60. {
  61.         RS = Lo;  //写入命令   0 选择发送命令    1 选择发送数据
  62.         if (line == 1)
  63.         write_lcd(0x7f+col);
  64.         if (line == 2)
  65.         write_lcd(0xbf+col);
  66. }

  67. void write_command_lcd(char cmd)  // 写入指令
  68. {
  69.         RS = Lo;
  70.         write_lcd(cmd);
  71.    
  72. }

  73. void putc_lcd(unsigned char byte) //显示一个字符
  74. {
  75.         RS = Hi;  //写入数据   0 选择发送命令    1 选择发送数据
  76.         write_lcd(byte);
  77. }

  78. void print_lcd(char String[]) //显示一串字符
  79. {
  80.         int i = 0;
  81.         do
  82.         {
  83.                 putc_lcd(String[i]);
  84.                 i++;
  85.         }
  86.         while(String[i] != '\0');
  87. }

  88. void write_lcd(unsigned char Val) //发送一个字符
  89. {
  90.         write_nibble_lcd(Val >> 4);
  91.         write_nibble_lcd(Val);
  92.         delay_lcd();
  93. }

  94. void write_nibble_lcd(unsigned char Val) //使用的是4位数据传输
  95. {
  96.         En = Hi;   //写入时序
  97.         D0 = D1 = D2 = D3 = 0;
  98.         if(Val & 0x01)
  99.         D0 = 1;
  100.         if(Val & 0x02)
  101.         D1 = 1;
  102.         if(Val & 0x04)
  103.         D2 = 1;
  104.         if(Val & 0x08)
  105.         D3 = 1;
  106.         En = Lo;   //使能清零
  107. }


  108. void main() //主函数
  109. {
  110.        
  111.         init_lcd(); //LCD初始化
  112.         write_command_lcd(0x01);  //清屏
  113.         gotoxy_lcd(1,2);
  114.         print_lcd("Hello 4 Bit LCD");
  115.         gotoxy_lcd(1,1);
  116.         while(1)
  117.         {
  118.                 putc_lcd('a'); putc_lcd('b'); delay(65255);delay(65255);
  119.         }
  120. }

复制代码





回复

使用道具 举报

ID:160500 发表于 2020-1-6 22:01 | 显示全部楼层
这样写程序很麻烦的,要控制好LCD1602的控制信号,把数据分开到不同的IO口,读取的时候还要合并数据,麻烦。
回复

使用道具 举报

ID:444039 发表于 2020-1-6 22:47 | 显示全部楼层
随便定义,定义后写一个子程序,在子程序中对数据转移至相应位的引脚中即可。
回复

使用道具 举报

ID:475247 发表于 2020-1-7 10:55 | 显示全部楼层
P1与P3口都可以用,如果你要用外部中断就只能用P1口,具体看你的要求来定
回复

使用道具 举报

ID:307020 发表于 2020-1-8 00:38 | 显示全部楼层
并行数据需要按顺序接到1个完整的8位口上去
回复

使用道具 举报

ID:584814 发表于 2020-1-8 10:50 | 显示全部楼层
用1602的4+2线方案吧,省P口。
还可以花2块钱淘个IIC接口,只要2线就可以,还可以控制背光。
以上线数不包括电源的2线。
回复

使用道具 举报

ID:130230 发表于 2020-1-8 11:38 | 显示全部楼层
接到一组IO口
回复

使用道具 举报

ID:608872 发表于 2020-1-8 11:51 | 显示全部楼层
wulin 发表于 2020-1-6 21:19
给你写一个异组端口驱动LCD示例

谢谢,顺利移植成功
回复

使用道具 举报

ID:608872 发表于 2020-1-8 15:23 | 显示全部楼层
angmall 发表于 2020-1-6 21:57
LCD1602还有一种使用高4位数据线的接法,可以减少单片机的负担。
另外,RW的控制也并非是必用的,如果仅仅 ...

谢谢,显示成功了。这个高4位的接法是不是要比8位的刷新慢呢?我原来8位的3秒刷新显示,用4位的要12秒
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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