📄 lcd.c
字号:
/**
* Lcd.c HD44780 LCD僐儞僩儘乕儔僪儔僀僶乮俀侽寘亊係峴懳墳乯
*
* PB I/O LCD (Data8bit)
* b0- D0
* b1- D1
* b2- D2
* b3- D3
* b4- D4
* b5- D5
* b6- D6
* b7- D7
* PA O b3- E
* b4- R/~W
* b7- RS
*
*/
#include "ut.h"
#include "lcd.h"
#include "h8_3052f.h"
#define ASSERT_E( ) { PADR |= 0x08; }
#define ASSERT_RW( ) { PADR |= 0x10; }
#define ASSERT_RS( ) { PADR |= 0x80; }
#define NEGATE_E( ) { PADR &= 0xf7; }
#define NEGATE_RW( ) { PADR &= 0xef; }
#define NEGATE_RS( ) { PADR &= 0x7f; }
#define WRITE_MODE( ) { PBDDR = 0xff; }
#define WRITE_DATA( x ) { PBDR = x; }
#define READ_MODE( ) { PBDDR = 0; }
#define READ_DATA( ) ( PBDR )
#define WAITBUSY( ) while( lcdbusy( ) )
/**
* 壗傕偟側偄
*/
static void nop( void )
{
}
/**
* 俴俠俢偵僨乕僞彂偔
*/
void lcdwrite( unsigned char data )
{
WRITE_MODE( );
NEGATE_RW( );
nop( );
WRITE_DATA( data );
ASSERT_E( );
nop( );
NEGATE_E( );
}
/**
* 俴俠俢偐傜僨乕僞撉傓
*/
unsigned char lcdread( void )
{
unsigned char data;
READ_MODE( );
ASSERT_RW( );
nop( );
ASSERT_E( );
nop( );
data = READ_DATA( );
NEGATE_E( );
return data;
}
/**
* 僀儞僗僩儔僋僔儑儞彂偔
*/
void lcdwriteir( unsigned char data )
{
NEGATE_RS( );
lcdwrite( data );
}
/**
* 僀儞僗僩儔僋僔儑儞撉傓
*/
unsigned char lcdreadir( void )
{
NEGATE_RS( );
return lcdread( );
}
/**
* 僨乕僞儗僕僗僞彂偔
*/
void lcdwritedr( unsigned char data )
{
ASSERT_RS( );
lcdwrite( data );
}
/**
* 僨乕僞儗僕僗僞撉傓
*/
unsigned char lcdreaddr( void )
{
ASSERT_RS( );
return lcdread( );
}
/**
* 價僕乕忬懺庢傞
*/
short lcdbusy( void )
{
return lcdreadir( ) & 0x80;
}
char lcdx, lcdy;
/**
* 俴俠俢弶婜壔
*/
void lcdinit( void )
{
/* 弶婜壔僔乕働儞僗 */
waitms( 20 ); /* Wait 20 ms */
lcdwriteir( 0x30 );
waitms( 5 );
lcdwriteir( 0x30 );
waitms( 1 );
lcdwriteir( 0x30 );
waitms( 1 );
lcdwriteir( 0x30 ); /* Data length 8bits */
waitms( 1 );
WAITBUSY( );
lcdwriteir( 0x38 ); /* Set function */
WAITBUSY( );
lcdwriteir( 0x08 ); /* Display off, cursor off, blink off */
WAITBUSY( );
lcdwriteir( 0x01 ); /* Clear display */
WAITBUSY( );
lcdwriteir( 0x06 ); /* Entry mode : cursor increment */
WAITBUSY( );
lcdwriteir( 0x0C ); /* Display on, cursor off, blink off */
lcdx = lcdy = 0;
}
/**
* 僇乕僜儖埵抲巜掕
*/
void lcdlocate( char x, char y )
{
char addr;
switch ( y ){
case 0: addr = 0x00 + x; break;
case 1: addr = 0x40 + x; break;
case 2: addr = 0x14 + x; break;
case 3: addr = 0x54 + x; break;
default:
return;
}
lcdx = x;
lcdy = y;
WAITBUSY( );
lcdwriteir( 0x80 | addr ); /* Set DD RAM address */
}
/**
* 夋柺僋儕傾
*/
void lcdcls( void )
{
WAITBUSY( );
lcdwriteir( 0x01 );
lcdx = lcdy = 0;
}
/**
* 僇乕僜儖昞帵丒旕昞帵
*/
void lcddispcursor( char on )
{
WAITBUSY( );
lcdwriteir( 0x0C | ( on ? 0x02 : 0 ) );
}
/**
* 僶僢僋僗儁乕僗
*/
void lcdbs( void )
{
if( lcdx == 0 ){
return;
}
lcdx--;
lcdlocate( lcdx, lcdy );
}
/**
* 堦暥帤昞帵
*/
void lcdputch( char c )
{
if( c == '\b' ){
lcdbs( );
return;
}
WAITBUSY( );
lcdwritedr( c );
lcdx++;
}
/**
* 巜掕埵抲偵堦暥帤昞帵乮僉儍儔僋僞僐乕僪巜掕壜乯
*/
void lcdputcode( char x, char y, char code )
{
lcdlocate( x, y );
WAITBUSY( );
lcdwritedr( code );
}
/**
* 暥帤楍昞帵
*/
void lcdputstr( char *str )
{
while( *str != '\0' ){
lcdputch( *( str++ ) );
}
}
/**
* 埵抲傪巜掕偟偰暥帤楍傪昞帵偡傞
*/
void lcdprint( char x, char y, char *str )
{
lcdlocate( x, y );
lcdputstr( str );
}
/**
* 巜掕埵抲偐傜巜掕悢偺暥帤傪徚偡
*/
void lcdspace( char x, char y, char cnt )
{
char i;
lcdlocate( x + i, y );
for( i = 0; i < cnt; i++ ){
lcdputch( ' ' );
}
}
/**
* 堦峴僋儕傾
*/
void lcdlcls( char line )
{
lcdspace( 0, line, 16 );
}
/* end of lcd.c */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -