⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 自己做的单片机Proteus仿真实例
💻 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 + -