1. 程式人生 > >壹拾捌:LCD12864的顯示

壹拾捌:LCD12864的顯示

這裡寫圖片描述

#指令系統

這裡寫圖片描述

#程式碼

	
*   【課程19】 ****LCD12864的實驗***********
*
*   【說  明】 ****模擬環境中沒有做好的字型檔所以需要自己做漢字字型檔
*		
*   【描  述】 ****顯示"源享科技"
*
******************************************************************     

基本操作:
	讀狀態: RS=0,RW=1,EN=1
					輸出:D0~D7=狀態字;
	寫指令: RS=0,RW=0,EN=下降沿脈衝
						D0~D7=指令碼;
	讀資料: RS=1,RW=1,EN=1
					輸出:	D0~D7=資料;
	寫資料: RS=1,RW=1,EN=下降沿脈衝
						D0~D7=資料;	
*********************************************************/
#include<reg51.h>		//51標頭檔案,

//---------常用的兩個巨集定義-------------- 
#define uint8	unsigned char
#define uint16  unsigned int
//--------12864的控制引腳定義-------------
sbit RS = P3^5;
sbit RW = P3^6;
sbit EN = P3^4;

sbit CS2 = P3^0;
sbit CS1 = P3^1;

uint8 code  yuan[]=
{
/*------------------------------------------------------------------------------
;  原始檔 / 文字: 源

;  寬×高(畫素) : 16×16
------------------------------------------------------------------------------*/
 0x10,0x21,0x06,0xE0,0x00,0xFE,0x02,0xF2,
 0x5A,0x56,0x52,0x52,0x52,0xF2,0x02,0x00,
 0x04,0xFC,0x03,0x40,0x30,0x0F,0x20,0x11,
 0x4D,0x81,0x7F,0x01,0x05,0x09,0x30,0x00
};

uint8 code xiang[]=
{

 0x00,0x04,0x04,0x74,0x54,0x54,0x55,0x56,
 0x54,0x54,0x54,0x74,0x04,0x04,0x00,0x00,
 0x08,0x08,0x09,0x09,0x09,0x29,0x49,0x89,
 0x7D,0x0B,0x0B,0x09,0x08,0x08,0x08,0x00
};
uint8 code ke[]=
{
/*--  文字:  科  --*/
/*--  宋體12;  此字型下對應的點陣為:寬x高=16x16   --*/
 0x10,0x12,0x92,0x72,0xFE,0x51,0x91,0x00,
 0x22,0xCC,0x00,0x00,0xFF,0x00,0x00,0x00,
 0x04,0x02,0x01,0x00,0xFF,0x00,0x04,0x04,
 0x04,0x02,0x02,0x02,0xFF,0x01,0x01,0x00
};
uint8 code ji[]=
{
/*--  文字:  技  --*/
/*--  宋體12;  此字型下對應的點陣為:寬x高=16x16   --*/
 0x08,0x08,0x88,0xFF,0x48,0x28,0x00,0xC8,
 0x48,0x48,0x7F,0x48,0xC8,0x48,0x08,0x00,
 0x01,0x41,0x80,0x7F,0x00,0x40,0x40,0x20,
 0x13,0x0C,0x0C,0x12,0x21,0x60,0x20,0x00
};
//-----------函式的宣告------------------
void DelayMS(uint16 dly);


//----------液晶模組的宣告---------------
bit BUSY(void);					//測忙
void Write_cmd(uint8 cmd);		//寫命令
void Write_dat(uint8 dat);		//寫資料
//void LCD_Init(void);

void Set_page(uint8 page);		//設定頁
void Set_Line(uint8 line);		//設定起始行
void Set_Col(uint8 col);		//設定列
void Set_ONOFF(uint8 swich);	//1開0關
void Clear(void);				//清屏				
void LCD_Init(void);			//液晶屏初始化
void Display(uint8 screen,uint8 page,uint8 col,uint8 *p);//顯示漢字
void Select_Screen(uint8 swich);//選擇液晶屏(左右)

//---------Main Task---------------------
void main(void)
{
	LCD_Init();
	Display(1,0,0,yuan);		//源
	Display(1,2,0,xiang);		//享
	Display(1,4,0,ke);			//科
	Display(1,6,0,ji);			//技

	Display(2,0,0,yuan);
	Display(2,2,0,xiang);
	Display(2,4,0,ke);
	Display(2,6,0,ji);
	while(1)
	{						
	}	
}

/********************************************************
** 名稱 :void DelayMS(uint16 dly)
** 功能 :毫秒級延時(12M的晶振)
** 入口引數 :dly
					使用者的延時引數   
** 出口引數 :無   
*********************************************************/
void DelayMS(uint16 dly)
{
	uint16 x,y;
	for(x=dly;x>0;x--)
		for(y=124;y>0;y--);
}

