找回密码
 立即注册
查看: 58|回复: 2

8051单片机,用6线驱动1602共用6个IO口,并行驱动显示

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2025-12-02 12:35:23
已绑定手机

1

主题

0

回帖

7

积分

新手上路

积分
7
发表于 2025-12-2 12:35:23 | 显示全部楼层 |阅读模式

51通常的例程,大部分是用并行8线来驱动的,我们尝试用4线,分两次发送。写命令和数据。这样的话数据口就只用4条线。



1602管脚图

1602管脚图


R/W线,因为我们主要用的是写数据,或者是写命令,很少用到读,只有需要读忙状态才用到,我们可以用1毫秒的延时来替代,这样的话直接R/W接地。

1602.jpg

上接线图,R22是用来限流,可以直接接VCC也就是直接连到2脚上,16脚直接连到1脚上。
3脚VL,接1K电阻到1脚,这样能正常显示,只是不能调节对比度,管它呢,只要能显示就行。
这样一来 ,需要8条线,两条电源线,6条数据线。

硬件连线上图

连线.jpg


没有找到碳膜电阻用个0603焊上了。

硬件接完了,接下来就是函数了。
我们不做太多显示,只显示一个字符,证明能显示就是。

分下面几部
1,定义管脚
2,写一个字节数据函数
3,写一个字节命令函数
4,屏幕初始化
5,写一个需要显示位置的函数
这样就可以显示字符了

写函数之前强调一下,通常的1602规格书没有介绍,4线和8线如何配置,其实初始化写命令时把,0X38改成0X28就改好了。


写一个字节数据

  1. //写一个字节数据
  2. void LCD1602_Write_Data(unsigned char dat) //写数据
  3. {
  4.             
  5.                  DelayXms(1); //毫秒延时  跳过忙检测
  6.              RS = 1; //发数据写 1
  7.        
  8.              //写高4位
  9.              //Data_IO_Port = dat & 0xF0;//写高4位             
  10.              LCD_Data8 = dat & 0x80;  // 1000 0000
  11.              LCD_Data7 = dat & 0x40;  // 0100 0000
  12.              LCD_Data6 = dat & 0x20;  // 0010 0000
  13.              LCD_Data5 = dat & 0x10;  // 0001 0000
  14.        
  15.                  EN = 1; //打开使能
  16.                  Delay10us();//10微秒延时
  17.              EN = 0; //关闭使能
  18.        
  19.              //写低4位
  20.              //Data_IO_Port = dat  << 4;//写低4位
  21.              LCD_Data8 = dat & 0x08; //0000 1000
  22.              LCD_Data7 = dat & 0x04; //0000 0100
  23.              LCD_Data6 = dat & 0x02; //0000 0010
  24.              LCD_Data5 = dat & 0x01; //0000 0001
  25.        
  26.              EN = 1; //打开使能
  27.                  Delay10us();//10微秒延时
  28.              EN = 0; //关闭使能
  29.        
  30. }
复制代码
写一个字节命令

  1. //写一个字节命令
  2. void LCD1602_Write_Cmd(unsigned char Cmd) //写命令
  3. {
  4.        
  5.              DelayXms(1); //毫秒延时  跳过忙检测
  6.              RS = 0; //发命令写 0
  7.        
  8.              //写高4位
  9.              //Data_IO_Port = dat;//高4位
  10.        
  11.              LCD_Data8 = Cmd & 0x80;  // 1000 0000
  12.              LCD_Data7 = Cmd & 0x40;  // 0100 0000
  13.              LCD_Data6 = Cmd & 0x20;  // 0010 0000
  14.              LCD_Data5 = Cmd & 0x10;  // 0001 0000
  15.                      
  16.              EN = 1; //打开使能
  17.                  Delay10us();//10微秒延时
  18.              EN = 0; //关闭使能
  19.        
  20.              //写低4位
  21.              //Data_IO_Port = dat <<4;//低4位
  22.        
  23.              LCD_Data8 = Cmd & 0x08; //0000 1000
  24.              LCD_Data7 = Cmd & 0x04; //0000 0100
  25.              LCD_Data6 = Cmd & 0x02; //0000 0010
  26.              LCD_Data5 = Cmd & 0x01; //0000 0001
  27.        
  28.              EN = 1; //打开使能
  29.                  Delay10us();//10微秒延时
  30.              EN = 0; //关闭使能
  31.        
  32. }
