/*
KS0108 128*64 LCD C语言驱动
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
#include
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;
SET_LCD_E;
asm("nop"); asm("nop");
asm("nop"); asm("nop");
data=*LCD_IP_PORT;
CLEAR_LCD_E;
SET_LCD_WRITE;
SEI();
return data;
}
void set_start_line_L(unsigned char line) /*设置显示起始行*/ //0-63 {
write_LCD(LEFT,CMD,0xc0|line);
}
void set_start_line_R(unsigned char line) /*设置显示起始行*/ //0-63 {
write_LCD(RIGHT,CMD,0xc0|line);
}
void set_page_L(unsigned char page) /*设置X地址设置页*/ //0-7 {
write_LCD(LEFT,CMD,0xb8|page);
}
void set_page_R(unsigned char page) /*设置X地址设置页*/ //0-7 {
write_LCD(RIGHT,CMD,0xb8|page);
}
void set_col_addr_L(unsigned char col) /*设置Y地址*/ //0-63
{
write_LCD(LEFT,CMD,0x40|col);
}
void set_col_addr_R(unsigned char col) /*设置Y地址*/ //0-63
{
write_LCD(RIGHT,CMD,0x40|col);
}
void init_lcd(void) /*初始化函数*/
{
set_start_line_L(0); /*显示起始行为0*/
set_start_line_R(0); /*显示起始行为0*/
write_LCD(LEFT,CMD,DISPLAY_ON); /* 开显示 */
write_LCD(RIGHT,CMD,DISPLAY_ON); /* 开显示 */
}
void clr_lcd(void) /*清屏函数*/
{
unsigned char pages,i;
for(pages=0;pages<8;pages++)
{
set_page_L(pages); /* X 页地址 */
set_page_R(pages); /* X 页地址 */
for(i=0;i<64;i++)
{
set_col_addr_L(i);//Y
set_col_addr_R(i);//Y
write_LCD(LEFT,DATA,0x0);
write_LCD(RIGHT,DATA,0x0);
}
}
}
//ASCII 字模宽度及高度
#define ASC_CHR_WIDTH 8
#define ASC_CHR_HEIGHT 12
typedef struct typFNT_ASC16 /* 汉字字模显示数据结构 */
{
char Index[1];
char Msk[16];
};
struct typFNT_ASC16 const ASC_16[] = { /* 显示为8*16 Curier 10 常规*/ "1",0x00,0x00,0x08,0x08,0xFC,0x00,0x00,0x00,0x00,0x00,0x04,0x04,0x07,0x04,0x04,0x00 ,
"2",0x00,0x00,0x08,0x04,0x84,0x44,0x38,0x00,0x00,0x00,0x06,0x05,0x04,0x04,0x04,0x00 ,
本文档为【51单片机 EDM12864P KS0108 C语言驱动】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。