📄 chuankou.c
字号:
/***********************************************************************
函数名称:串口通信
函数功能:实现串口半双工通信
说明:主机发送1-8数字是可控制单片机LED点亮
主机发送的单个字符可在LCD 上显示
主机发送的数据可原样返回
单片机P3_2---P3_7可向主机发送字符
李灿松
2008.7.20
***********************************************************************/
#include<reg52.h>
#include<intrins.h>
#include<absacc.h>
#define uchar unsigned char
#define L1602_DB0_DB7 P0 //定义1602的数据总线
uchar code tab[10]={0x28,0xeb,0x32,0xa2,0xe1,0xa4,0x24,0xea,0x20,0xa0,} ;
uchar code str[]={"I LOVE YOU FOR 10.2 "};
uchar code hello[]={"hello:"};
uchar data dat[4];
sbit L1602_RS=P2^0; //定义1602得RS控制线
sbit L1602_RW=P2^1; //定义1602得RW控制线
sbit L1602_E=P2^2; //定义1602的E控制线
sbit L1602_Busy=P0^7; //定义1602的测忙线
sbit P3_2=P3^2;
sbit P3_3=P3^3;
sbit P3_4=P3^4;
sbit P3_5=P3^5;
sbit P3_6=P3^6;
sbit P3_7=P3^7;
typedef bit BOOL ;
void init(void)
{
TMOD=0x20; //定时器1工作在方式2
PCON=0x00; //波特率不增倍
SCON=0x50; //串行工作方式3
TH1=0xFD; //SMOD=0时的初值
TL1=0xFD;
TR1=1;
}
/*void delay(void)
{
int k;
for(k=0;k<800;k++);
}
*/
/**********************************************************************************************
函数名称:显示函数
函数功能:显示接受的数据
说明:
**********************************************************************************************/
void display()
{
uchar t_shi,t_ge,t_feng,t_miao;
void LCM1602_Init();
void print(uchar a,uchar *str);
void print1(uchar a,uchar t);
void LCM1602_Delay(uchar count);
// if(k==49) P1=0xfe;
// else if(k==50) P1=0xfd;
// else if(k==51) P1=0xfb;
// else if(k==52) P1=0xf7;
// else if(k==53) P1=0xef;
// else if(k==54) P1=0xdf;
// else if(k==55) P1=0xbf;
// else if(k==56) P1=0x7f;
// else P1=0xff;
t_shi=dat[0];t_ge=dat[1];t_feng=dat[2];t_miao=dat[3];
LCM1602_Init();
print(0x80,hello);
print1(0xc0,t_shi);
print1(0xc1,t_ge);
print1(0xc2,t_feng);
print1(0xc3,t_miao);
LCM1602_Delay(5000);
}
void send_str()
// 传送字串
{
unsigned char i = 0;
while(str[i] != '\0')
{
SBUF = str[i];
while(!TI); // 等特数据传送
TI = 0; // 清除数据传送标志
i++; // 下一个字符
}
}
/**********************************************************************************************
函数名称:主函数
函数功能:主函数
说明:
**********************************************************************************************/
void main()
{
P2=0xff;
P0=0xff;
EA=1;
ES=1; //串行口中断开
init();
while(1)
{
display();
if(P3_2==0)
{
// SBUF='L'; //发送
// while(TI==0); //等待串口发送完毕
// TI=0;
send_str();
while(P3_2==0); //等待按键放
}
if(P3_3==0)
{
SBUF='b'; //发送
while(TI==0); //等待串口发送完毕
TI=0;
while(P3_3==0); //等待按键放
}
if(P3_4==0)
{
SBUF='i'; //发送
while(TI==0); //等待串口发送完毕
TI=0;
while(P3_4==0); //等待按键放
}
if(P3_5==0)
{
SBUF='y'; //发送
while(TI==0); //等待串口发送完毕
TI=0;
while(P3_5==0); //等待按键放
}
if(P3_6==0)
{
SBUF='n'; //发送
while(TI==0); //等待串口发送完毕
TI=0;
while(P3_6==0); //等待按键放
}
if(P3_7==0)
{
SBUF='g'; //发送
while(TI==0); //等待串口发送完毕
TI=0;
while(P3_7==0); //等待按键放
}
}
}
serial () interrupt 4 using 1
{
int i;
if(RI==1)
{
RI=0;
for(i=0;i<4;i++)
{
dat[i]=SBUF; //接受
SBUF=dat[i]; //发送
}
while(TI==0);
TI=0;
}
}
/**********************************************************************************************
函数名称:延时函数
函数功能:转换延时和显示延时
说明:LCM1602_Delay()是液晶显示延时,delay()是温度转换延时
**********************************************************************************************/
void delay(unsigned int delay_time) // 延时程序
{
while(delay_time--);
}
void LCM1602_Delay(uchar count)
{
uchar i;
while(--count!=0)
{for(i=0;i<250;i++);}
}
/**********************************************************************************************
函数名称:初始化函数
函数功能:液晶1602初始化
说明:
**********************************************************************************************/
void LCM1602_Init(void)
{
void LCM1602_WriteData(uchar LCM1602_data);
void LCM1602_WriteCMD(uchar LCM1602_command);
LCM1602_WriteCMD(0x38); //显示两行,每个字符为5*7个像素
delay(1);
LCM1602_WriteCMD(0x06); //光标移动设置,光标右移
delay(1);
LCM1602_WriteCMD(0x0c); //现设开,光标开,闪烁开
delay(1);
LCM1602_WriteCMD(0x01); //清屏
delay(1);
}
void print(uchar a,uchar *str)
{
void LCM1602_WriteData(uchar LCM1602_data);
void LCM1602_WriteCMD(uchar LCM1602_command);
LCM1602_WriteCMD(a);
while(*str!='\0')
{
LCM1602_WriteData(*str++);
}
*str=0;
}
void print1(uchar a,uchar t)
{
LCM1602_WriteCMD(a);
LCM1602_WriteData(t);
}
/**********************************************************************************************
函数名称:写命令和写数据函数
函数功能:向LCD写命令和数据
说明:LCM1602_WriteCMD是写命令函数,void LCM1602_WriteData是写数据函数
**********************************************************************************************/
void LCM1602_WriteCMD(uchar LCM1602_command)
{
BOOL lcd_bz();
while(lcd_bz()); //测忙
L1602_RS=0;
L1602_RW=0;
L1602_E=0;
_nop_();
_nop_();
L1602_DB0_DB7=LCM1602_command;
_nop_();
_nop_();_nop_();
L1602_E=1; //命令总送出
_nop_();_nop_();_nop_();
L1602_E=0;
}
void LCM1602_WriteData(uchar LCM1602_data)
{
BOOL lcd_bz();
while(lcd_bz()); //测忙
L1602_RS=1;
L1602_RW=0;
L1602_E=0;
L1602_DB0_DB7=LCM1602_data;
_nop_();
_nop_();
_nop_();
_nop_();
L1602_E=1; //数据送出
_nop_();
_nop_();
_nop_();
L1602_E=0;
}
/**********************************************************************************************
函数名称:LCD检测忙函数
函数功能:检测LCD是否处于忙状态
说明:
**********************************************************************************************/
BOOL lcd_bz()
{ // 测试LCD忙碌状态
BOOL result;
L1602_RS=0;
L1602_RW=1;
L1602_E=1;
_nop_();
_nop_();
_nop_();
_nop_();
result = (BOOL)(P0 & 0x80);
L1602_E = 0;
return result;
}
/**********************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -