KS0108 128X64 LCD C语言AVR程序
/*
LCD引脚定义
1---GND
2---VCC
3---VLCD
4---D/I
5---R/W
6---E
7到14 D0-D7
15--CS1
16--CS2
17--RESET
18--VEE
19--SW
20--NC
*/
#include <iom16v.h>
#include <macros.h>
unsigned char CurOffset,CurRow,CurPage,CurCol;
/* 常量定义 */
#define LCD_STATUS_BUSY 0x80
#define START_LINE0 0xc0
#define DISPLAY_ON 0x3f
#define DISPLAY_OFF 0x3e
#define PARA1 0x40
//PORTA---数据口 PORTB----控制口
volatile unsigned char *LCD_DIR_PORT = &DDRA;
volatile unsigned char *LCD_IP_PORT = &PINA;
volatile unsigned char *LCD_OP_PORT = &PORTA;
volatile unsigned char *LCD_EN_PORT = &PORTB;
volatile unsigned char *LCD_CS2_PORT = &PORTB;
volatile unsigned char *LCD_CS1_PORT = &PORTB;
volatile unsigned char *LCD_RW_PORT = &PORTB;
volatile unsigned char *LCD_DI_PORT = &PORTB;
char LCD_EN_BIT = BIT(4);
char LCD_CS2_BIT = BIT(3);
char LCD_CS1_BIT = BIT(2);
char LCD_RW_BIT = BIT(1);
char LCD_DI_BIT = BIT(0);
#define SET_LCD_E *LCD_EN_PORT |= LCD_EN_BIT //LCD使能
#define CLEAR_LCD_E *LCD_EN_PORT &= ~LCD_EN_BIT //LCD禁止
#define SET_LCD_DATA *LCD_DI_PORT |= LCD_DI_BIT //选择指令端口
#define SET_LCD_CMD *LCD_DI_PORT &= ~LCD_DI_BIT //选择数据端口
#define SET_LCD_READ *LCD_RW_PORT |= LCD_RW_BIT //读模式
#define SET_LCD_WRITE *LCD_RW_PORT &= ~LCD_RW_BIT //写模式
#define SET_LCD_CS2 *LCD_CS2_PORT |= LCD_CS2_BIT //左屏选择禁止
#define CLEAR_LCD_CS2 *LCD_CS2_PORT &= ~LCD_CS2_BIT //左屏选择使能
#define SET_LCD_CS1 *LCD_CS1_PORT |= LCD_CS1_BIT //左屏选择禁止
#define CLEAR_LCD_CS1 *LCD_CS1_PORT &= ~LCD_CS1_BIT //左屏选择使能
#define LEFT 0
#define RIGHT 1
#define CMD 0
#define DATA 1
void LCD_BUSY(unsigned char lr) //判断忙标志
{
unsigned char status;
CLI();
if(lr==LEFT)
{
CLEAR_LCD_CS2; //cs2=0
SET_LCD_CS1; //cs1=1
}
else
{
SET_LCD_CS2; //cs2=1
CLEAR_LCD_CS1; //cs1=0
}
SET_LCD_CMD;
*LCD_DIR_PORT = 0x00;
*LCD_OP_PORT = 0xff;
SET_LCD_READ;
SET_LCD_E;
asm("nop"); asm("nop");
asm("nop"); asm("nop");
while((*LCD_IP_PORT) & LCD_STATUS_BUSY)
{
CLEAR_LCD_E;
asm("nop"); asm("nop");
asm("nop"); asm("nop");
SET_LCD_E;
asm("nop"); asm("nop");
asm("nop"); asm("nop");
}
CLEAR_LCD_E;
SET_LCD_WRITE;
*LCD_OP_PORT = 0xff;
SEI();
}
void write_LCD(unsigned char lr,unsigned char cd,unsigned char data) /*写入指令或数据*/
{
CLI();
LCD_BUSY(lr);
if(cd==CMD) SET_LCD_CMD;
else SET_LCD_DATA;
SET_LCD_WRITE;
SET_LCD_E;
*LCD_DIR_PORT = 0xff;
*LCD_OP_PORT = data;
asm("nop"); asm("nop");
asm("nop"); asm("nop");
CLEAR_LCD_E;
*LCD_OP_PORT = 0xff;
SEI();
}
unsigned char read_LCD(unsigned char lr) /* 读显示数据 */
{
unsigned char data;
CLI();
LCD_BUSY(lr);
SET_LCD_DATA;
*LCD_DIR_PORT = 0x00;
*LCD_OP_PORT = 0xff;
SET_LCD_READ;
SET_LCD_E;
asm("nop"); asm("nop");
asm("nop"); asm("nop");
data=*LCD_IP_PORT;
CLEAR_LCD_E;
SET_LCD_WRITE;
LCD_BUSY(lr);
SET_LCD_DATA;
*LCD_DIR_PORT = 0x00;
*LCD_OP_PORT = 0xff;
SET_LCD_READ;