2013年7月7日 星期日

8051 control by pc with slave




#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

沒有留言:

張貼留言