?? 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 + -