51单片机-发送16进制数给LCD1602和串口

发布时间 2023-10-10 10:01:54作者: 风中狂笑
#include "reg52.h"
#include "string.h"
#include "LCD1602.h"
#define uchar unsigned char
#define uint unsigned int
typedef unsigned char u8;
typedef unsigned int u16;

void delay(u16 ms)
{
    u16 i, j;
    for (i = 0; i < ms; i++)
        for (j = 0; j < 110; j++)
            ;
}

void UART_Init(u8 baud)
{
    TMOD = 0x20; // 设置定时器1为8位自动重装模式
    SCON = 0x50; // 设置串口为8位可变波特率模式
    PCON = 0x00; // 波特率不加倍
    TH1 = baud;     // 设置波特率为9600
    TL1 = baud;     // 设置波特率为9600
    TR1 = 1;     // 启动定时器1
                 // ES = 1;         // 使能串口中断
                 // EA = 1;         // 使能总中断
                 // TR1 = 1;     // 启动定时器1
}

void UART_Send_Char(char dat)
{
    SBUF = dat; // 将数据加载到串口缓冲区
    while (!TI)
        ;    // 等待发送完成
    TI = 0; // 清除发送标志
}

void UART_Send_String(const char *str)
{
    int i;
    int len = strlen(str); // 计算字符串长度
    for (i = 0; i < len; i++)
    {
        UART_Send_Char(str[i]); // 逐个发送字符
    }
}

void show_hex(u8 hex)
{
    u8 i;
    for (i = 0; i < 8; i++)
    {
        if ((hex >> i) & 1)
        {
            LCD_ShowChar(1, 1, '1');
            UART_Send_Char('1'); // 发送数字1
        }
        else
        {
            LCD_ShowChar(1, 1, '0');
            UART_Send_Char('0'); // 发送数字1
        }
        delay(1000);
    }
}

// change hex number to binary number
char *tranHexToDec(u8 hex)
{
    int i;
    static char binary[9];
    binary[8] = '\0';

    for (i = 0; i < 8; i++)
    {
        binary[7 - i] = (hex & 1) + '0';
        hex >>= 1;
    }
    return binary;
}

void show_binary(u8 num)
{
    char *binary = tranHexToDec(num);
    LCD_ShowString(1, 1, binary);
    UART_Send_String(binary); // 发送string
}

void UART_Interrupt() interrupt 4
{
    if (RI)
    {
        RI = 0; // 清除接收标志
    }
    if (TI)
    {
        TI = 0; // 清除发送标志
    }
}

u8 hex_array[5] = {0x1a, 0x2b, 0x3c, 0x4d, 0x5e};

void main()
{
    u8 baud;
    int i;
    baud = 0xfd;
    UART_Init(baud); // 初始化UART
    LCD_Init();

    while (1)
    {
        u8 num = 0x1a;
        for (i = 0; i < 5; i++)
        {
            num = hex_array[i];
            // show_hex(num);
            show_binary(num);
            delay(1000);
        }
        // LCD_ShowNum(1, 1, num, 1);
        // LCD_ShowString(1, 10, "hello world!");
    }
}