复制代码



屏幕初始化

  1. //屏幕初始化
  2. void LCD1602_LCDInit() //屏幕初始化
  3. {
  4.            LCD1602_Write_Cmd(0x28);   //4位接口,2行显示 5*8点阵
  5.            DelayXms(10); //毫秒延时
  6.            LCD1602_Write_Cmd(0x28);   //4位接口,2行显示 5*8点阵
  7.            LCD1602_Write_Cmd(0x01);   //清屏指令
  8.            LCD1602_Write_Cmd(0x06);   //指针自增
  9.            LCD1602_Write_Cmd(0x0C);   //显示开,光标关
  10.        
  11. }
复制代码


显示位置
  1. void LCD1602_Position_ShowString(bit x, unsigned char y)//显示字符串 //参数1:显示行位置(0和1)。参数2:显示列位置。
  2. {
  3.          unsigned char position; //位置
  4.      if(x == 0)
  5.                  {
  6.           position = 0x80 + y;//显示上行的位置
  7.      }
  8.                  else
  9.                  {
  10.           position = 0xC0 + y;//显示下行的位置
  11.      }
  12.      LCD1602_Write_Cmd(position); //写入位置
  13. }
复制代码


Delay 里面如下
  1. #include "delay.h"
  2. #include <intrins.h>  //包含空语句
  3. void Delay10us(void)//10微秒延时        //@11.0592MHz
  4. {
  5.         unsigned char data i;
  6.         i = 2;
  7.         while (--i);
  8. }
  9. void Delay1ms() //1毫秒延时                //@11.0592MHz
  10. {
  11.         unsigned char data i, j;
  12.         _nop_();
  13.         i = 2;
  14.         j = 199;
  15.         do
  16.         {
  17.                 while (--j);
  18.         } while (--i);
  19.                
  20. }
  21. void DelayXms(unsigned int xms) //1毫秒延时
  22. {
  23.           unsigned char  i;       
  24.       for(i=xms;i>0;i--)
  25.        {
  26.            Delay1ms();                //@11.0592MHz
  27.        }
  28.           
  29. }
复制代码

这样就写好了接下来调用就行


主函数
  1. #include <reg52.h>
  2. #include "lcd1602.h"
  3. #include "delay.h"
  4. /*
  5.           测试单片机型号STC89C51RC
  6.                   晶振:外部晶振11.0592
  7. */
  8. void main()
  9. {
  10.                
  11.        
  12.           LCD1602_LCDInit(); //屏幕初始化
  13.           LCD1602_Position_ShowString(0,3);//参数1:显示行位置(0和1)。参数2:显示列位置
  14.       LCD1602_Write_Data('h');    //显示字符
  15.     while(1)
  16.         {
  17.        
  18.     }
  19. }
复制代码
上附件

1602串行显示.rar (30.29 KB, 下载次数: 3)






回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:647
  • 最近打卡:2025-12-18 07:29:35
已绑定手机

93

主题

6940

回帖

1万

积分

超级版主

