找回密码
 立即注册
搜索
热搜: 中医 针灸 咳嗽
查看: 148|回复: 0

LCD1602

[复制链接]

3706

主题

1

回帖

1万

积分

管理员

积分
11870
发表于 2023-2-27 19:04:48 | 显示全部楼层 |阅读模式
实现了基本的LCD1602驱动,包括了显示字符、字符串、整数和小数,以及显示位置的控制。
其中,lcd_busy()函数用来检测LCD是否忙,
lcd_write_cmd()函数用来发送命令,
lcd_write_data()函数用来发送数据,
lcd_set_pos()函数用来设置显示位置,
lcd_show_char()函数用来显示单个字符,
lcd_show_str()函数用来显示字符串,
lcd_show_int()函数用来显示整数,
lcd_show_float()函数用来显示浮点数。
  1. #include <reg52.h> //包含了STC89C52的头文件
  2. #include <stdio.h>
  3. sbit RS = P3 ^ 5; // 将寄存器选择引脚RS定义为P3.5
  4. sbit RW = P3 ^ 6; // 将读写选择引脚RW定义为P3.6
  5. sbit EN = P3 ^ 4; // 将使能引脚EN定义为P3.4

  6. void lcd_show_int(unsigned char x, unsigned char y, int num);
  7. void lcd_show_float(unsigned char x, unsigned char y, float num);
  8. void lcd_show_str(unsigned char x, unsigned char y, char *str);
  9. void lcd_show_char(unsigned char x, unsigned char y, unsigned char dat);
  10. void lcd_init();
  11. void lcd_set_pos(unsigned char x, unsigned char y);
  12. void lcd_write_data(unsigned char dat);
  13. void lcd_write_cmd(unsigned char cmd);
  14. void lcd_busy();
  15. void delay(unsigned int i);

  16. void main()
  17. {
  18.     lcd_init();                         // 初始化LCD
  19.     lcd_show_str(0, 0, "Hello World!"); // 显示字符串
  20.     lcd_show_int(0, 1, 123);            // 显示整数
  21.     lcd_show_float(6, 1, 596.0422);       // 显示浮点数
  22.     while (1)
  23.         ; // 循环等待
  24. }

  25. void delay(unsigned int i)
  26. { // 延迟函数,i为延迟时间
  27.     unsigned int j;
  28.     for (; i > 0; i--) {
  29.         for (j = 0; j < 125; j++)
  30.             ;
  31.     }
  32. }

  33. void lcd_busy()
  34. { // 判断LCD是否忙的函数
  35.     unsigned char busy;
  36.     P0 = 0xFF; // 将P0口设为输入模式
  37.     RS = 0;    // RS置为低电平
  38.     RW = 1;    // RW置为高电平
  39.     EN = 0;    // 使能引脚EN置为低电平
  40.     delay(5);  // 延时5ms
  41.     do {
  42.         EN   = 1;          // 使能引脚EN置为高电平
  43.         busy = P0;         // 读取P0口的值
  44.         EN   = 0;          // 使能引脚EN置为低电平
  45.     } while (busy & 0x80); // 判断busy的最高位是否为1
  46.     P0 = 0x00;             // 将P0口设为输出模式
  47. }

  48. void lcd_write_cmd(unsigned char cmd)
  49. {               // 发送命令的函数
  50.     lcd_busy(); // 判断LCD是否忙
  51.     RS = 0;     // RS置为低电平
  52.     RW = 0;     // RW置为低电平
  53.     EN = 0;     // 使能引脚EN置为低电平
  54.     P0 = cmd;   // 将命令写入P0口
  55.     EN = 1;     // 使能引脚EN置为高电平
  56.     EN = 0;     // 使能引脚EN置为低电平
  57. }

  58. void lcd_write_data(unsigned char dat)
  59. {               // 发送数据的函数
  60.     lcd_busy(); // 判断LCD是否忙
  61.     RS = 1;     // RS置为高电平
  62.     RW = 0;     // RW置为低电平
  63.     EN = 0;     // 使能引脚EN置为低电平
  64.     P0 = dat;   // 将数据写入P0口
  65.     EN = 1;     // 使能引脚EN置为高电平
  66.     EN = 0;     // 使能引脚EN置为低电平
  67. }

  68. void lcd_set_pos(unsigned char x, unsigned char y)
  69. { // 设置显示位置的函数
  70.     unsigned char pos;

  71.     if (y == 0) {       // 第一行
  72.         pos = 0x80 + x; // 计算显示位置
  73.     } else {            // 第二行
  74.         pos = 0xC0 + x; // 计算显示位置
  75.     }
  76.     lcd_write_cmd(pos); // 发送命令,设置显示位置
  77. }

  78. void lcd_init()
  79. {                        // LCD初始化函数
  80.     lcd_write_cmd(0x38); // 设置LCD显示模式为2行,5*7点阵
  81.     lcd_write_cmd(0x0C); // 显示开,不显示光标,不闪烁
  82.     lcd_write_cmd(0x06); // 文字不动,地址自动+1
  83.     lcd_write_cmd(0x01); // 清屏
  84. }

  85. void lcd_show_char(unsigned char x, unsigned char y, unsigned char dat)
  86. {                        // 显示单个字符的函数
  87.     lcd_set_pos(x, y);   // 设置显示位置
  88.     lcd_write_data(dat); // 发送数据,显示字符
  89. }

  90. void lcd_show_str(unsigned char x, unsigned char y, char *str)
  91. {                               // 显示字符串的函数
  92.     lcd_set_pos(x, y);          // 设置显示位置
  93.     while (*str) {              // 当字符串不为空
  94.         lcd_write_data(*str++); // 发送数据,显示字符
  95.     }
  96. }
  97. /*
  98. 参数1 x:第几行
  99. 参数2 y:第几列
  100. 参数3 num:具体数值
  101. */
  102. void lcd_show_float(unsigned char x, unsigned char y, float num)
  103. {                            // 显示浮点数的函数
  104.     int integer  = (int)num; // 整数部分
  105.     int integer2 = integer;
  106.     int decimal  = (int)((num - integer) * 100); // 小数部分,保留2位
  107.     int wei_cout = 0;
  108.     while (integer2) {
  109.         integer2 /= 10;
  110.         wei_cout++;
  111.     }
  112.     // 计算整数部分位数

  113.     lcd_show_int(x, y, integer);                        // 先显示整数部分
  114.     lcd_write_data('.');                                // 小数点
  115.     if (wei_cout == 0) {                                // 如果整数部分=0
  116.         if (decimal > 10) {                             // 如果小数部分>0.1
  117.             lcd_show_int(x + wei_cout + 2, y, decimal); // 再显示小数部分
  118.         } else {                                        // 如果小数部分<=0.1
  119.             lcd_show_int(x + wei_cout + 2, y, 0);
  120.             lcd_show_int(x + wei_cout + 3, y, decimal);
  121.         }

  122.     } else {                                            // 如果整数部分大于0
  123.                                                         // lcd_show_int(x + wei_cout + 1, y, decimal); // 再显示小数部分
  124.         if (decimal > 10) {                             // 如果小数部分>0.1
  125.             lcd_show_int(x + wei_cout + 1, y, decimal); // 再显示小数部分
  126.         } else {                                        // 如果小数部分<=0.1
  127.             lcd_show_int(x + wei_cout + 1, y, 0);
  128.             lcd_show_int(x + wei_cout + 2, y, decimal);
  129.         }
  130.     }
  131. }

  132. void lcd_show_int(unsigned char x, unsigned char y, int num)
  133. {                            // 显示整数的函数
  134.     char str[16];            // 定义一个字符串数组
  135.     sprintf(str, "%d", num); // 将整数转换为字符串
  136.     lcd_show_str(x, y, str); // 调用显示字符串的函数,显示整数
  137. }
复制代码
在主函数中,先调用lcd_init()函数初始化LCD,然后调用各个显示函数,最后进入循环等

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

本版积分规则

Archiver|手机版|小黑屋|私人站点 ( 冀ICP备2023028127号-2 )

GMT+8, 2025-4-20 02:26 , Processed in 0.081408 second(s), 21 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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