| ??? 07/27/06 10:19 Modified: 07/27/06 10:26 Read: times |
#121152 - An example for 8051/AVR Responding to: ???'s previous message |
Follwing an example for LCD driver in 4bit mode, running on 8051 or AVR:
There are only less differences: - other port naming P0..P3 - PORTA.. PORTD - AVR need direction setting - other delay loop timing
/****************************** differences *****************************/
#ifdef __C51__
#include <reg51.h> // 8051 io definitiones
#define LCD_RS 2 // P1.2
#define LCD_E 3 // P1.3
#define LCD_PORT P1
#define SetLcdOutputs() // not needed on 8051
#define RELOAD60us (XTAL / 12.0 / 2 * 60e-6) // Keil C51: 2 cycle
#else
#include <io.h> // AVR io definitions
#define LCD_PORT PORTB
#define LCD_DDR DDRB
#define LCD_RS PB2
#define LCD_E PB3
#define SetLcdOutputs() LCD_DDR |= 1<<LCD_E^1<<LCD_RS^0xF0
#define RELOAD60us (XTAL / 3 * 60e-6) // WINAVR: 3 cycle
#endif
/****************************** common code *****************************/
typedef unsigned char u8;
typedef signed char s8;
typedef unsigned short u16;
typedef signed short s16;
typedef unsigned long u32;
typedef signed long s32;
#define XTAL 11.0592e6
u8 position;
void wait_60us( u8 n ) // wait n * 60µs (max 15ms)
{
u8 i;
do{
i = RELOAD60us;
while( --i );
}while( --n );
}
u8 lcd_nibble( u8 d )
{
LCD_PORT &= 0x0F;
LCD_PORT |= d & 0xF0;
LCD_PORT |= 1<<LCD_E;
d <<= 4;
LCD_PORT &= ~(1<<LCD_E);
return d;
}
void lcd_byte( u8 d )
{
lcd_nibble( lcd_nibble( d ));
wait_60us( 1 ); // wait > 46us
}
void lcd_command( u8 d )
{
LCD_PORT &= ~(1<<LCD_RS); // RS = 0
lcd_byte( d );
if( d & 0x80 )
position = d;
switch( d ){
case 1:
case 2:
case 3: wait_60us( 27 ); // wait > 1.6ms
}
}
void lcd_data( u8 d )
{
LCD_PORT |= 1<<LCD_RS; // RS = 1
lcd_byte( d );
position++;
if( position & 0x10 ){
position ^= 0x50; // switch line 1<->2
lcd_command( position );
}
}
void lcd_init( void )
{
SetLcdOutputs(); // set direction bits
LCD_PORT &= ~(1<<LCD_E); // E = 0
LCD_PORT &= ~(1<<LCD_RS); // RS = 0
wait_60us( 250 ); // wait >15ms
lcd_nibble( 0x30 );
wait_60us( 69 ); // wait >4.1ms
lcd_nibble( 0x30 );
wait_60us( 2 ); // wait >100µs
lcd_nibble( 0x30 ); // 8 bit mode
wait_60us( 2 ); // wait >100µs
lcd_nibble( 0x20 ); // 4 bit mode
wait_60us( 2 );
lcd_command( 0x28 ); // 2 lines 5*7
lcd_command( 0x08 ); // display off
lcd_command( 0x01 ); // display clear
lcd_command( 0x06 );
lcd_command( 0x0C ); // no cursor, no blink
position = 0x80;
}
As you can see, only some definitions are different but the code was mostly identical (direction setting was added). But in assembler every line of code must be rewritten. Peter |
| Topic | Author | Date |
| How long we see 8051 | 01/01/70 00:00 | |
| unofficial history of 8051 | 01/01/70 00:00 | |
| History, or prediction? | 01/01/70 00:00 | |
| It seems to gain, not lose | 01/01/70 00:00 | |
| Does it matter? | 01/01/70 00:00 | |
| Double negative? | 01/01/70 00:00 | |
| to C or not to C | 01/01/70 00:00 | |
| Defintely 'C'! | 01/01/70 00:00 | |
| yeah, let's flame! | 01/01/70 00:00 | |
| Defintely 'C'! | 01/01/70 00:00 | |
| arguments | 01/01/70 00:00 | |
| An example for 8051/AVR | 01/01/70 00:00 | |
| contra-example for 8051/AVR | 01/01/70 00:00 | |
| A slight mistake | 01/01/70 00:00 | |
| stdint.h | 01/01/70 00:00 | |
| That's your trouble, then! | 01/01/70 00:00 | |
| Compiler independant | 01/01/70 00:00 | |
| C is not better | 01/01/70 00:00 | |
| bringing 2 togethert | 01/01/70 00:00 | |
| Opening pandora's box | 01/01/70 00:00 | |
| Learning C | 01/01/70 00:00 | |
for a beginner ... | 01/01/70 00:00 | |
| are You sure? | 01/01/70 00:00 | |
| Portability and scars | 01/01/70 00:00 | |
| I'm an ASM Guru but | 01/01/70 00:00 | |
| why discuss the rare exception tha same apply | 01/01/70 00:00 |



