AMPIRE12864(NUM&CHINESE&PIC)

#ifndef __LCD12864_H__
#define __LCD12864_H__

#include "config.h"


#define uint unsigned int
#define uchar unsigned char

#define WrDat 1
#define WrCom 0
#define LCDdat P0
#define ON 1
#define OFF 0
#define _CHIN 16
#define _CHAR 8

//基本指令
#define LCD_CLEAR_SCREEN 0x01
#define LCD_ADDR_RESET 0x02
#define LCD_DISPLAY_SET 0x0c
//#define LCD_POSSHIFT_RIGHT 0x05 //光标左移,整体右移
#define LCD_POSSHIFT_RIGHT 0x06
#define LCD_SHIFT_LEFT 0x07 //光标右移,整体左移
#define LCD_POSSHIFT_LEFT 0x10
#define LCD_ALLSHIFT_LEFT 0x18 //整体左移,光标跟随
#define LCD_ALLSHIFT_RIGHT 0x1C //整体右移,光标跟随
#define LCD_BASIC_FUNCTION 0x30
#define LCD_EXTERND_FUNCTION 0x34
//扩展指令
#define LCD_AWAIT_MODE 0x01 //待命模式
#define LCD_ROLLADDRESS_ON 0x03 //允许输入垂直卷动地址
#define LCD_IRAMADDRESS_ON 0x02 //允许输入IRAM地址
#define LCD_SLEEP_MODE 0x08 //进入睡眠模式
#define LCD_NO_SLEEP_MODE 0x0c //脱离睡眠模式
#define LCD_GRAPH_ON 0x36 //打开绘图模式
#define LCD_GRAPH_OFF 0x34 //关闭绘图模式


sbit LCD128_RS=P2^5;
sbit LCD128_RW=P2^6;
sbit LCD128_EN=P2^7;

sbit CS1=P2^3;
sbit CS2=P2^4;
void LCD12864_CheckBusy(); //检查忙碌
void delayus(uint t);
void TransferData(uchar dat,uchar mode);
uchar LCD12864_RecData();
void LCD12864_Init();
void LCD12864_SetPos(uchar x,uchar y);

void DisCh_8(uchar x,uchar y,uchar *p);
void Dis_CharAndChin(uchar x,uchar y,uchar mode,uchar *p);
void Dis_ConCharAndChin(uchar Pos_x,uchar Pos_y,uchar mode,uchar Num,uchar *pic);
void Disp_Img(unsigned char code *img);
void Disp_ShifUp();
void Disp_ImgUp(unsigned char code *img);
void Disp_IMG6432(uchar x,uchar y,uchar *img);
void delay(uint t);
void Clr_Scr();

#endif

 


#include "config.h"


void delayus(uint t)
{
uint i;
for(i=0;i<t;i++);
}

void LCD12864_CheckBusy()
{
uchar BusyFlag,num;
num=10;
LCD128_RS=0;
LCD128_RW=1;
delayus(10);
BusyFlag=LCDdat&0x80;
LCD128_EN=0;
while(BusyFlag && (num--));
}
void TransferData(uchar dat,uchar mode)
{
LCD12864_CheckBusy();
LCD128_RS=mode;
LCD128_RW=0;
delayus(1);
LCDdat=dat;
LCD128_EN=1;
delayus(1);
LCD128_EN=0;
}
uchar LCD12864_RecData()
{

uchar temp;
LCD12864_CheckBusy();
LCD128_RS=1;
LCD128_RW=1;
LCD128_EN=1;
temp=LCDdat;
LCD128_EN=0;

return (temp);
}


void LCD12864_SetPos(uchar x,uchar y)
{
if (y>=64) {CS2=0;CS1=1;y=y-64;} //右屏显示
else {CS2=1;CS1=0;} //左屏显示
TransferData((0x40 | y),WrCom); //先写垂直坐标,后写横坐标 lie y
TransferData((0xb8 | x),WrCom); //ye x
}

void LCD12864_Init()
{
TransferData(0x3e,WrCom); //dip_off
delayus(10);
TransferData(0xb8,WrCom); //ye addr
delayus(10);
TransferData(0x40,WrCom); //lie addr
delayus(10);
TransferData(0xc0,WrCom); //hang addr
delayus(10);
TransferData(0x3f,WrCom); //disp on
delayus(10);
}

/*****************************************************************************
函数功能:指定位置显示数字16*16或者8*16程序
入口参数:pag,col,hzk
出口参数:
*****************************************************************************/
void Dis_CharAndChin(uchar x,uchar y,uchar mode,uchar *pic)
{
uchar i,j,num;
if(mode==_CHAR) num=8;
else if(mode==_CHIN) num=16;
for(i=0;i<2;i++)
{
LCD12864_SetPos((2*x+i),y);
for(j=0;j<num;j++)
TransferData(pic[num*i+j],WrDat);
}
}
void Dis_ConCharAndChin(uchar Pos_x,uchar Pos_y,uchar mode,uchar Num,uchar *pic)
{
uchar i,Dat_Num,Size_Num;
if(mode==_CHAR) {Size_Num=8;Dat_Num=16;}
else if(mode==_CHIN) {Size_Num=16;Dat_Num=32;}
for(i=0;i<Num;i++)
Dis_CharAndChin(Pos_x,Pos_y+i*Size_Num,mode,&pic[i*Dat_Num]);
}


/*------------------显示12864图片---------------------------*/
void Disp_Img(unsigned char code *img)
{
unsigned char j,k;
for(k=0;k<8;k++)
{
LCD12864_SetPos(k,0);
for(j=0;j<64;j++)
TransferData(img[k*128+j],WrDat);
LCD12864_SetPos(k,64);
for(j=64;j<128;j++)
TransferData(img[k*128+j],WrDat);
}
}

/*------------------显示12832图片---------------------------*/
void Disp_ImgUp(unsigned char code *img)
{
unsigned char j,k;
for(k=0;k<4;k++)
{
LCD12864_SetPos(k,0);
for(j=0;j<64;j++)
TransferData(img[k*128+j],WrDat);
LCD12864_SetPos(k,64);
for(j=64;j<128;j++)
TransferData(img[k*128+j],WrDat);
}
}
void Disp_IMG6432(uchar x,uchar y,uchar *img)
{
uchar i,j;
for(i=0;i<4;i++)
{
LCD12864_SetPos(x+i,y);
for(j=0;j<64;j++)
TransferData(img[i*64+j],WrDat);

}
}
void delay(uint t)
{
uchar i,j;
for(i=0;i<t;i++)
{for(j=0;j<113;j++);}
}
void Disp_ShifUp()
{
uchar Addr;
for(Addr=0xc0;Addr<0xff;Addr++) //up
{
CS1=0;
CS2=0;
TransferData(Addr,WrCom);
delay(200);
}
// for(Addr=0xff;Addr>0xc0;Addr--) //down
// {
// TransferData(Addr,WrCom);
// delay(100);
// }
}
/*------------------------清显示屏--------------------------------*/
void Clr_Scr()
{
unsigned char j,k;
// 清左半屏 //
LCD12864_SetPos(0,0);
for(k=0;k<4;k++) // 清左上半屏 //
{
for(j=0;j<64;j++)
TransferData(0x00,WrDat);
}
LCD12864_SetPos(0,64); // 清右上半屏 //
for(k=0;k<4;k++)
{
for(j=0;j<64;j++)
TransferData(0x00,WrDat);
}
LCD12864_SetPos(4,64);
for(k=0;k<4;k++) // 清右下半屏 //
{
for(j=0;j<64;j++)
TransferData(0x00,WrDat);
}
LCD12864_SetPos(4,0);
for(k=0;k<4;k++) // 清左下半屏 //
{
for(j=0;j<64;j++)
TransferData(0x00,WrDat);
}


}

 

转载于:https://www.cnblogs.com/kkchild/p/6624437.html

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值