📄 serial.c
字号:
#include <reg51.h>
#include "LM016L.H"
unsigned char RData[17],j;
unsigned char TData[] = "INT0 Interrupt .";
unsigned char *str;
////////////////// LCD ////////////////////////
//初始化LCD
void LCD_Initial()
{
LCDE = 0;
LCD_Write(LCDCOMMAND,0x38);
LCD_Write(LCDCOMMAND,0x38);
LCD_SetDisplay(LCDSHOW | LCDNOCURSOR);
LCD_Write(LCDCOMMAND,LCDCLEARSCREEN);
LCD_SetInput(LCDACUP | LCDNOMOVE);
}
//内部等待函数
unsigned char LCD_Wait(void)
{
LCDRS = 0;
LCDRW = 1;
_nop_();
LCDE = 1;
_nop_();
//while(LCDDB & 0x80);
LCDE = 0;
return LCDDB;
}
//向LCD写入命令或数据
void LCD_Write(bit style, unsigned char input)
{
LCDE = 0;
LCDRS = style;
LCDRW = 0;
_nop_();
LCDDB = input;
_nop_();
LCDE = 1;
_nop_();
LCDE = 0;
_nop_();
LCD_Wait();
}
//设置显示模式
void LCD_SetDisplay(unsigned char DisplayMode)
{
LCD_Write(LCDCOMMAND,0x08 | DisplayMode);
}
//设置输入模式
void LCD_SetInput(unsigned char InputMode)
{
LCD_Write(LCDCOMMAND,0x04 | InputMode);
}
void GotoXY(unsigned char x, unsigned char y)
{
if(y == 0)
{
LCD_Write(LCDCOMMAND,0x80 | x);
}
if(y == 1)
{
LCD_Write(LCDCOMMAND,0x80 | (x - 0x40));
}
}
void Print(unsigned char *str)
{
while(*str != '\0')
{
LCD_Write(LCDDB,*str);
str++;
}
}
////////////////// 80C51 ////////////////////////
void Serial_Initial()
{
TMOD = 0x20; // 定时器1工作于8位自动重载模式, 用于产生波特率
TH1 = 0xFD; // 波特率9600
TL1 = 0xFD;
SCON = 0x50; // 设定串行口工作方式
PCON &= 0xef; // 波特率不倍增
TR1 = 1; // 启动定时器1
ES = 1; // 允许串口中断中断
EA = 1;
}
void INT0_Initial()
{
EX0 = 1; // INT0中断开
IT0 = 1; // INT0低电平触发(为1则为下降沿触发)
EA = 1;
}
void Serial_interrupt() interrupt 4
{
EA = 0;
RI = 0;
RData[j] = SBUF;
j++;
EA = 1;
}
void INT0_interrupt() interrupt 0
{
EA = 0;
str = TData;
while(*str != '\0')
{
TI = 0;
SBUF = *str;
while(!TI);
TI = 0;
str++;
}
EA = 1;
}
////////////////// main ////////////////////////
void main()
{
LCD_Initial();
Serial_Initial();
INT0_Initial();
while(1)
{
if(j > 15)
{
GotoXY(0,0);
RData[16] = '\0';
Print(RData);
j = 0;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -