Email: Password: Remember Me | Create Account (Free)

Back to Subject List

Old thread has been locked -- no new posts accepted in this thread
???
07/14/08 13:04
Read: times


 
#156687 - Ident Code, Suggestions in many /////////
Responding to: ???'s previous message
You should make an effort to ident your code
either by spaces or tabs.
Anyway, this post contains the code idented.
Look for the suggestions between many ////////////
It concerns the serial communications by polling
and the use of SFRs.

a. Timer0 should be stopped before alter TH0, TL0
b. TI should be chekcked before a trasmision start
c. TMOD affects Timer0(low nibble) and Timer1(high nibble)
If it is the case to affect only Timer0 should be masked.

Please try the suggestions and inform for the results ...

K.L.Angelis


// PIN ASSIGNMENT //
sbit DATA_INT = P3^0;
sbit KB_DATA = P3^2;
sbit EN = P3^4;
sbit RS = P3^5;

// PROTOTYPES //
// LCD functions //
void lcd_delay(bit length);
void write_char(char character);
void write_message(char * message);
void clear_disp();
void lcd_initialize();
void monitor_lcd_line(signed char amt);

// Keyboard functions //
//bit calc_parity(char tmp);
void kb_machine(char * kb_arr);
char conv_to_ascii(char scan_code);

// Output functions //
char conv_to_send_protocol(char ascii_code);
void output_data(char scode);

// General functions //
char pow(char num, char pow);
int strlen(char * string);
void sec_delay(int sec);

// GLOBAL VARIABLES //
char output_buffer[49],output_buffer_counter=0,char_count=0;

#include <intrins.h>

/* LCD functions */
void lcd_delay(bit length)
{
// length = 1 -> 1.64ms
// length = 0 -> 40us
  int count_size = (length == 1) ? 3280 : 80;
/////////////////////////////////////////////////
  TR0=0;
/////////////////////////////////////////////////
  TH0 = ~(count_size/256);
  TL0 = -(count_size%256);

  TR0 = 1;
  while(!TF0);
  TF0 = 0;
  TR0 = 0;
}


void monitor_lcd_line(signed char amt)
{
// break line automatically
  if(char_count<24 && (char_count+amt)>=24)
  {
    RS = 0;
    P1 = 0xc0;
    EN = 1;
    EN = 0;
    lcd_delay(0);
    char_count+=amt;
  }
  else
  {
    char_count+=amt;
  }
}


void write_char(char character)
{
  RS = 1;
  P1 = character;
  EN = 1;
  EN = 0;
  lcd_delay(0);
  monitor_lcd_line(+1);
}


void write_message(char * message)
{
  char i;

  clear_disp();
  for(i=0; i<strlen(message); i++)
  write_char(message);
}


void clear_disp()
{
  RS = 0;
  P1 = 0x01;
  EN = 1;
  EN = 0;
  lcd_delay(1);
  char_count=0;
}


void lcd_initialize()
{
// function set
  RS = 0;
  P1 = 0x38;
  EN = 1;
  EN = 0;
  lcd_delay(0);
// entry mode set
  RS = 0;
  P1 = 0x06;
  EN = 1;
  EN = 0;
  lcd_delay(0);
// display control
  RS = 0;
  P1 = 0x0e;
  EN = 1;
  EN = 0;
  lcd_delay(0);
// clear display
  RS = 0;
  P1 = 0x01;
  EN = 1;
  EN = 0;
  lcd_delay(1);
}


/* KB functions */

void INT1_ISR() interrupt 2
{
  static char i=0;
  static char in_data[33];

  in_data = KB_DATA;
  i++;
  if(i==33)
  {
    kb_machine(in_data);
    i=0;
  }
}

// /*bit calc_parity(char tmp)
// {
// calculate odd parity = NOT(XOR(D0...D7))
//   char i;
//   bit xor;
//   for(i=0; i<8; i++)
//   {
//     tmp = tmp>>i;
//     xor = xor^tmp&0x01;
//   }
//   return ~xor;
// }*/

