project of keil programming

Download Project of Keil Programming

If you can't read please download the document

Upload: hardik

Post on 27-Apr-2015

367 views

Category:

Documents


2 download

DESCRIPTION

Project of Keil Programming

TRANSCRIPT

Embedded Project LCD interfacing #include #define LCD_data P2 #define LCD_rs P1_0 #define LCD_rw P1_1 #define LCD_en P1_2 void LCD_busy(void); void LCD_poweron(void); void LCD_command(unsigned char var); void LCD_senddata(unsigned char var); void LCD_sendstring(unsigned char *var); void LCD_init(void); void main(void) { unsigned char msg[] ="Learning"; LCD_poweron(); // 15ms delay LCD_init(); LCD_command (0x80); // Set CGRAM adress,data is Avaible from uC LCD_sendstring(msg); while(1); } void LCD_busy() { unsigned char i,j; for(i=0;iL LCD_en = 0; LCD_busy(); //Wait for LCD to process the command LCD_data = 0x0F; //Display on, Curson blinking command LCD_rs = 0; //Selected command register LCD_rw = 0; //We are writing in data register LCD_en = 1; //Enable H->L LCD_en = 0; LCD_busy(); //Wait for LCD to process the command LCD_data = 0x01; //Clear LCD LCD_rs = 0; //Selected command register LCD_rw = 0; //We are writing in data register LCD_en = 1; //Enable H->L LCD_en = 0;

LCD_busy(); //Wait for LCD to process the command LCD_data = 0x06; //Entry mode, auto increment with no shift LCD_rs = 0; //Selected command register LCD_rw = 0; //We are writing in data register LCD_en = 1; //Enable H->L LCD_en = 0; //Enable H->L LCD_busy(); } =============================================================== =========================== 7segment for keil keyport equ P2 ;Keypad port connected here col1 equ P2.0 ;Column 1 col2 equ P2.1 ;Column 2 col3 equ P2.2 ;Column 3 col4 equ P2.3 ;Column 4 keyval equ 30H pressed bit 0H key_init: mov keyport,#0FH ret ;To store key number ;Flag ;Make rows as o/p and col as i/p

get_key: mov keyval,#0 ;reset the number mov keyport,#7FH ;make Row1 low acall read_col ;read columns jb pressed, done ;check if flag is set

mov keyval,#4 ;if not then read next row mov keyport,#0BFH ;make Row2 low acall read_col ;read columns jb pressed, done ;check if flag is set

mov keyval,#8 ;if not then read next row mov keyport,#0DFH ;make row3 low acall read_col ;read columns jb pressed, done ;check if flag is set

mov keyval,#12 ;if not read row4 mov keyport,#0EFH ;make row4 low

acall read_col done: ret read_col: clr pressed jb col1, nextcol jnb col1,$ setb pressed ret

;read columns

;read columns routine ;reset the flag ;check if first key is pressed ;if yes then wait for key release ;set the flag

