找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 395|回复: 6
打印 上一主题 下一主题
收起左侧

虚拟串口通信实验,lcd怎么清除上次输入的数据

[复制链接]
跳转到指定楼层
楼主
再次输入的时候,lcd怎么清掉之前的数据

#include <REGX51.H>
#define uchar unsigned char
#define uint unsigned int
// 定义LCD控制引脚
sbit RS = P1^0;
sbit RW = P1^1;
sbit E = P1^2;
// 定义按键引脚
sbit KEY = P1^6;

// 定义数据数组
uchar data_to_send[8];
uchar received_data;

// 延时函数
void delayms(uint ms)
{
    uchar i;
    while (ms--)
        for (i = 0; i < 123; i++);
}

// 向LCD写指令函数
void w_com(uchar com)
{
    RS = 0;
    RW = 0;
    E = 1;
    P0 = com;
    E = 0;
    delayms(1);
}

// 向LCD写数据函数
void w_dat(uchar dat)
{
    RS = 1;
    RW = 0;
    E = 1;
    P0 = dat;
    E = 0;
    delayms(1);
}

// LCD初始化函数
void lcd_ini(void)
{
    delayms(10);
    w_com(0x38);
    delayms(10);
    w_com(0x0c);
    delayms(10);
    w_com(0x06);
    delayms(10);
    w_com(0x01);
    delayms(10);
    w_com(0x80);
    delayms(10);
}

// 通过串口发送一个字节数据
void send_data(uchar data_to_send)
{
    SBUF = data_to_send;
    while (TI == 0);
    TI = 0;
}

// 串口初始化函数
void uart_init()
{
    // 9600bps 11.0592MHz
    SCON = 0x50;        // 8位数据,可变波特率
    TMOD &= 0x0F;      // 清除定时器1模式位
    TMOD |= 0x20;      // 设定定时器1为8位自动重装方式
    TL1 = 0xFD;        // 设定定时初值
    TH1 = 0xFD;        // 设定定时器重装值
    ET1 = 0;           // 禁止定时器1中断
    TR1 = 1;           // 启动定时器1
    EA = 1;            // 开启总中断
    ES = 1;            // 开启串口中断
}

// 主函数
void main()
{
    uchar i;
    lcd_ini();
    uart_init();
    while (1)
    {
        if (KEY == 0)
        {
            delayms(20);
            if (KEY == 0)
            {
                for (i = 0; i < 8; i++)
                {
                    send_data(data_to_send[ i]);
                }
                while (KEY == 0);
            }
        }
    }
}

// 串口中断服务函数
void uart_interrupt() interrupt 4
{
    if (RI == 1)
    {
        RI = 0;
        received_data = SBUF;                 
        w_dat(received_data);
    }
}

51hei.png (240.57 KB, 下载次数: 0)

51hei.png
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:161164 发表于 2024-12-13 11:43 | 只看该作者
  1. void uart_interrupt() interrupt 4
  2. {
  3.         static char POS = 0;
  4.     if (RI == 1)
  5.     {
  6.         RI = 0;
  7.         received_data = SBUF;               
  8.         w_dat(received_data);
  9.                 POS++;
  10.                 if(POS>=32){
  11.                         POS = 0;
  12.                         w_com(0x80);                       
  13.                         w_com(0x01);
  14.                 }
  15.     }
  16. }
复制代码
回复

使用道具 举报

板凳
ID:1134495 发表于 2024-12-13 16:30 | 只看该作者

还是和之前一样
回复

使用道具 举报

地板
ID:1097337 发表于 2024-12-13 19:52 来自手机 | 只看该作者
要清除LCD1602上显示的上次发送的字符,你需要在程序中加入清除显示的代码。LCD1602提供了一个清除显示的指令,即指令码0x01。你可以定义一个函数来发送这个指令,从而清除LCD上的显示。  以下是你可以添加到程序中的代码:void main() {     uchar i;     lcd_ini();     uart_init();     while (1)     {         if (KEY == 0)         {             delayms(20);             if (KEY == 0)             {                 w_com(0x01); // 发送清除显示指令                  delayms(10); // 等待指令执行完成                  for (i = 0; i < 8; i++)                 {                     send_data(data_to_send[i]); // 假设data_to_send数组中存储了要发送的数据                 }                 while (KEY == 0);             }         }     } }
回复

使用道具 举报

5#
ID:1097337 发表于 2024-12-13 19:53 来自手机 | 只看该作者
请注意,这里的data_to_send数组应该是之前存储了要发送的数据,并且在发送新数据之前,你需要确保数组中的数据是最新的。此外,lcd_clear函数中的延迟是为了确保LCD有足够的时间来执行清除操作。根据你的LCD响应速度,这个延迟时间可能需要调整。
回复

使用道具 举报

6#
ID:1134495 发表于 2024-12-14 20:55 | 只看该作者
MCU2023 发表于 2024-12-13 19:52
要清除LCD1602上显示的上次发送的字符,你需要在程序中加入清除显示的代码。LCD1602提供了一个清除显示的指 ...

不太行
回复

使用道具 举报

7#
ID:161164 发表于 2024-12-16 09:11 | 只看该作者


  1. // 串口中断服务函数
  2. void uart_interrupt() interrupt 4
  3. {
  4.     static char POS = 0;
  5.     if (RI == 1)
  6.     {
  7.         RI = 0;
  8.         received_data = SBUF;
  9.         if(POS==16)
  10.         {
  11.             w_com(0xC0);
  12.         }
  13.         if(POS>=32)
  14.         {
  15.             POS = 0;
  16.             w_com(0x80);
  17.             w_com(0x01);
  18.                         delayms(2);
  19.         }
  20.         w_dat(received_data);
  21.         POS++;
  22.     }
  23. }
复制代码



回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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