#include "reg52.h"
#define ACTIVE 0x11
#define CtlPort P1
#define DATA0 0x10
#define DATA1 0x20
#define DATA2 0x30
#define DATA3 0x40
#define DATA4 0x50
#define DATA5 0x60
#define DATA6 0x70
#define DATA7 0x80
#define DATA8 0x90
#define DATA9 0xA0
#define GETDATA 0x22
#define LCMDataPort P0
#define OFF 0
#define ON 1
#define READY 0x33
#define RECFRMMAXLEN 16
#define SENDDATA 0x44
#define STATUSMAXLEN 10
#define U16 unsigned int
#define U8 unsigned char
#define uchar unsigned char
#define uint unsigned int
#include <intrins.h>
U8 DevNo;
U8 SlaveAdd = 0x11;
U8 tmp,rCount,i;
bit Recv_Data(U8 *type);
bit TxEnd;
bit doit;
bit doit=0;
bit lcd_busy();
bit outflag;
char TxOK=0;
char code Str0[]="Hello";
char exemple_send_data=0x55;
char uart_data;
int strlen (char *src);
sbit D0=P1^0;
sbit D1=P1^1;
sbit D2=P1^2;
sbit D3=P1^3;
sbit D4=P1^4;
sbit D5=P1^5;
sbit D6=P1^6;
sbit D7=P1^7;
sbit DE = P1^6;
sbit LCD_EN = P2^7;
sbit LCD_RS = P2^6;
sbit LCD_RW = P2^5;
sbit RE = P1^7;
sbit P37=P3^7;
uchar CrcTemp;
uchar _1;
uchar _1;
uchar a[2];
uchar cnt=9;
uchar i;
uchar temp;
uchar last;
unsigned char Ascii[8]={'2','7','3','0','6', '7','7','6'};
unsigned char code dis1[] = {"%dis1%"};
unsigned char code dis2[] = {"%dis2%"};
void Clr_StatusBuf();
void Delay(int Times);
void Get_Stat();
void LCMWriteData(unsigned char Data);
void LCMWriteString2(unsigned char *Str,Len);
void Send(U8 m);
void Send_Data(U8 type,U8 len,U8 *buf);
void init();
void lcd_clr();
void lcd_init();
void lcd_wcmd(unsigned char cmd);
xdata U8 StatusBuf[STATUSMAXLEN];
void main()
{
IE=0x90;
TMOD=0x20;
SCON=0xD0;
TCON=0x40;
TL1=253;
TH1=253;
lcd_init();
lcd_clr();
LCMWriteString2(Str0,5);
SBUF='T'; TxEnd=0;
while(1);
}//main
void LCMWriteData(unsigned char Data)
{LCMDataPort=Data; LCD_RS=1;LCD_RW=0;LCD_EN=1; Delay(1);LCD_EN=0;}
void LCMWriteString2(unsigned char *Str,Len)
{while(Len--)LCMWriteData(* Str++);}
/***************************** ****************************** ********/
/*
/* 延時子程序
/*
/***************************** ****************************** ********/
/***************************** ****************************** ********/
/*
/*檢查LCD忙狀態
/*lcd_busy為1時,忙,等待。lcd- busy為0時,閑,可寫指令與數據。
/*
/***************************** ****************************** ********/
bit lcd_busy()
{
bit result;
LCD_RS = 0;
LCD_RW = 1;
LCD_EN = 1;
_nop_(); _nop_(); _nop_(); _nop_();
result = (bit)(P0&0x80);
LCD_EN = 0;
return result;
}
/***************************** ****************************** ********/
/*
/*寫指令數據到LCD
/*RS=L,RW=L,E=高脈沖,D0-D7=指令碼。
/*
/***************************** ****************************** ********/
void lcd_wcmd(unsigned char cmd)
{
while(lcd_busy());
LCD_RS = 0;
LCD_RW = 0;
LCD_EN = 0;
_nop_();
_nop_();
P0 = cmd;
_nop_(); _nop_(); _nop_(); _nop_();
LCD_EN = 1;
_nop_(); _nop_(); _nop_(); _nop_();
LCD_EN = 0;
}
/* LCD初始化設定 */
void lcd_init()
{
Delay(250*15); //等待LCD電源穩定
lcd_wcmd(0x38); //16*2顯示,5*7點陣,8位數據
Delay(250*5);
lcd_wcmd(0x38);
Delay(250*5);
lcd_wcmd(0x38);
Delay(250*5);
lcd_wcmd(0x0c); //顯示開,關光標
Delay(250*5);
lcd_wcmd(0x06); //移動光標
Delay(250*5);
lcd_wcmd(0x01); //清除LCD的顯示內容
Delay(250*5);
}
/* 清屏子程序 清除LCD的顯示內容 */
void lcd_clr(){lcd_wcmd(0x01); Delay(250*5);}
bit Recv_Data(U8 *type) /*接收主機的指令 */
{
if (P37) // 20120807
{
U8 tmp,rCount,i;
U8 r_buf[RECFRMMAXLEN]; // =16 儲存接收到的幀
U8 Flag_RecvOver; // 一幀接收結束標誌
U8 Flag_StartRec; // 一幀開始接收標誌
U8 CheckSum; // 校驗和
U8 DataLen; // 數據位元組長度變量
DE = 0; RE = 0; /* 禁止發送,允許接收 */
rCount = 0; Flag_StartRec = 0; Flag_RecvOver = 0; /* 接收一幀數據 */
while (!Flag_RecvOver) // Listening to the Master
{
RI = 0;
while (!RI);
tmp = SBUF; // <<< Get data from SBUF
RI=0;
if ((!Flag_StartRec) && (tmp == 0x24)) { Flag_StartRec = 1;} /*0x24=$ */
if (Flag_StartRec)
{
r_buf[rCount] = tmp; rCount ++;
if (tmp == 0x2A) Flag_RecvOver = 1; // 0x2A='*'
}
if (rCount == RECFRMMAXLEN) return 0;
}
CheckSum = 0; DataLen = r_buf[3]; /* 判斷幀是否錯誤 */
for (i=0;i++;i<3+DataLen){CheckSum = CheckSum + r_buf[i+1];} /* 計算校驗和位元組 */
if (rCount<6) return 0; // 幀過短錯誤,返回0,最短的指令幀為6個位元組
if (r_buf[1]!=DevNo) return 0; // 位址不符合,錯誤,返回0
if (r_buf[rCount-2]!=CheckSum) return 0; // 校驗錯誤,返回0
*type = r_buf[2]; return 1; // 獲取指令類型 成功,返回1
}
}
void Send_Data(U8 type,U8 len,U8 *buf)
{
U8 i,tmp; U8 CheckSum = 0;
DE = 1; RE = 1; /* 允許發送,禁止接收 */
tmp = 0x24; Send(tmp); /* 發送幀起始位元組 '$' */
Send(DevNo);CheckSum = CheckSum + DevNo;
Send(type);CheckSum = CheckSum + type;
Send(len); CheckSum = CheckSum + len;
for (i=0;i<len;i++){ Send(*buf); CheckSum = CheckSum + *buf; buf++; } /* 發送數據 */
Send(CheckSum); // 發送校驗和位元組
tmp = 0x2A;Send(tmp); /* 發送幀結束位元組 */
}
void Send(U8 m){TI = 0;SBUF = m;while(!TI); TI = 0; } /* 發送單位元組數據 */
void Get_Stat(void)
{
StatusBuf[0]=DATA0; StatusBuf[1]=DATA1; StatusBuf[2]=DATA2; StatusBuf[3]=DATA3;
StatusBuf[4]=DATA4; StatusBuf[5]=DATA5; StatusBuf[6]=DATA6; StatusBuf[7]=DATA7;
StatusBuf[8]=DATA8; StatusBuf[9]=DATA9;
}
void Clr_StatusBuf(void) { U8 i; for (i=0;i<STATUSMAXLEN;i++) StatusBuf[i] = 0;}/* 清除設備狀態訊息緩沖區函數*/
void Delay(int Times)
{int s;for (s=0; s< Times; s++);}
void SCON_int(void) interrupt 4 {
U8 xx;
if (RI) // UART Received
{
if (P37){
unsigned char RxBuffer;
if (RI) { RI = 0; RxBuffer = SBUF;
/*Begin 120720*/
//CtlPort=0xff; // 0xff=off
/*ActioN*/
if (RxBuffer=='>') {cnt=0 ;}
// LCMWriteData(cnt+0x30);
// LCMWriteData(RxBuffer);
switch(cnt)
{
case 0: if (RxBuffer!='>') {temp=((RxBuffer&0x0f)<<4); cnt=1; }break;
case 1: temp|=(RxBuffer&0x0f); i=temp; cnt=2; break;
case 2: CrcTemp=((RxBuffer&0x0f)<<4); cnt=3; break;
case 3: CrcTemp|=(RxBuffer&0x0f);cnt= 9; TI=0; if(temp+CrcTemp==0xff){doit=1; xx='Y';}
else {doit=0; xx='N';i=0x00;} SBUF=xx; while(TI==0); LCMWriteData(xx); break;
}
if (xx=='Y') {CtlPort=0x00; CtlPort=~i;last=i;
// TB8 = 1;
// SBUF='S';
//SBUF=SlaveAdd;
// TxOK=1; tmp = 0x24; SBUF=tmp; SBUF=SlaveAdd; tmp = 0x2A; SBUF=tmp;
//while(TxOK);
// TB8 = 0;
// tmp=SBUF ;
// if (tmp==READY)
// {
// Clr_StatusBuf();
// Get_Stat();
// Send_Data(SENDDATA,strlen( StatusBuf),StatusBuf);
// SBUF = i;// while(TxOK);
// }
} else {CtlPort=~last;} }
}
/*End 120720*/
} // if(RU) // UART Received
} //interrupt 4
沒有留言:
張貼留言