nextcol: ;read col2 jb col2, nextcol1 ;check if second key is pressed jnb col2,$ ;if yes then wait for key release inc keyval ;its key number 2 setb pressed ;set the flag ret nextcol1: ;read col3 jb col3, nextcol2 ;check if third key is pressed jnb col3,$ ;if yes then wait for key release inc keyval ;its key 3 inc keyval setb pressed ;set the flag ret nextcol2: jb col4, exit jnb col4,$ inc keyval inc keyval inc keyval setb pressed ret exit: clr pressed clr keyval ret end unsigned char get_key(){ unsigned char i,k,key=0; ;read column 4 ;check if fourth key pressed ;if yes then wait for key release ;its key 4 ;set the flag ;if no key is pressed ;clr the flag ;reset the number

k=1; for(i=0;i>i); //to make rows low 1 by 1 if(!col1){ //check if key1 is pressed key = k+0; //set key number while(!col1); //wait for release return key; //return key number } if(!col2){ //check if key2 is pressed key = k+1; //set key number while(!col2); //wait for release return key; //return key number } if(!col3){ //check if key3 is pressed key = k+2; //set key number while(!col3); //wait for release return key; //return key number } if(!col4){ //check if key4 is pressed key = k+3; //set key number while(!col4); //wait for release return key; //return key number } k+=4; //next row key number keyport |= 0x80>>i; //make the row high again } return FALSE; //return false if no key pressed =============================================================== ============ intrupt //serial.c #include #include "serial.h" #include "lcd.h" #include "menu.h" #include "keypad.h" #include "define.h" unsigned int byte_no=0; unsigned char recieve_type = 'D'; // why D? unsigned char serial_buff_temp[100]; unsigned int rx_count=0; unsigned int lcd_writecount=0; unsigned int position = 1; unsigned int x=1;

unsigned int y=1; unsigned char start_buffer='N'; // why N? unsigned char key='N'; void init_serial(void) { // Init PCON (power Control Register) PCON = 0x00 ; //reset SMOD=1, SMOD=0, general purpose usage (see pg 16) // Init SCON (serial Control Register see pg 54) SCON = 0x50 ; // 8-bit UART, REN=1, 1 stop & 1 start // // BRL = 247 ; BRL = 220 ; BRL = 247 ; //115200 //2400 //9600

// Init BDRCON (Baud Rate Control pg 59) BDRCON = 0x1D ; // Set SPD = 0, BRG run on uart mode 0, 1D= 0001 1101 // Enable serial int (pg 77) IE = IE | 0x90 ; // 0x90 = 1001 0000 } void serial_rx(void) { switch(gMenuLine.serialrx_byte) //whatever wrong sequence will reset back to zero { case 0x36: //HEX form--> DECIMAL is 6 if(gMenuLine.sequence_number == 0) { gMenuLine.sequence_number = 1; LcdDisplayLine("36\n", 1, 1, LCD_CLEAR); //temp check if 36 press will come here } else { gMenuLine.sequence_wrong = gMenuLine.sequence_number; // sequence_wrong is use to store number of bytes correct prior to wrong data rx (counter) gMenuLine.sequence_number = 0; //to reset the number of correct bytes receive to zero since a wrong data Rx }

break; case 0x30: //0 if(gMenuLine.sequence_number == 1) { gMenuLine.sequence_number = 2; LcdDisplayLine("30\n", 1, 1, LCD_CLEAR); } else if(gMenuLine.sequence_number == 2) { gMenuLine.sequence_number = 3; LcdDisplayLine("30(2)\n", 1, 1, LCD_CLEAR); } else if(gMenuLine.sequence_number == 6) { gMenuLine.sequence_number = 7; LcdDisplayLine("30(3)\n", 1, 1, LCD_CLEAR); } else { gMenuLine.sequence_wrong = gMenuLine.sequence_number; // sequence_wrong is use to store number of bytes correct prior to wrong data rx (counter) gMenuLine.sequence_number = 0; //to reset the number of correct bytes receive to zero since a wrong data Rx } break; case 0x32: //2 if(gMenuLine.sequence_number == 3) { gMenuLine.sequence_number = 4; LcdDisplayLine("32\n", 1, 1, LCD_CLEAR); } else if(gMenuLine.sequence_number == 4) { gMenuLine.sequence_number = 5; LcdDisplayLine("32(2)\n", 1, 1, LCD_CLEAR); } else { gMenuLine.sequence_wrong = gMenuLine.sequence_number; // sequence_wrong is use to store number of bytes correct prior to wrong data rx (counter)

gMenuLine.sequence_number = 0; //to reset the number of correct bytes receive to zero since a wrong data Rx } break; case 0x34: //4 if(gMenuLine.sequence_number == 5) { gMenuLine.sequence_number = 6; LcdDisplayLine("34\n", 1, 1, LCD_CLEAR); } else if(gMenuLine.sequence_number == 8) { gMenuLine.sequence_number = 9; LcdDisplayLine("34(2)\n", 1, 1, LCD_CLEAR); } else { gMenuLine.sequence_wrong = gMenuLine.sequence_number; // sequence_wrong is use to store number of bytes correct prior to wrong data rx (counter) gMenuLine.sequence_number = 0; //to reset the number of correct bytes receive to zero since a wrong data Rx } break; case 0x33: //3 if(gMenuLine.sequence_number == 7) { gMenuLine.sequence_number = 8; LcdDisplayLine("33\n", 1, 1, LCD_CLEAR); } else { gMenuLine.sequence_wrong = gMenuLine.sequence_number; // sequence_wrong is use to store number of bytes correct prior to wrong data rx (counter) gMenuLine.sequence_number = 0; //to reset the number of correct bytes receive to zero since a wrong data Rx } break; case 0x35: //5

if(gMenuLine.sequence_number == 9) { gMenuLine.sequence_found = 1; gMenuLine.serialtx_counter = 0; gMenuLine.sequence_number = 0; //reset back to zero } else { gMenuLine.sequence_wrong = gMenuLine.sequence_number; // sequence_wrong is use to store number of bytes correct prior to wrong data rx (counter) gMenuLine.sequence_number = 0; //to reset the number of correct bytes receive to zero since a wrong data Rx } break; default: gMenuLine.sequence_wrong = gMenuLine.sequence_number; gMenuLine.sequence_number = 0; gMenuLine.sequence_found = 0; TI=1; break; } } //TI and RI are serial port interrupt bits //TI & RI must be clear by software void serial_isr(void) interrupt 4 { IE = IE & 0x6F; //0110 1111 if(RI) // when RI==1, HT had already sent 1 byte data, indicating to 8051 that it can start reading in { // when RI==0, HT is still sending the 1 byte data or 8051 telling HT that it can start to send data gMenuLine.serialrx_byte = SBUF; RI = 0; TI=1;// add on 040309 so it will go to the condition serial_rx() ; if(gMenuLine.sequence_found == 1) { LcdDisplayLine("seq found\n", 1, 1, LCD_CLEAR); //TI=1; here or top also can

} } //TI=0 mean 8051 transmiting data, ready to transmit else if(TI&&(gMenuLine.sequence_number == 0)&& (gMenuLine.sequence_found == 0))//for wrong set of data recieved { TI=0;// clear to ack interrupt //if all the correct btye is outputed, output the wrong byte or for the moment first byte received not in sequence if(gMenuLine.sequence_wrong == 0) { LcdDisplayLine("Wrong_seq1\n", 1, 1, LCD_CLEAR); //checking purpose gMenuLine.serialtx_counter = 0; SBUF = gMenuLine.serialrx_byte; } else //output the correct byte prior to the wrong one { SBUF = gMenuLine.serialtx_byte_wrong[gMenuLine.serialtx_counter]; gMenuLine.serialtx_counter++; // o/p one byte by one byte ---> gMenuLine.sequence_wrong--; // o/p one byte by one byte