本工程主要介绍了基于51单片机的LCD12864的显示驱动(字符,数字,图片,汉字,表情包),以及介绍完成表情包在LCD12864中显示的过程
主要借用了两个工具Image2LCD,和PCtoLCD,其中前者用于对表情包图片文件进行输出,后者用于取模。
附有如下工程源码和工程文件。
#include "reg51.h"
#include <intrins.h>
#include "source.h"
//宏定义
#define databyte P1
//位定义
sbit RST=P2^0; //复位信号,低电平有效
sbit E=P2^1; //读写使能,高电平有效,下降沿锁定数据
sbit RW=P2^2; //读写选择:1读,0写
sbit RS=P2^3 ;//数据/指令选择:1数据写入RAM
sbit CS2=P2^4; //片选2,低电平有效(后64列)
sbit CS1=P2^5; //前64列
sbit BF=P1^7;//DB7 忙/不忙
//函数声明
void delay_ms(int n);
void LCD_Change();
void LCD_Init();
void LCD_busy();
void LCD_WriteCmd(unsigned char cmd);
void LCD_WriteData(unsigned char dat);
void LCD_Open(unsigned char flag);
void LCD_CS(int flag);
void LCD_Clear();
void LCD_SetPage(unsigned char page);
void LCD_SetLine(unsigned char line);
void LCD_SetRow(unsigned char row);
void LCD_Reset();
void display_hz( int page,int line_local ,int row_locol,unsigned char s ,unsigned char code *p);
//void set_xy(unsigned char x,unsigned char y);
void display_zf( int page ,int line_local ,int row_locol, unsigned char s ,unsigned char code *p);
void display_img( unsigned char code *p,bit c);
void display_img_1( unsigned char code *p,bit c) ;
//主函数
void main()
{
LCD_Init();
LCD_Clear();
while(1)
{
display_img(dog2,1);
// LCD_Change() ;
// display_img_1(horse,1);
// LCD_Change() ;
}
while(1);
}
void delay_ms( int n)
{
int i,j;
for(i = 0;i<n;i++)
{
for(j = 0;j<120;j++);
}
}
//LCD初始化
void LCD_Init()
{
LCD_Reset();
LCD_CS(3);
LCD_Open(0);
LCD_SetPage(0);
LCD_SetLine(0);
LCD_SetRow(0);
LCD_Open(1);
}
// 检测忙
void LCD_busy()
{
unsigned char a;
RW=1;
RS=0;
E=1;//读出忙标志(BF)准备
while(1)
{
E=0;//读出忙标志(BF)就绪
if(!(databyte&0x80))//读取忙信号
break;//不忙跳出
E=1;
a++;
if(a>10)//防止死循环
break;
}
}
//写命令
void LCD_WriteCmd(unsigned char cmd)
{
LCD_busy() ;//检测忙/不忙
RW=0; //读写选择:0写
RS=0; //数据/指令选择:指令
databyte=cmd ;
E=1;
_nop_() ;
E=0; //读写使能
}
//写数据
void LCD_WriteData(unsigned char dat)
{
LCD_busy() ;//检测忙/不忙
RW=0; //读写选择:0写
RS=1; //数据/指令选择:数据
databyte=dat ;
E=1;
_nop_();
E=0; //读写使能
}
//设置开关显示(1开,0关)
void LCD_Open(unsigned char flag)
{
LCD_busy() ;//检测忙/不忙
E=1;
RW=0;RS=0;
if(flag)
databyte=0x3F;
else
databyte = 0x3E;
E=0;
}
//片选信号选通
//0:不选通
//1:选通CS1
//2:选通CS2
//3:同时选通
void LCD_CS(int flag)
{
switch(flag)
{
case 0: CS1=1;CS2=1;break;
case 1: CS1=0;CS2=1;break;
case 2: CS1=1;CS2=0;break;
case 3: CS1=0;CS2=0;break;
}
}
//清屏
void LCD_Clear()
{
int i,j;
LCD_CS(3) ;
for(i=0;i<8;i++)
{
LCD_SetPage(i) ;
LCD_SetRow(0) ;
for(j=0;j<64;j++)
{
LCD_WriteData(0);
}
}
}
//设置页地址 (P0^1-P0^2 0-7)
void LCD_SetPage(unsigned char page)
{
page=((page&0x07)|0xB8); //10111xxx
LCD_WriteCmd(page);
}
//设置行地址 (P0^1-P0^5 0-63)
void LCD_SetLine(unsigned char line)
{
line =((line&0x3F)|0xC0); // 11xxxxxx
LCD_WriteCmd(line);
}
//设置列地址 (P0^1-P0^5 0-63)
void LCD_SetRow(unsigned char row)
{
row =((row&0x3F)|0x40); // 11xxxxxx
LCD_WriteCmd(row);
}
//复位
void LCD_Reset()
{
RST = 0;
_nop_();
RST=1;
_nop_();
LCD_Open(1);
}
//void set_xy(unsigned char x,unsigned char y)//x为行,y为列
//{
// if(y>=64)//列地址大于等于64时右屏显示
// {
// LCD_CS(1);
// y=y-64;
// }
// else//列地址小于64时左屏显示
// {
// LCD_CS(2);
// }
// LCD_WriteCmd(0x40|y);//写列地址
// _nop_();
// //line=x;
// LCD_WriteCmd(0xb8|x);//写行地址
//}
//显示汉字:页(0,2,4,6),行(0),列(0-64),数组中第n个,数组地址
void display_hz( int page ,int line_local ,int row_locol, unsigned char s ,unsigned char code *p)
{
int i,j;
int x;
int row,line;
line = line_local;
row = row_locol;
if(row>=64)
{
LCD_CS(2);
row-=64;
x = 0x20*s;
LCD_SetPage(page);
LCD_SetLine(line);
LCD_SetRow(row);
for(i=0;i<2;i++)
{
for(j=0;j<16;j++)
{
LCD_WriteData(p[x]);
x++;
row++;
LCD_SetRow(row);
}
LCD_SetPage(page+1);
row=row_locol;
}
}
else
{
LCD_CS(1);
x = 0x20*s;
LCD_SetPage(page);
LCD_SetLine(line);
LCD_SetRow(row);
for(i=0;i<2;i++)
{
for(j=0;j<16;j++)
{
LCD_WriteData(p[x]);
x++;
row++;
LCD_SetRow(row);
}
LCD_SetPage(page+1);
row=row_locol;
}
}
}
//显示字符:页(0,2,4,6),行(0),列(0-64),数组中第n个,数组地址
void display_zf( int page ,int line_local ,int row_locol, unsigned char s ,unsigned char code *p)
{
int i,j;
int x;
int row,line;
line = line_local;
row = row_locol;
if(row>=64)
{
LCD_CS(2);
row-=64;
x = 0x10*s;
LCD_SetPage(page);
LCD_SetLine(line);
LCD_SetRow(row);
for(i=0;i<2;i++)
{
for(j=0;j<8;j++)
{
LCD_WriteData(p[x]);
x++;
row++;
LCD_SetRow(row);
}
LCD_SetPage(page+1);
row=row_locol;
}
}
else
{
LCD_CS(1);
x = 0x10*s;
LCD_SetPage(page);
LCD_SetLine(line);
LCD_SetRow(row);
for(i=0;i<2;i++)
{
for(j=0;j<8;j++)
{
LCD_WriteData(p[x]);
x++;
row++;
LCD_SetRow(row);
}
LCD_SetPage(page+1);
row=row_locol;
}
}
}
//显示图片
void display_img( unsigned char code *p,bit c)
{
int i,j;
LCD_CS(1);
for(j=0;j<8;j++)
{
LCD_SetPage(j);
LCD_SetRow(0) ;
for(i=0;i<64;i++)
{
if(c)
LCD_WriteData(p[118*j+i]);
else
LCD_WriteData(~p[118*j+i]);
}
}
LCD_CS(2);
for(j=0;j<8;j++)
{
LCD_SetPage(j);
LCD_SetRow(0) ;
for(i=64;i<118;i++)
{
if(c)
LCD_WriteData(p[118*j+i]);
else
LCD_WriteData(~p[118*j+i]);
}
}
}
void display_img_1( unsigned char code *p,bit c)
{
int i,j;
LCD_CS(1);
for(j=0;j<8;j++)
{
LCD_SetPage(j);
LCD_SetRow(0) ;
for(i=0;i<64;i++)
{
if(c)
LCD_WriteData(p[128*j+i]);
else
LCD_WriteData(~p[128*j+i]);
}
}
LCD_CS(2);
for(j=0;j<8;j++)
{
LCD_SetPage(j);
LCD_SetRow(0) ;
for(i=64;i<128;i++)
{
if(c)
LCD_WriteData(p[128*j+i]);
else
LCD_WriteData(~p[128*j+i]);
}
}
}
//LCD切屏
void LCD_Change()
{
delay_ms(1000);
LCD_Clear();
delay_ms(50);
}
LCD12864任意图片.rar
(6.75 MB, 下载次数: 61)
|