【实例42】LCD显示图片实例
/*--------------- 文件名称: 122X32_test.C
功能 :在122X32的点阵液晶屏上显示图片
说明 :图片事先使用img2lcd等类似程序转换成图片数组文件 ----------------*/
/*-------------------------------------------------------------------------------------------------------- D0-----P0.0 D4-----P0.4 RW-------P1.1 A0--------P1.0 D1-----P0.1 D5-----P0.5 RS-------P2.1 V0接到GND D2-----P0.2 D6-----P0.6 E1-------P1.3 D3-----P0.3 D7-----P0.7 E2-------P1.2
---------------------------------------------------------------------------------------------------------*/ #include
#define uchar unsigned char #define uint unsigned int
#define E1 P1_3 //块1 左边使能 #define E2 P1_2 //块2 右边使能 #define RW P1_1
#define A0 P1_0 //A0为1时是数据,0时为指令数据 #define DATA P0 //数据
extern unsigned char code Bmp02[]={0x00,0x00,0x00,0x00,......};//图形代码数组 extern unsigned char code Bmp01[]={0x00,0x00,0x00,0x00,......};//图形代码数组 /******************************** 函数名称: void delay(unsigned int i) 功能 :延时函数
说明 :采用软延时方案实现延时 入口参数:i为延时常数,i越大延时越长 返回值 :无
********************************/ void delay(unsigned int i) {
unsigned char k=200; while(i>0) { i--; }
while(k>1)k--; }
/******************************** 函数名称: void OUTMD(unsigned char i) 功能 :发送左页数据 说明 :无
入口参数:i为要发送的数据 返回值 :无
********************************/ void OUTMD(unsigned char i) {
A0=1; //写数据 E1=1; DATA=i; E1=0; }
/******************************** 函数名称: void OUTMI(unsigned char i) 功能 :发送左页命令 说明 :无
入口参数:i为要发送的命令码 返回值 :无
********************************/ void OUTMI(unsigned char i) {
A0=0; //写指令 E1=1; DATA=i; E1=0; }
/******************************** 函数名称: void OUTSD(unsigned char i) 功能 :发送右页数据 说明 :无
入口参数:i为要发送的数据 返回值 :无
********************************/ void OUTSD(unsigned char i) {
A0=1; //写数据 E2=1; DATA=i; E2=0; }
/******************************** 函数名称: void OUTSI(unsigned char i) 功能 :发送右页命令 说明 :无
入口参数:i为要发送的命令码 返回值 :无
********************************/ void OUTSI(unsigned char i)
{
A0=0; //写指令 E2=1; DATA=i; E2=0; }
/******************************** 函数名称: void lcdini(void) 功能 :初始化液晶屏
说明 :液晶屏被复位,并初始化到图形模式 入口参数:无 返回值 :无
********************************/ void lcdini(void) { RW=0; OUTMI(0XE2);
OUTSI(0XE2); //复位 OUTMI(0XAE);
OUTSI(0XAE); //POWER SAVE OUTMI(0XA4);
OUTSI(0XA4); //动态驱动 OUTMI(0XA9);
OUTSI(0XA9); //1/32占空比 OUTMI(0XA0);
OUTSI(0XA0); //时钟线输出 OUTMI(0XEE);
OUTSI(0XEE); //写模式 OUTMI(0X00); OUTMI(0XC0); OUTSI(0X00); OUTSI(0XC0); OUTMI(0XAF); OUTSI(0XAF); }
/********************************
函数名称: void SetPage(uchar page0,uchar page1) 功能 :同时设置左右页面地址0-3页
说明 :对液晶屏操作时,要先设置页面地址,不影响当前液晶屏的显示内容 入口参数:page0为左页地址,page1为右页地址 返回值 :无
********************************/ void SetPage(uchar page0,uchar page1) {
OUTMI(0xB8|page1); OUTSI(0xB8|page0); }
/********************************
函数名称: void SetAddress(uchar address0,uchar address1) 功能 :设置左右屏列地址0-121 说明 :设置要操作的左右屏地址
入口参数:address0为左页地址,address1为右页地址 返回值 :无
********************************/ void SetAddress(uchar address0,uchar address1) {
OUTMI(address1); OUTSI(address0); }
/******************************** 函数名称: void PutCharR(uchar ch) 功能 :向右屏当前地址画一个字节8个点 说明 :无
入口参数:ch为要显示的数据 返回值 :无
********************************/ void PutCharR(uchar ch) {
OUTSD(ch); }
/******************************** 函数名称: void PutCharL(uchar ch) 功能 :向右屏当前地址画一个字节8个点 说明 :无
入口参数:ch为要显示的数据 返回值 :无
********************************/ void PutCharL(uchar ch) {
OUTMD(ch); }
/******************************** 函数名称: void clrscr(void) 功能 :清屏 说明 :无 入口参数:无 返回值 :无
********************************/
void clrscr(void) {
uchar i; uchar page;
for (page=0;page<4;page++) {
SetPage(page,page); SetAddress(0,0); for (i=0;i<61;i++) {
PutCharR(0); PutCharL(0); } } }
/********************************
函数名称: void DrawBmp1(uchar x_add, uchar width,uchar *bmp) 功能 :在屏幕显示图片
说明 :图片数组可采用字模软件生成
入口参数:x_add为要显示的横坐标,width为要显示的图片的宽度,*bmp为指向图片数组的指针 返回值 :无
********************************/
void DrawBmp1(uchar x_add, uchar width,uchar *bmp) {
uchar x, address, i=0; //address 表示显存的物理地址 uchar page=0; //page表示上下两页 uchar window=0; //window表示左右两页 for (x=width;x>1;x--) {
if (x_add>60) {
window=1; address=x_adda; } else
address=x_add; SetPage(0,0);
SetAddress(address,address); if(window==1) PutCharR(bmp[i]); else
PutCharL(bmp[i]); SetPage(1,1);
SetAddress(address,address);
if(window==1)
PutCharR(bmp[i+width]); else
PutCharL(bmp[i+width]); SetPage(2,2);
SetAddress(address,address); if(window==1)
PutCharR(bmp[i+width+width]); else
PutCharL(bmp[i+width+width]); SetPage(3,3);
SetAddress(address,address); if(window==1)
PutCharR(bmp[i+width+width+width]); else
PutCharL(bmp[i+width+width+width]); i++; x_add++; } }
/******************************** 函数名称: void delay1s(unsigned char i) 功能 :一秒延时 说明 :无
入口参数:i为延时参数,数值越大,延时越长 返回值 :无
********************************/ void delay1s(unsigned char i) {
while(i>1) { i--;
delay(65530); } } //主函数 void main() {
lcdini(); //复位初始化液晶屏 clrscr(); //清屏
while(1) //交替显示Bmp01和Bmp02 {
delay1s(3);
clrscr(); //
DrawBmp1(10,101,Bmp01); // delay1s(8); clrscr(); //
DrawBmp1(0,122,Bmp02); // delay1s(8); } }