Hi guys,
I am new to this forum as well as to AVRs.Ive recently tried to interface Atmega16 with an LCD display(16x2).I am using PORTD as data port and PORTB for control signals.Clk frequency is selected as 4Mhz(internal).
The code is as follows:
Code C - [expand ] 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#define F_CPU 4000000
#include <avr/io.h>
#include <util/delay.h>
#define MrLCDsCrib PORTD
#define DataDir_MrLCDsCrib DDRD
#define MrLCDsControl PORTB
#define DataDir_MrLCDsControl DDRB
#define LightSwitch 2
#define ReadWrite 1
#define BiPolarMood 0
void Check_IF_MrLCD_isBusy( void ) ;
void Peek_A_Boo( void ) ;
void Send_A_Command( unsigned char command) ;
void Send_A_Character( unsigned char character) ;
void Send_A_String( char * StringOfCharacters) ;
int main( void )
{
DataDir_MrLCDsControl |= 1 << LightSwitch | 1 << ReadWrite | 1 << BiPolarMood;
_delay_ms( 50 ) ;
Send_A_Command( 0x01 ) ; //Clear Screen 0x01 = 00000001
_delay_ms( 50 ) ;
Send_A_Command( 0x38 ) ;
_delay_us( 50 ) ;
Send_A_Command( 0b00001110 ) ;
_delay_us( 50 ) ;
Send_A_String( "Newbie" ) ;
while ( 1 )
{
}
}
void Check_IF_MrLCD_isBusy( )
{
DataDir_MrLCDsCrib = 0 ;
MrLCDsControl |= 1 << ReadWrite;
MrLCDsControl &= ~1 << BiPolarMood;
while ( MrLCDsCrib >= 0x80 )
{
Peek_A_Boo( ) ;
}
DataDir_MrLCDsCrib = 0xFF ; //0xFF means 0b11111111
}
void Peek_A_Boo( )
{
MrLCDsControl |= 1 << LightSwitch;
asm volatile ( "nop" ) ;
asm volatile ( "nop" ) ;
MrLCDsControl &= ~1 << LightSwitch;
}
void Send_A_Command( unsigned char command)
{
Check_IF_MrLCD_isBusy( ) ;
MrLCDsCrib = command;
MrLCDsControl &= ~ ( ( 1 << ReadWrite) | ( 1 << BiPolarMood) ) ;
Peek_A_Boo( ) ;
MrLCDsCrib = 0 ;
}
void Send_A_Character( unsigned char character)
{
Check_IF_MrLCD_isBusy( ) ;
MrLCDsCrib = character;
MrLCDsControl &= ~ ( 1 << ReadWrite) ;
MrLCDsControl |= 1 << BiPolarMood;
Peek_A_Boo( ) ;
MrLCDsCrib = 0 ;
}
void Send_A_String( char * StringOfCharacters)
{
while ( * StringOfCharacters > 0 )
{
Send_A_Character( * StringOfCharacters++ ) ;
}
}
Now,the problem is that the output is discontinuous.(For example if i send "Newbie",output is like "N w b e").
Can any one please help me with this problem?:roll:
Last edited by a moderator: Jan 2, 2015