/********************************************************
** 名稱 :bit BUSY(void)
** 功能 :檢測LCD1602是否處於忙狀態;
** 入口引數 :無   
** 出口引數 :bit Bit
						返回1,則BUSY
						返回0,則OK   
*********************************************************/
bit BUSY(void)
{
	bit Bit;
	P0 = 0x00;
	RS = 0;
	RW = 1;
	EN = 1;
	DelayMS(1);
	Bit = (bit)(P0 & 0x80);	//最高位為忙訊號位	
	EN = 0;
	return Bit;				
}

/********************************************************
** 名稱 :void Write_cmd(uint8 cmd)
** 功能 :寫命令
** 入口引數 :cmd
					控制命令   
** 出口引數 :無   
*********************************************************/
void Write_cmd(uint8 cmd)
{
	while(BUSY());			//測忙
	RS = 0;
	RW = 0;
	EN = 0;	
	P0 = cmd;
	EN = 1;
	DelayMS(1);
	EN = 0;			
}

/********************************************************
** 名稱 :void Write_dat(uint8 dat)
** 功能 :寫資料
** 入口引數 :dat
					要顯示的資料  
** 出口引數 :無   
*********************************************************/
void Write_dat(uint8 dat)
{
	while(BUSY());			//測忙
	RS = 1;
	RW = 0;
	EN = 0;	
	P0 = dat;
	EN = 1;
	DelayMS(1);
	EN = 0;			
}

/********************************************************
** 名稱 :void LCD_Init(void)
** 功能 :液晶的初始化
** 入口引數 :無 
** 出口引數 :無   
*********************************************************/
/*void LCD_Init(void)
{

	Write_cmd(0x34);      //擴充指令操作
    DelayMS(5);
    Write_cmd(0x30);      //基本指令操作
    DelayMS(5);
    Write_cmd(0x0C);      //顯示開,關游標
    DelayMS(5);
    Write_cmd(0x01);      //清除LCD的顯示內容
    DelayMS(5);
}*/

/********************************************************
** 名稱 :void Set_page(uint8 page)
** 功能 :設定頁
** 入口引數 :uint8 
					page		0~7共8頁 
** 出口引數 :無   
*********************************************************/
void Set_page(uint8 page)
{
	page = 0xb8|page;	//頁的首地址為0XB8
	Write_cmd(page);	
}

/********************************************************
** 名稱 :void Set_Line(uint8 line)
** 功能 :設定起始行
** 入口引數 :uint8 
					line		
** 出口引數 :無   
*********************************************************/
void Set_Line(uint8 line)
{
	line = 0xc0|line;
	Write_cmd(line);	
}

/********************************************************
** 名稱 :void Set_Col(uint8 col)
** 功能 :設定列的起始位置
** 入口引數 :uint8 
					col		
** 出口引數 :無   
*********************************************************/
void Set_Col(uint8 col)
{
	col = col&0x3f;
	col = 0x40|col;	
	Write_cmd(col);
}

/********************************************************
** 名稱 :void Select_Screen(uint8 swich)
** 功能 :選擇螢幕---左右螢幕
** 入口引數 :uint8 
					swich		
** 出口引數 :無   
*********************************************************/
void Select_Screen(uint8 swich)
{
	switch(swich)
	{
		case 0:	CS1 = CS2 =0;		//全屏
					break;
		case 1: CS1 = 0;CS2 = 1;	//左屏
					break;
		case 2:	CS1 =1; CS2 = 0;		//右屏
					break;
		default:
					break;
	}
}

/********************************************************
** 名稱 :void Set_ONOFF(uint8 swich)	//0或1
** 功能 :設定顯示開關
** 入口引數 :uint8 
					swich		0---關
								1---開		
** 出口引數 :無   
*********************************************************/
void Set_ONOFF(uint8 swich)	//0或1
{
	swich = 0x3e|swich;
	Write_cmd(swich);			
}

/********************************************************
** 名稱 :void Clear(void)
** 功能 :清屏
** 入口引數 :無		
** 出口引數 :無   
*********************************************************/
void Clear(void)
{
	uint8 i,j;

	for(i=0;i<8;i++)
	{
		Set_page(i);		
		Set_Col(0);
		for(j=0;j<64;j++)
		{
			Write_dat(0x00);	
		}			
	}
}

/********************************************************
** 名稱 :void LCD_Init(void)
** 功能 :初始化
** 入口引數 :無		
** 出口引數 :無   
*********************************************************/
void LCD_Init(void)
{
	while(BUSY());			//測忙
	Set_ONOFF(1);
	Clear();
	Set_Line(0);		
}

/********************************************************
** 名稱 :void Display(uint8 screen,uint8 page,uint8 col,uint8 *p)
** 功能 :漢字的顯示
** 入口引數 :uint8 
					screen					選屏
					page				頁
					col					列
					*p					顯示的漢字指標
** 出口引數 :無   
*********************************************************/
void Display(uint8 screen,uint8 page,uint8 col,uint8 *p)
{
	uint8 i;
	Select_Screen(screen);
	Set_page(page);
	Set_Col(col);
	for(i=0;i<16;i++)
	{
		Write_dat(p[i]);
	}
	Set_page(page+1);
	Set_Col(col);
	for(i=0;i<16;i++)
	{
		Write_dat(p[i+16]);
	}				
}