📄 main.c
字号:
/***********http://hi.baidu.com/echoas**************
程序:LCD12864显示图片原理
内容:显示国旗和人物头像
软件:keil uVision4
学习板:HOT-51
作者:大海橡树
整理日期:2010-11-18 21:00
修改:无
备注:有什么错误的地方,欢迎网友们到空间留言
O(∩_∩)O~
*************http://hi.baidu.com/echoas************/
#include<AT89X52.h>
#include"BMP.h"
#include"BMP1.h"
#include"BMP2.h"
#define uchar unsigned char
#define uint unsigned int
sbit RS=P2^5;
sbit RW=P2^6;
sbit EN=P2^7; //LCD三个控制端
void delay(uint i) //延时函数
{
while(--i);
}
void read_busy()//读忙函数。每次读写都要进行读忙操作
{
RS=0;
RW=1;
EN=1;
while(P0 & 0x80);//最高位为BF位 DB7---BF
EN=0;
}
void write_LCD_command(uchar value)//写指令函数
{
read_busy();
RS=0;
RW=0;
EN=1; //EN从1---0锁存数据
P0=value;
delay(200);
EN=0;
}
void write_LCD_data(uchar value)//写数据函数
{
read_busy();
RS=1;
RW=0;
EN=1; //EN从1---0锁存数据
P0=value;
delay(200);
EN=0;
}
/***********************************************
函数:显示图片初始化
说明:与显示汉字的不一样(基本指令--0x30),显示图
片的指令是扩充指令---0x36
***********************************************/
void init_BMP()
{
write_LCD_command(0x36);//CL=1--8位。扩充指令(RE=1),绘图打开(G=1)
delay(100); //适当延时
write_LCD_command(0x36);
delay(37);
write_LCD_command(0x3E); //8位(CL=1),扩充指令(RE=1),绘图打开(G=1)
delay(100);
write_LCD_command(0x01);//清屏指令
delay(100);
}
/**********************************************
函数:显示图片
说明:要先设定垂直地址再设定水平地址(连续写入两
个字节的资料来完成垂直于水平的坐标地址)
0x80---0x87:显示上半部分
0x88---0x8F:显示下半部分
只需设定显示的第一个位置,指针会自动加1
**********************************************/
void display_BMP(uchar *address)
{
uchar i,j;
for(i=0;i<32;i++)
{
write_LCD_command(0x80+i);//先送垂直地址
write_LCD_command(0x80); //再送水平地址 ----显示图片的上半部分
for(j=0;j<16;j++)
{
write_LCD_data(*address);
address++;
}
}
for(i=0;i<32;i++)
{
write_LCD_command(0x80+i); //先送垂直地址
write_LCD_command(0x88); //显示图片的下半部分
for(j=0;j<16;j++)
{
write_LCD_data(*address);
address++; //指针地址指向下个位置
}
}
}
void clear_BMP_RAM()//清除图片显示RAM区的数据,与清屏指令write_LCD_command(0x01)不同
{
uchar i,j;
for(i=0;i<32;i++)
{
write_LCD_command(0x80+i);
write_LCD_command(0x80);
for(j=0;j<16;j++)
{
write_LCD_data(0);//清0
}
}
for(i=0;i<32;i++)
{
write_LCD_command(0x80+i);
write_LCD_command(0x88);
for(j=0;j<16;j++)
{
write_LCD_data(0);//清0
}
}
}
void main()
{
while(1)
{
init_BMP();
display_BMP(table);//显示国旗
delay(50000);
delay(50000);
delay(50000);
delay(50000);
clear_BMP_RAM();//清除RAM区
display_BMP(table1);//显示人物头像
delay(50000);
delay(50000);
delay(50000);
delay(50000);
clear_BMP_RAM();//清除RAM区
display_BMP(table2);//显示人物头像
delay(50000);
delay(50000);
delay(50000);
delay(50000);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -