📄 lcd12864.c
字号:
//******************************************************************************/
//**
//** 模 块 名: -------------------lcd12864.C----------------------------------
//** -----------------12864液晶显示模块----------------------------*/
//** 功能描述:
//**
//** 创 建 人: LXJ(xingyusky) 日期:2008-4-7 */
//** 修 改 人: 日期:2008-4-7 */
//** 其他说明:
//******************************************************************************/
#include<avr/io.h>
#include"type.h"
#include <string.h>
#include <util/delay.h>
#include <stdio.h>
#include <avr\pgmspace.h>
#include"zimo_code.h"
#include"lcd12864.h"
//********************************************************
// 判忙函数
//读状态:输入:D/I=L,CS1或CS2=H,R/W=H,E=H 输出:D0--D7=状态字
//********************************************************
void Is_lcd12864_busy(UCHAR right)
{
LCD12864_DataPort_DIR=0X00;
LCD12864_DataPort=0xff;
CLR_LCD_EN;
_delay_us(2);
CLR_LCD_DI;
_delay_us(1);
if(1==right)
{
CLR_LCD_CS1;
SET_LCD_CS2;
}
else //左半平面
{
SET_LCD_CS1;
CLR_LCD_CS2;
}
SET_LCD_RW;
_delay_us(1);
SET_LCD_EN;
_delay_us(2);
while(LCD12864_IP_DataPort & BUSY);
// {
// DDRA=0XFF;
// PORTA=0XFF;
// }
CLR_LCD_EN;
_delay_us(100);
// PORTA=0X00;
LCD12864_DataPort_DIR=0XFF;
}
//********************************************************
// 写控制志
//写控制志:输入:D/I=L,CS1或CS2=H,R/W=L,E=H D0--D7=指令码,E=L
//********************************************************
void Write_lcd12864_Order(UCHAR order,UCHAR right)
{
Is_lcd12864_busy(right);
CLR_LCD_EN;
_delay_us(2);
CLR_LCD_DI;
_delay_us(1);
CLR_LCD_RW;
_delay_us(1);
LCD12864_DataPort=order;
SET_LCD_EN;
_delay_us(2);
CLR_LCD_EN;
_delay_us(2);
//order=
//0x3e//显示开/关 //on=on|3e (0——1)
//0xc0//起始行地址为0//x=x|c0 (0——63)
//0xb8//起始页地址为0//ye=ye|b8 (0——7)
//0x40//起始列地址为0//y=y|40 (0——63)
}
//********************************************************
// 写数据
//写数据:输入:D/I=H,CS1或CS2=H,R/W=L,E=H D0--D7=数据,E=L
//********************************************************
void Write_lcd12864_Data(/*字号设置*/UCHAR H /*X*/,UCHAR L,/*页设置*/UCHAR page,/*列设置*/UCHAR y,/*显示内容设置*/char hz[],/*左右半屏设置*/UCHAR right)
{
UCHAR i,ki,j;
UCHAR len;
UINT k;
char *p1;
//**************************************************************
len=strlen(hz); //取输入字符串的长度
if(8>=H) //判断字体大小
for(ki=0;ki<len;ki++)
{
p1=&hz[ki]; //取出传送的字符(一个一个的取)
//*************************************************************
switch(H)
{
//*************************************************************
case 5: //5*8
{
for(k=0;k<sizeof(ASC_5)/sizeof(ASC_5[0]);k++) //取出字库的长度
{
//找出对应字符
if(p1[0] == ASC_5[k].Index[0] )
break;
}
for(i=0;i<L/8;i++) //从第一页写
{
Write_lcd12864_Order( (page+i)|0xb8,right);
Write_lcd12864_Order((y+ki*8)|0x40,right);
for(j=0;j<H;j++) //写行
{
Is_lcd12864_busy(right);
CLR_LCD_EN;
_delay_us(2);
SET_LCD_DI;
_delay_us(1);
CLR_LCD_RW;
_delay_us(1);
LCD12864_DataPort=ASC_5[k].Msk[H*i+j];
SET_LCD_EN;
_delay_us(2);
CLR_LCD_EN;
_delay_us(2);
}
}
break;
}
//********************************************************
case 8:
{
for(k=0;k<sizeof(ASC_8)/sizeof(ASC_8[0]);k++)
{
if(p1[0] == ASC_8[k].Index[0] )
break;
}
for(i=0;i<L/8;i++)
{
Write_lcd12864_Order( (page+i)|0xb8,right);
Write_lcd12864_Order((y+ki*8)|0x40,right);
for(j=0;j<H;j++)
{
Is_lcd12864_busy(right);
CLR_LCD_EN;
_delay_us(2);
SET_LCD_DI;
_delay_us(1);
CLR_LCD_RW;
_delay_us(1);
LCD12864_DataPort=ASC_8[k].Msk[H*i+j];
SET_LCD_EN;
_delay_us(2);
CLR_LCD_EN;
_delay_us(2);
}
}
break;
}
}
}
//********************************************************
else
for(ki=0;ki<len;ki=ki+2)
{
p1=&hz[ki];
//*************************************************************
switch(H)
{
//*************************************************************
case 12:
{
for(k=0;k<sizeof(GB_12)/sizeof(GB_12[0]);k++)
{
if(p1[0] == GB_12[k].Index[0] && p1[1] == GB_12[k].Index[1])
break;
}
for(i=0;i<L/8;i++)
{
Write_lcd12864_Order( (page+i)|0xb8,right);
Write_lcd12864_Order((y+ki*8)|0x40,right);
for(j=0;j<H;j++)
{
Is_lcd12864_busy(right);
CLR_LCD_EN;
_delay_us(2);
SET_LCD_DI;
_delay_us(1);
CLR_LCD_RW;
_delay_us(1);
LCD12864_DataPort=GB_12[k].Msk[H*i+j];
SET_LCD_EN;
_delay_us(2);
CLR_LCD_EN;
_delay_us(2);
}
}
break;
}
//********************************************************
case 16:
{
for(k=0;k<sizeof(GB_16)/sizeof(GB_16[0]);k++)
{
if(p1[0] == GB_16[k].Index[0] && p1[1] == GB_16[k].Index[1])
break;
}
for(i=0;i<L/8;i++)
{
Write_lcd12864_Order((page+i)|0xb8,right);
Write_lcd12864_Order((y+ki*8)|0x40,right);
for(j=0;j<H;j++)
{
Is_lcd12864_busy(right);
CLR_LCD_EN;
_delay_us(2);
SET_LCD_DI;
_delay_us(1);
CLR_LCD_RW;
_delay_us(1);
LCD12864_DataPort=GB_16[k].Msk[H*i+j];
SET_LCD_EN;
_delay_us(2);
CLR_LCD_EN;
_delay_us(2);
}
}
break;
}
//********************************************************
case 100:
{
for(k=0;k<sizeof(TU_48)/sizeof(TU_48[0]);k++)
{
if(p1[0] == TU_48[k].Index[0] && p1[1] == TU_48[k].Index[1])
break;
}
//CLR_LCD_CS1;
//SET_LCD_CS2;
for(i=0;i<L/8;i++)
{
Write_lcd12864_Order( (page+i)|0xb8,0);
Write_lcd12864_Order((y+ki*8)|0x40,0);
for(j=0;j<H/2+6;j++)
{
Is_lcd12864_busy(0);
CLR_LCD_EN;
_delay_us(2);
SET_LCD_DI;
_delay_us(1);
CLR_LCD_RW;
_delay_us(1);
LCD12864_DataPort=TU_48[k].Msk[H*i+j];
SET_LCD_EN;
_delay_us(2);
CLR_LCD_EN;
_delay_us(2);
}
}
//***************************************************
// SET_LCD_CS1;
// CLR_LCD_CS2;
for(i=0;i<L/8;i++)
{
Write_lcd12864_Order( (page+i)|0xb8,1);
Write_lcd12864_Order((y+ki*8)|0x40,1);
for(j=H/2+6;j<H;j++)
{
Is_lcd12864_busy(1);
CLR_LCD_EN;
_delay_us(2);
SET_LCD_DI;
_delay_us(1);
CLR_LCD_RW;
_delay_us(1);
LCD12864_DataPort=TU_48[k].Msk[H*i+j];
SET_LCD_EN;
_delay_us(2);
CLR_LCD_EN;
_delay_us(2);
}
}
break;
}
//*********************************************************
case 128:
{
for(k=0;k<sizeof(TU_64)/sizeof(TU_64[0]);k++)
{
if(p1[0] == TU_64[k].Index[0] && p1[1] == TU_64[k].Index[1])
break;
}
//CLR_LCD_CS1;
//SET_LCD_CS2;
for(i=0;i<L/8;i++)
{
Write_lcd12864_Order((page+i)|0xb8,0);
Write_lcd12864_Order((y+ki*8)|0x40,0);
for(j=0;j<H/2;j++)
{
Is_lcd12864_busy(0);
CLR_LCD_EN;
_delay_us(2);
SET_LCD_DI;
_delay_us(1);
CLR_LCD_RW;
_delay_us(1);
LCD12864_DataPort=TU_64[k].Msk[H*i+j];
SET_LCD_EN;
_delay_us(2);
CLR_LCD_EN;
_delay_us(2);
}
}
//***************************************************
// SET_LCD_CS1;
// CLR_LCD_CS2;
for(i=0;i<L/8;i++)
{
Write_lcd12864_Order( (page+i)|0xb8,1);
Write_lcd12864_Order((y+ki*8)|0x40,1);
for(j=H/2;j<H;j++)
{
Is_lcd12864_busy(1);
CLR_LCD_EN;
_delay_us(2);
SET_LCD_DI;
_delay_us(1);
CLR_LCD_RW;
_delay_us(1);
LCD12864_DataPort=TU_64[k].Msk[H*i+j];
SET_LCD_EN;
_delay_us(2);
CLR_LCD_EN;
_delay_us(2);
}
}
break;
}
//********************************************************
}
}
}
//********************************************************
//********************************************************
// //清屏
//********************************************************
void Clearscreen(UCHAR right)
{
UCHAR j,k;
//清半屏幕
for(k=0;k<8;k++)
{
Write_lcd12864_Order( k|0xb8,right);
Write_lcd12864_Order(0x40,right);
for(j=0;j<64;j++)
{
Is_lcd12864_busy(right);
CLR_LCD_EN;
_delay_us (2);
SET_LCD_DI;
_delay_us(1);
CLR_LCD_RW;
_delay_us(1);
LCD12864_DataPort_DIR=0XFF;
LCD12864_DataPort=0x00;
SET_LCD_EN;
_delay_us (2);
CLR_LCD_EN;
_delay_us (2);
}
}
/*
//清左半屏幕
for(k=0;k<8;k++)
{
Write_lcd12864_Order( k|0xb8);
Write_lcd12864_Order(0x40);
for(j=0;j<64;j++)
{
//CLR_LCD_CS1;
//SET_LCD_CS2;
Is_lcd12864_busy(0);
//CLR_LCD_EN;
//_delay_us (100);
SET_LCD_DI;
_delay_us(10);
CLR_LCD_RW;
_delay_us(10);
LCD12864_DataPort=0x00;
SET_LCD_EN;
_delay_us (100);
CLR_LCD_EN;
_delay_us (100);
}
}
*/
}
//********************************************************
//LCD12864初始化
//********************************************************
void Lcd12864_Init(void)
{
Write_lcd12864_Order(0x3f,0);
Write_lcd12864_Order(0x3f,1);
Write_lcd12864_Order(0x0c,0);
Write_lcd12864_Order(0x0c,1);
Write_lcd12864_Order(0xc0,0);
Write_lcd12864_Order(0xc0,1);
Write_lcd12864_Order(0xb8,0);
Write_lcd12864_Order(0xb8,1);
Write_lcd12864_Order(0x40,0);
Write_lcd12864_Order(0x40,1);
Write_lcd12864_Order(0x0c,0);
Write_lcd12864_Order(0x0c,1);
Clearscreen(0);
Clearscreen(1);
// BAKLight=0;
//Write_lcd12864_Order(;);
}
/*******************************************************************************
**** End Of File
*******************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -