第12章-指針基礎與1602液晶的初步認識
老規(guī)矩,,,c語言部分跳過











//課后作業(yè)3,,串口下發(fā)字符,進行顯示
//寫錯了,,,寫成字符串了,,,
#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
// 開發(fā)板
#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;
?? ??? ?}
?? ?}
}








