📄 main.c
字号:
/*****http://hi.baidu.com/echoas*****
程序:LCD12664液晶显示原理
内容:显示动画——飞翔的鸽子
学习板:Proteus仿真图
液晶:Proteus元件库—AMPIRE128X64(无字库)
LCD控制器:KS0108,详细操作见PDF文档
软件:keil uVision4
作者:大海橡树
整理日期:2010-12-08
修改:无
备注:有什么错误的地方,欢迎网友们到空间留言
O(∩_∩)O~
******http://hi.baidu.com/echoas*****/
#include <AT89X52.h>
#include <intrins.h>
#include"BMP1.h"
#include"BMP2.h"
#include"BMP3.h"
#include"BMP4.h"
#include"BMP5.h"
#include"BMP6.h"
#define uchar unsigned char
#define uint unsigned int
#define LCD_databus P0 //LCD12864的8位数据口
sbit RS=P2^2; //RS为0---命令;1----数据
sbit RW=P2^1; //RW为1---写;0---读
sbit EN=P2^0; //使能端
sbit CS1=P2^4; //片选1低电平有效,控制左半屏
sbit CS2=P2^3; //片选1低电平有效,控制右半屏
void delay(uint i)
{
while(--i);
}
void Read_busy()//读“忙”函数-----数据线的最高位DB71则busy
{
P0=0x00;
RS=0;
RW=1;
EN=1;
while(P0 & 0x80);
EN=0;
}
void write_LCD_command(uchar value)//写命令函数
{
Read_busy(); //对LCD的每次读写都要读忙
RS=0; //选择命令
RW=0; //读操作
LCD_databus=value;
EN=1; //EN由1----0锁存有效数据
delay(2);
EN=0;
}
void write_LCD_data(uchar value)//写数据函数
{
Read_busy();
RS=1; //选择数据
RW=0;
LCD_databus=value;
EN=1; //EN由1----0锁存有效数据
delay(2);
EN=0;
}
void Set_page(uchar page)//设置“页”LCD12864共8页,一页是8行点阵点
{
page=0xb8|page; //页的首地址为0xB8
write_LCD_command(page);
}
void Set_line(uchar startline) //设置显示的起始行
{
startline=0xC0|startline; //起始行地址为0xC0
write_LCD_command(startline); //设置从哪行开始:共0--63;一般从0 行开始显示
}
void Set_column(uchar column) //设置显示的列
{
column=column & 0x3f; //列的最大值为64
column= 0x40|column; //列的首地址为0x40
write_LCD_command(column);//规定显示的列的位置
}
void SetOnOff(uchar onoff) //显示开关函数:0x3E是关显示,0x3F是开显示
{
onoff=0x3e|onoff; //0011 111x,onoff只能为0或者1
write_LCD_command(onoff);
}
void SelectScreen(uchar screen) //选择屏幕
{
switch(screen)
{
case 0: CS1=0;CS2=0;break; //全屏
case 1: CS1=0;CS2=1;break;//左半屏
case 2: CS1=1;CS2=0;break;//右半屏
default:break;
}
}
void ClearScreen(uchar screen) //清屏函数
{
uchar i,j;
SelectScreen(screen); //0--全屏;1---左半屏;2---右半屏
for(i=0;i<8;i++) //控制页数0-7,共8页
{
Set_page(i);
Set_column(0);
for(j=0;j<64;j++) //控制列数0-63,共64列
{
write_LCD_data(0x00); //写入0,地址指针自加1
}
}
}
void InitLCD() //LCD的初始化
{
Read_busy();
SelectScreen(0);
SetOnOff(0); //关显示
SelectScreen(0);
SetOnOff(1); //开显示
SelectScreen(0);
ClearScreen(0);//清屏
Set_line(0); //开始行:0
}
void Display(uchar ss,uchar page,uchar column,uchar *p)
{
uchar i;
SelectScreen(ss);
Set_page(page); //写上半页
Set_column(column); //控制列
for(i=0;i<16;i++) //控制16列的数据输出
{
write_LCD_data(p[i]); //汉字的上半部分
}
Set_page(page+1); //写下半页
Set_column(column); //控制列
for(i=0;i<16;i++) //控制16列的数据输出
{
write_LCD_data(p[i+16]); //汉字的下半部分
}
}
void display_BMP(uchar a[][64])//显示图形的左边部分
{
uchar i,j;
for(j=0;j<8;j++)
{
SelectScreen(1);
Set_page(j);
Set_column(0);
for(i=0;i<64;i++)
{
write_LCD_data(a[2*j][i]);//每隔一行取一次数组中的数据
}
SelectScreen(2);
Set_page(j);
Set_column(0);
for(i=0;i<64;i++)
{
write_LCD_data(a[2*j+1][i]);//每隔一行取一次数组中的数据
}
}
}
void main()
{
InitLCD(); //初始12864
ClearScreen(0); //清屏
Set_line(0); //显示开始
while(1)
{
display_BMP(table1);
display_BMP(table2);
display_BMP(table3);
display_BMP(table4);
display_BMP(table5);
display_BMP(table6);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -