Project of Keil Programming

download Project of Keil Programming

If you can't read please download the document

description

Project of Keil Programming

Transcript of Project of Keil Programming

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