|
本工程主要介紹了基于51單片機(jī)的LCD12864的顯示驅(qū)動(dòng)(字符,數(shù)字,圖片,漢字,表情包),以及介紹完成表情包在LCD12864中顯示的過(guò)程
主要借用了兩個(gè)工具Image2LCD,和PCtoLCD,其中前者用于對(duì)表情包圖片文件進(jìn)行輸出,后者用于取模。
附有如下工程源碼和工程文件。
#include "reg51.h"
#include <intrins.h>
#include "source.h"
//宏定義
#define databyte P1
//位定義
sbit RST=P2^0; //復(fù)位信號(hào),低電平有效
sbit E=P2^1; //讀寫(xiě)使能,高電平有效,下降沿鎖定數(shù)據(jù)
sbit RW=P2^2; //讀寫(xiě)選擇:1讀,0寫(xiě)
sbit RS=P2^3 ;//數(shù)據(jù)/指令選擇:1數(shù)據(jù)寫(xiě)入RAM
sbit CS2=P2^4; //片選2,低電平有效(后64列)
sbit CS1=P2^5; //前64列
sbit BF=P1^7;//DB7 忙/不忙
//函數(shù)聲明
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) ;
//主函數(shù)
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);
}
// 檢測(cè)忙
void LCD_busy()
{
unsigned char a;
RW=1;
RS=0;
E=1;//讀出忙標(biāo)志(BF)準(zhǔn)備
while(1)
{
E=0;//讀出忙標(biāo)志(BF)就緒
if(!(databyte&0x80))//讀取忙信號(hào)
break;//不忙跳出
E=1;
a++;
if(a>10)//防止死循環(huán)
break;
}
}
//寫(xiě)命令
void LCD_WriteCmd(unsigned char cmd)
{
LCD_busy() ;//檢測(cè)忙/不忙
RW=0; //讀寫(xiě)選擇:0寫(xiě)
RS=0; //數(shù)據(jù)/指令選擇:指令
databyte=cmd ;
E=1;
_nop_() ;
E=0; //讀寫(xiě)使能
}
//寫(xiě)數(shù)據(jù)
void LCD_WriteData(unsigned char dat)
{
LCD_busy() ;//檢測(cè)忙/不忙
RW=0; //讀寫(xiě)選擇:0寫(xiě)
RS=1; //數(shù)據(jù)/指令選擇:數(shù)據(jù)
databyte=dat ;
E=1;
_nop_();
E=0; //讀寫(xiě)使能
}
//設(shè)置開(kāi)關(guān)顯示(1開(kāi),0關(guān))
void LCD_Open(unsigned char flag)
{
LCD_busy() ;//檢測(cè)忙/不忙
E=1;
RW=0;RS=0;
if(flag)
databyte=0x3F;
else
databyte = 0x3E;
E=0;
}
//片選信號(hào)選通
//0:不選通
//1:選通CS1
//2:選通CS2
//3:同時(shí)選通
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);
}
}
}
//設(shè)置頁(yè)地址 (P0^1-P0^2 0-7)
void LCD_SetPage(unsigned char page)
{
page=((page&0x07)|0xB8); //10111xxx
LCD_WriteCmd(page);
}
//設(shè)置行地址 (P0^1-P0^5 0-63)
void LCD_SetLine(unsigned char line)
{
line =((line&0x3F)|0xC0); // 11xxxxxx
LCD_WriteCmd(line);
}
//設(shè)置列地址 (P0^1-P0^5 0-63)
void LCD_SetRow(unsigned char row)
{
row =((row&0x3F)|0x40); // 11xxxxxx
LCD_WriteCmd(row);
}
//復(fù)位
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時(shí)右屏顯示
// {
// LCD_CS(1);
// y=y-64;
// }
// else//列地址小于64時(shí)左屏顯示
// {
// LCD_CS(2);
// }
// LCD_WriteCmd(0x40|y);//寫(xiě)列地址
// _nop_();
// //line=x;
// LCD_WriteCmd(0xb8|x);//寫(xiě)行地址
//}
//顯示漢字:頁(yè)(0,2,4,6),行(0),列(0-64),數(shù)組中第n個(gè),數(shù)組地址
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;
}
}
}
//顯示字符:頁(yè)(0,2,4,6),行(0),列(0-64),數(shù)組中第n個(gè),數(shù)組地址
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, 下載次數(shù): 61)
2020-6-6 17:01 上傳
點(diǎn)擊文件名下載附件
|
評(píng)分
-
查看全部評(píng)分
|