Académique Documents
Professionnel Documents
Culture Documents
LCD interfacing
#include <REGX52.H>
#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;i<50;i++)
for(j=0;j<255;j++);
}
void LCD_poweron()
{
unsigned int i;
for (i=0;i<22500; i++);
}
void LCD_command(unsigned char var)
{
LCD_data = var; //Function set: 2 Line, 8-bit, 5x8 dots
LCD_rs = 0; //Selected command register
LCD_rw = 0; //We are writing in instruction register
LCD_en = 1; //Enable H->L
LCD_en = 0;
LCD_busy(); //Wait for LCD to process the command
}
void LCD_init(void)
{
LCD_data = 0x38; //Function set: 2 Line, 8-bit, 5x8 dots
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 = 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
key_init:
mov keyport,#0FH ;Make rows as o/p and col as i/p
ret
get_key:
mov keyval,#0 ;reset the number
mov keyport,#7FH ;make Row1 low
acall read_col ;read columns
done:
ret
end
#include <Reg51.h>
#include "serial.h"
#include "lcd.h"
#include "menu.h"
#include "keypad.h"
#include "define.h"
void init_serial(void)
{
// Init PCON (power Control Register)
PCON = 0x00 ; //reset SMOD=1, SMOD=0, general purpose usage (see
pg 16)
void serial_rx(void)
{
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;
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;
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;
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;
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;
}
break;
default:
gMenuLine.sequence_wrong = gMenuLine.sequence_number;
gMenuLine.sequence_number = 0;
gMenuLine.sequence_found = 0;
TI=1;
break;
}
}
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;
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 <---
// correct sequence found will come here to change to desire bytes one at a time.
else if(TI&&(gMenuLine.sequence_found == 1))
{
TI=0;// clear to ack interrupt
SBUF = gMenuLine.serialtx_byte[gMenuLine.serialtx_counter];
IE = IE | 0x90; // enable sp interrupt // check for flag and copy data to & from SBUF
//main.c
#include <Reg51.h>
#include <stdio.h>
#include "serial.h"
#include "lcd.h"
#include "main.h"
#include "keypad.h"
#include "menu.h"
#include "timer.h"
#include "define.h"
void init_system(void)
{
// Clock X2 (6 clk period) Mode (clock control register)see pg 17-20 for advantages
CKCON0 = CKCON0 | 0x01 ;
// Settings for the ports, refer to user guide pg 13-14
P1 = 0xEB ; //1110 1011
P3 = 0xFF ;
// Initialize E2prom
// initE2prom();
// Initialize serial
init_serial();
// Initialize timer
// init_timer0() ;
// Initialize Lcd
// DelayTime(40);
CLALCDinit();
// Initialize Menu
MenuInit();
// Initialize Keypad
init_keypad() ;
void main(void)
{
init_system() ;
LcdBlitOn();
gMenuLine.sequence_number = 0;
gMenuLine.sequence_found = 0;
gMenuLine.serialrx_byte = 0;
gMenuLine.serialtx_counter = 0;
gMenuLine.sequence_wrong = 0; //added 020309
gMenuLine.serialtx_byte[0] = 0x36;
gMenuLine.serialtx_byte[1] = 0x30;
gMenuLine.serialtx_byte[2] = 0x30;
gMenuLine.serialtx_byte[3] = 0x31;
gMenuLine.serialtx_byte[4] = 0x31;
gMenuLine.serialtx_byte[5] = 0x37;
gMenuLine.serialtx_byte[6] = 0x30;
gMenuLine.serialtx_byte[7] = 0x30;
gMenuLine.serialtx_byte[8] = 0x37;
gMenuLine.serialtx_byte[9] = 0x36;
DisplayStartUpMsg() ;
//TI=1;
while(1) //endless loop
{
}
}
}