第12章-指针基础与1602液晶的初步认识
老规矩,,,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;
}
}
}








