欢迎光临散文网 会员登陆 & 注册

第12章-指针基础与1602液晶的初步认识

2023-09-09 13:29 作者:feifeiluan2  | 我要投稿

老规矩,,,c语言部分跳过

//课后作业3,,串口下发字符,进行显示
//写错了,,,写成字符串了,,,

#include "reg52.h"

///////////////////// use keil ///////////////////////
#if defined(__C51__)
// 通用类型
typedef signed char i8;
typedef signed int i16;
typedef signed long i32;
typedef unsigned char u8;
typedef unsigned int u16;
typedef unsigned long u32;

sfr16 TMR2 = 0xCC;  /* Timer 2: T2L 0CCh, T2H 0CDh */
sfr16 RCAP2 = 0xCA; /* RCAP2L 0CAh, RCAP2H 0CBh */
#define NOP _nop_();
extern void _nop_(void);
extern int sprintf(char *, const char *, ...);
extern int sscanf(char *, const char *, ...);

// 中断号
#define EX0_INT interrupt 0
#define T0_INT interrupt 1
#define EX1_INT interrupt 2
#define T1_INT interrupt 3
#define UART_INT interrupt 4
#define T2_INT interrupt 5

#endif

// 开发板
#define SYS_CLK (11059200)
#define MCU_nT (12)
#define TIMER_CLK (SYS_CLK / MCU_nT)

//////////////////////////////////////////////////////

#define LCD1602_DB P0
sbit LCD1602_RS = P1 ^ 0;
sbit LCD1602_RW = P1 ^ 1;
sbit LCD1602_E = P1 ^ 5;

bit uartCntEnFlag = 0;
u8 uartCnt = 0;

bit strReadyFlag = 0;
u8 strBuff[32];
u8 strCnt = 0;

u8 TH0RL, TL0RL;

void LcdWaitReady(void)
{
    u8 sta;

    LCD1602_DB = 0xFF;
    LCD1602_RS = 0;
    LCD1602_RW = 1;
    do
    {
        LCD1602_E = 1;
        sta = LCD1602_DB;
        LCD1602_E = 0;
    } while (sta & 0x80);
}
void LcdWriteCmd(u8 cmd)
{
    LcdWaitReady();
    LCD1602_RS = 0;
    LCD1602_RW = 0;
    LCD1602_DB = cmd;
    LCD1602_E = 1;
    LCD1602_E = 0;
}

void LcdWriteDat(u8 dat)
{
    LcdWaitReady();
    LCD1602_RS = 1;
    LCD1602_RW = 0;
    LCD1602_DB = dat;
    LCD1602_E = 1;
    LCD1602_E = 0;
}

void InitLcd1602(void)
{
    LcdWriteCmd(0x38);
    LcdWriteCmd(0x0C);
    LcdWriteCmd(0x06);
    LcdWriteCmd(0x01);
}

void LcdSetCursor(u8 hang, u8 lie)
{
    u8 addr;

    if (hang == 0)
        addr = 0 + lie;
    else
        addr = 0x40 + lie;
    LcdWriteCmd(0x80 + addr);
}

void LcdShowStr(u8 hang, u8 lie, u8 *str)
{
    LcdSetCursor(hang, lie);
    while (*str != '\0')
    {
        LcdWriteDat(*str++);
    }
}

void ConfigUART(u32 baud)
{
    // UART
    SCON = 0x50;
    ES = 1;

    // T1
    TMOD = (TMOD & 0x0F) | 0x20;
    TH1 = TL1 = 256 - (TIMER_CLK / 32 / baud);
    ET1 = 0;
    TR1 = 1;
}

void ConfigTimer0(u8 ms)
{
    u16 tmp = 65536 - (TIMER_CLK * ms / 1000);

    TMOD = (TMOD & 0xF0) | 0x01;
    TH0 = TH0RL = (u8)(tmp >> 8);
    TL0 = TL0RL = (u8)(tmp);
    ET0 = TR0 = 1;
}

void main(void)
{
    EA = 1;

    InitLcd1602();
    ConfigTimer0(1);
    ConfigUART(9600);

    while (1)
    {
        if (strReadyFlag)
        {
            LcdShowStr(0, 0, strBuff);
            strReadyFlag = 0;
            strCnt = 0;
        }
    }
}

void UART_ISR(void) UART_INT
{
    if (TI)
    {
        TI = 0;
    }
    if (RI)
    {
        RI = 0;
        strBuff[strCnt++] = SBUF;
        uartCnt = 0;
        uartCntEnFlag = 1;
    }
}

void T0_ISR(void) T0_INT
{
    TH0 = TH0RL;
    TL0 = TL0RL;

    if (uartCntEnFlag)
    {
        uartCnt++;
        if (uartCnt > 100)
        {
            uartCntEnFlag = 0;
            uartCnt = 0;
            strBuff[strCnt++] = '\0';
            strReadyFlag = 1;
        }
    }
}


第12章-指针基础与1602液晶的初步认识的评论 (共 条)

分享到微博请遵守国家法律