void kb_machine(char * kb_arr)
{
  char scan_code=0, ascii_code, i=0;
  static bit del_start_msg=0;
 
  if(!del_start_msg) 
  {
    clear_disp(); del_start_msg=1;
  }
 
  for(i=1; i<9; i++)
    scan_code = scan_code + kb_arr*pow(2,i-1);

  if(scan_code == 0x5a) // user pressed on ENTER, send out!
  {
    output_buffer[output_buffer_counter] = 0xff;
    EA = 0; // disable KB
    write_message("KB will not be available during transmission.");
    for(i=0; i<=output_buffer_counter; i++)
      output_data(output_buffer);
       
    clear_disp();
    write_message("Success. You can type a new message if you like.");
    sec_delay(10);
    clear_disp();
    EA = 1; // enable KB
    output_buffer_counter=0;
  }
// /* else if(is_effect(scan_code))
//   {
//     output_data(conv_to_send_protocol(scan_code));
// }*/
  else if(scan_code == 0x66) // delete last char
  {
    if(char_count!=24)
    {
      output_buffer[--output_buffer_counter] = 0;
// move cursor one char back
      RS = 0;
      P1 = 0x10;
      EN = 1;
      EN = 0;
      lcd_delay(0);
// write space (delete effect)
      RS = 1;
      P1 = ' ';
      EN = 1;
      EN = 0;
      lcd_delay(0);
// move cursor back to its place.
      RS = 0;
      P1 = 0x10;
      EN = 1;
      EN = 0;
      lcd_delay(0);
      monitor_lcd_line(-1);
    }
    else
    {
      output_buffer[--output_buffer_counter] = 0;
// go back to end of second line
      RS = 0;
      P1 = 0x97;
      EN = 1;
      EN = 0;
      lcd_delay(0);
// write space (delete effect)
      RS = 1;
      P1 = ' ';
      EN = 1;
      EN = 0;
      lcd_delay(0);
// move cursor back to its place.
      RS = 0;
      P1 = 0x10;
      EN = 1;
      EN = 0;
      lcd_delay(0);
/*RS = 0;
      P1 = 0x10;
      EN = 1;
      EN = 0;
      lcd_delay(0);*/
      monitor_lcd_line(-1);
    }
  }
  else
  {
    ascii_code = conv_to_ascii(scan_code);
    if(ascii_code!=0 && char_count<48)
    {
      write_char(ascii_code); // write to lcd
      output_buffer[output_buffer_counter++] = conv_to_send_protocol(ascii_code);
    }
  }
}

char conv_to_ascii(char scan_code)
{
  switch(scan_code)
  {
    case 0x1c: return 'A';
    case 0x32: return 'B';
    case 0x21: return 'C';
    case 0x23: return 'D';
    case 0x24: return 'E';
    case 0x2b: return 'F';
    case 0x34: return 'G';
    case 0x33: return 'H';
    case 0x43: return 'I';
    case 0x3b: return 'J';
    case 0x42: return 'K';
    case 0x4b: return 'L';
    case 0x3a: return 'M';
    case 0x31: return 'N';
    case 0x44: return 'O';
    case 0x4d: return 'P';
    case 0x15: return 'Q';
    case 0x2d: return 'R';
    case 0x1b: return 'S';
    case 0x2c: return 'T';
    case 0x3c: return 'U';
    case 0x2a: return 'V';
    case 0x1d: return 'W';
    case 0x22: return 'X';
    case 0x35: return 'Y';
    case 0x1a: return 'Z';
    case 0x29: return ' ';
    case 0x16: return '1';
    case 0x1e: return '2';
    case 0x26: return '3';
    case 0x25: return '4';
    case 0x2e: return '5';
    case 0x36: return '6';
    case 0x3d: return '7';
    case 0x3e: return '8';
    case 0x46: return '9';
    case 0x45: return '0';
    case 0x4e: return '-';
    default: return 0;
  }
}

/* Output functions */
void output_data(char scode)
{
  DATA_INT = 0;
/////////////////////////////////////
  while(!TI)       //////////////////
    ;              //////////////////
  TI=0;            //////////////////
/////////////////////////////////////
  SBUF = scode;
  while(!TI); // wait till end of transmission
  TI = 0;
  DATA_INT = 1;
}