积分
13026
发表于 2025-12-2 13:03:15 | 显示全部楼层
六年前写的4位并口1602程序供参考

  1. #include <STC89C5xRC.H>
  2. #define                LCD1602_RS                P22
  3. #define                LCD1602_EN                P23
  4. #define                LCD1602_D4                P24
  5. #define                LCD1602_D5                P25
  6. #define                LCD1602_D6                P26
  7. #define                LCD1602_D7                P27
  8. #define                Command                                                                0
  9. #define                Data                                                                1
  10. #define                Clear_Display                                                0x01        //Clear_Display
  11. #define                Return_Home                                                        0x02        //Return_Home
  12. #define                Entry_Mode_Cursor_Left                                0x04        //Entry_Mode_Set
  13. #define                Entry_Mode_Entire_Right                                0x05        //Entry_Mode_Set
  14. #define                Entry_Mode_Cursor_Right                                0x06        //Entry_Mode_Set
  15. #define                Entry_Mode_Entire_Left                                0x07        //Entry_Mode_Set
  16. #define                Display_Off                                                        0x08        //Display_ON/OFF
  17. #define                Display_On                                                        0x0c        //Display_ON/OFF
  18. #define                Display_On_Cursor_Off_Blink_On                0x0d        //Display_ON/OFF
  19. #define                Display_On_Cursor_On_Blink_Off                0x0e        //Display_ON/OFF
  20. #define                Display_On_Cursor_On_Blink_On                0x0f        //Display_ON/OFF
  21. #define                Cursor_Move_Left                                        0x10        //Cursor_or_Display_Shift
  22. #define                Cursor_Move_Right                                        0x14        //Cursor_or_Display_Shift
  23. #define                Display_Move_Left                                        0x18        //Cursor_or_Display_Shift
  24. #define                Display_Move_Right                                        0x1c        //Cursor_or_Display_Shift
  25. #define                Setting_Basic_Instruction_Set                0x28        //Function_Set
  26. #define                Setting_Extended_Instruction_Set        0x29        //Function_Set
  27. #define                Function_Set                                                0x38        //Function_Set
  28. #define                Contrast_Set                                                0x78        //Contrast_Set
  29. #define                Internal_OSC                                                0x14        //Internal_OSC
  30. #define                Power_ICON_Contrast                                        0x5e        //Power_ICON_Contrast
  31. #define                Follower_Control                                        0x6a        //Follower_Control
  32. #define                Power_ICON_Contrast                                        0x5e        //Power_ICON_Contrast
  33. unsigned char code Display_Hex[16]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x41,0x42,0x43,0x44,0x45,0x46};
  34. unsigned char code Display_Data1[32]=
  35. {
  36.         "LCD_1602_Program"        //0x80
  37.         "Conter:000000000"        //0xc0
  38. };
  39. /*----------------------------延时10us@STC-Y1@11.0592MHz----------------------------*/
  40. void Delay_10us(void)
  41. {
  42.         unsigned char i;
  43.         i=2;
  44.         while(--i);
  45. }
  46. /*----------------------------延时x10us----------------------------*/
  47. void Delay_x10us(unsigned char x)
  48. {
  49.         while(x--)
  50.                 Delay_10us();
  51. }
  52. /*----------------------------延时10ms@STC-Y1@11.0592MHz----------------------------*/
  53. void Delay_10ms(void)
  54. {
  55.         unsigned char i,j;
  56.         i=18;
  57.         j=235;
  58.         do
  59.         {
  60.                 while(--j);
  61.         }while(--i);
  62. }
  63. /*----------------------------延时x10ms----------------------------*/
  64. void Delay_x10ms(unsigned char x)
  65. {
  66.         while(x--)
  67.                 Delay_10ms();
  68. }
  69. /*----------------------------LCD1602_Enable----------------------------*/
  70. void LCD1602_Enable(void)
  71. {
  72.         LCD1602_EN=1;
  73.         Delay_10us();
  74.         LCD1602_EN=0;
  75. }
  76. /*----------------------------写命令或数据,x=0传送命令,x=1传送数据----------------------------*/
  77. void LCD1602_Write(unsigned char temp,bit x)
  78. {
  79.         LCD1602_RS=x;        //x=0传送命令,x=1传送数据
  80.         LCD1602_D4=temp&0x10;
  81.         LCD1602_D5=temp&0x20;
  82.         LCD1602_D6=temp&0x40;
  83.         LCD1602_D7=temp&0x80;
  84.         LCD1602_Enable();
  85.         LCD1602_D4=temp&0x01;
  86.         LCD1602_D5=temp&0x02;
  87.         LCD1602_D6=temp&0x04;
  88.         LCD1602_D7=temp&0x08;
  89.         LCD1602_Enable();
  90. }
  91. /*----------------------------整页显示字符----------------------------*/
  92. void Display_Text(unsigned char code *addr)
  93. {
  94.         unsigned char i;
  95.         LCD1602_Write(0x80,Command);        //设置DDRAM地址
  96.         Delay_10us();
  97.         for(i=0;i<16;i++)
  98.         {
  99.                 LCD1602_Write(*addr,Data);
  100.                 addr++;
  101.         }
  102.         LCD1602_Write(0xc0,Command);        //设置DDRAM地址
  103.         Delay_10us();
  104.         for(i=0;i<16;i++)
  105.         {
  106.                 LCD1602_Write(*addr,Data);
  107.                 addr++;
  108.         }
  109. }
  110. /*----------------------------指定位置显示字符----------------------------*/
  111. void Display_Data(unsigned char x,unsigned char y,unsigned char temp)
  112. {
  113.         switch(y)
  114.         {
  115.                 case 0:
  116.                         LCD1602_Write(0x80+x,Command);        //设置DDRAM地址
  117.                         Delay_10us();
  118.                         LCD1602_Write(temp,Data);
  119.                         break;
  120.                 case 1:
  121.                         LCD1602_Write(0xc0+x,Command);        //设置DDRAM地址
  122.                         Delay_10us();
  123.                         LCD1602_Write(temp,Data);
  124.                         break;
  125.         }
  126. }
  127. /*----------------------------初始化LCD1602----------------------------*/
  128. void LCD12864_Init(void)
  129. {
  130.         Delay_10ms();
  131.         Delay_10ms();
  132.         Delay_10ms();
  133.         Delay_10ms();                //延时40ms
  134. //        LCD1602_Write(Function_Set,Command);                                                //Function_Set
  135. //        Delay_x10us(200);        //延时2ms
  136. //        LCD1602_Write(Function_Set,Command);                                                //Function_Set
  137. //        Delay_x10us(3);                //延时3us
  138.         LCD1602_Write(Function_Set,Command);                                                //Function_Set
  139.         Delay_x10us(3);                //延时3us
  140.         LCD1602_Write(Setting_Basic_Instruction_Set,Command);                //Setting_Basic_Instruction_Set
  141.         Delay_x10us(3);                //延时3us
  142.         LCD1602_Enable();
  143.         LCD1602_Write(Setting_Extended_Instruction_Set,Command);        //Setting_Extended_Instruction_Set
  144.         Delay_x10us(3);                //延时3us
  145. //        LCD1602_Write(Cursor_Move_Right,Command);                                        //Cursor_Move_Right
  146. //        Delay_x10us(3);                //延时3us
  147. //        LCD1602_Write(Contrast_Set,Command);                                                //Contrast_Set
  148. //        Delay_x10us(3);                //延时3us
  149. //        LCD1602_Write(Internal_OSC,Command);                                                //Internal_OSC
  150. //        Delay_x10us(3);                //延时3us
  151. //        LCD1602_Write(Power_ICON_Contrast,Command);                                        //Power_ICON_Contrast
  152. //        Delay_x10us(3);                //延时3us
  153. //        LCD1602_Write(Follower_Control,Command);                                        //Follower_Control
  154. //        Delay_x10ms(20);        //延时200ms
  155.         LCD1602_Write(Display_On,Command);                                                        //Display_On
  156.         Delay_x10us(3);                //延时3us
  157.         LCD1602_Write(Clear_Display,Command);                                                //Clear_Display
  158.         Delay_x10us(200);        //延时2ms
  159. //        LCD1602_Write(Entry_Mode_Cursor_Right,Command);                                //Entry_Mode_Cursor_Right
  160. //        Delay_x10us(3);                //延时3us
  161. }
  162. void main(void)
  163. {
  164.         unsigned int a=0,b=0;
  165.         LCD12864_Init();
  166.         while(1)
  167.         {
  168.                 Display_Text(Display_Data1);
  169.                 while(1)
  170.                 {
  171.                         Display_Data(7,1,Display_Hex[a/10000]);
  172.                         Display_Data(8,1,Display_Hex[a%10000/1000]);
  173.                         Display_Data(9,1,Display_Hex[a%1000/100]);
  174.                         Display_Data(10,1,Display_Hex[a%100/10]);
  175.                         Display_Data(11,1,Display_Hex[a%10]);
  176.                         Display_Data(12,1,Display_Hex[b%10000/1000]);
  177.                         Display_Data(13,1,Display_Hex[b%1000/100]);
  178.                         Display_Data(14,1,Display_Hex[b%100/10]);
  179.                         Display_Data(15,1,Display_Hex[b%10]);
  180.                         Delay_x10ms(2);
  181.                         b++;
  182.                         if(b>=10000)
  183.                         {
  184.                                 b=0;
  185.                                 a++;
  186.                         }
  187.                 }
  188.         }
  189. }
复制代码


回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:268
  • 最近打卡:2025-12-18 08:51:37

814

主题

1万

回帖

2万

积分

管理员

积分
21329
发表于 2025-12-2 14:10:04 | 显示全部楼层
回复

使用道具 举报 送花

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

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-12-18 22:24 , Processed in 0.109483 second(s), 53 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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