char conv_to_send_protocol(char ascii_code)
{
  switch(ascii_code)
  {
    case 'A': return 0;
    case 'B': return 1;
    case 'C': return 2;
    case 'D': return 3;
    case 'E': return 4;
    case 'F': return 5;
    case 'G': return 6;
    case 'H': return 7;
    case 'I': return 8;
    case 'J': return 9;
    case 'K': return 10;
    case 'L': return 11;
    case 'M': return 12;
    case 'N': return 13;
    case 'O': return 14;
    case 'P': return 15;
    case 'Q': return 16;
    case 'R': return 17;
    case 'S': return 18;
    case 'T': return 19;
    case 'U': return 20;
    case 'V': return 21;
    case 'W': return 22;
    case 'X': return 23;
    case 'Y': return 24;
    case 'Z': return 25;
    case ' ': return 26;
    case '0': return 27;
    case '1': return 28;
    case '2': return 29;
    case '3': return 30;
    case '4': return 31;
    case '5': return 32;
    case '6': return 33;
    case '7': return 34;
    case '8': return 35;
    case '9': return 36;
    case '-': return 37;
    case 0x05: return 0xe0;
    case 0x06: return 0xe1;
    case 0x04: return 0xe2;
    case 0x0c: return 0xe3;
  }
}

/* General functions */

char pow(char num, char pow)
{
  char tmp=1,i;
  for(i=0; i<pow; i++)
  tmp *= num;
  return tmp;
}


int strlen(char * string)
{
  char i=0;
  while(1)
  {
    if(string!=0) i++;
    else break;
  }
}


void sec_delay(int sec)
{
  int i;

//////////  TMOD = 0x09; // timer 0 mode 1         
////////// this breaks TMOD configuration replace with
  TMOD &= 0xF0; ///////////////////////
  TMOD |= 0x09; ///////////////////////
///////////////////////////////////////
  for(i=0; i<20*sec; i++)
  {
    TH0 = ~(50000/256);
    TL0 = -(50000%256);
    
    TR0 = 1;
    while(!TF0);
    TF0 = 0;                             /////////////// Not Needed //////////////
    TR0 = 0;
  }
}


// main
void main()
{
  lcd_initialize(); // lcd initialization
  write_message("Welcome, please type in your message.");

  IE = 0x84; // enable INT1
  IT1 = 1;

// output options //
  SCON = 0x40; // Mode 1, No Parity  /////////////// REN=0 receive=disabled ///////////////
  TMOD = 0x21; // T1 Mode 2 (auto reload - baud gen). T0 Mode 1 (general use).
  TH1 = -26;
  TR1 = 1;

//T2CON = 0x34;
//PCON=PCON|0x80; // smod = 1
//RCAP2H = ~(40000/256); // 2400 baud rate
//RCAP2H = -(40000%256);
//TR2 = 1;

  DATA_INT = 1; // idle

  while(1);
}	




List of 37 messages in thread
TopicAuthorDate
Atmel AT89C52 serial port problems            01/01/70 00:00      
   Problem with Serial Port 89C52            01/01/70 00:00      
      Can't be            01/01/70 00:00      
      ATMEL AT89C52 Help?            01/01/70 00:00      
         Why are you considering a discontinued chip?            01/01/70 00:00      
         THIS POST IS IRRELEVALENT TO THIS TOPIC            01/01/70 00:00      
   Seven Hertz            01/01/70 00:00      
      Don't think so            01/01/70 00:00      
   post the whole code...            01/01/70 00:00      
      Pretty much the whole thing - I can add this tho            01/01/70 00:00      
         no main?            01/01/70 00:00      
            It's pretty much what I showed you - here you go.            01/01/70 00:00      
               how do you know WHAT does matter?            01/01/70 00:00      
               how do you use timer0?            01/01/70 00:00      
                  this will be most probably the culprit            01/01/70 00:00      
                     So what you're saying is            01/01/70 00:00      
                        Its timer0 interrupt making trouble            01/01/70 00:00      
                           I dont get it            01/01/70 00:00      
                              none, if            01/01/70 00:00      
                                 funny..            01/01/70 00:00      
                        timer 1            01/01/70 00:00      
                           this IS the program (everything I've posted)            01/01/70 00:00      
   Results + Complete program            01/01/70 00:00      
      evidently you do not blieve in making code readabl            01/01/70 00:00      
         Actually,            01/01/70 00:00      
            double post, please ignore            01/01/70 00:00      
            try a search            01/01/70 00:00      
      Ident Code, Suggestions in many /////////            01/01/70 00:00      
         Question            01/01/70 00:00      
            setting TMOD            01/01/70 00:00      
               24MHz            01/01/70 00:00      
               Done!            01/01/70 00:00      
   NEW - Receiver Promlems            01/01/70 00:00      
      be more specific            01/01/70 00:00      
         A few answers            01/01/70 00:00      
      Got something but still not entirely fixed            01/01/70 00:00      
      look at str_len carefully            01/01/70 00:00      

Back to Subject List