12864控制forMSP430

/*****************************************************************
//文件名	:12864.c
//描述		:該文件定義與12864有關的各種接口、函數,適用於MSP430F149
//編寫人	:小邪@清水
//版本號	:2.01
*****************************************************************/

#include <msp430x14x.h>
#include "12864.h"
#define uchar unsigned char 
#define uint unsigned int 

#define BIT(x)	(1 << (x))
unsigned char NUM[] = {"0123456789."};
uchar Address[4][8] = {
		{0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87},
		{0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97},
		{0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f},
		{0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f}
		};

/*****************************************************************
//關於12864的一些宏定義
//注意:各項數據都要根據實際使用IO口更改
*****************************************************************/
#define CS      0												//CS  = P3.0
#define SID     1												//SID = P3.1  
#define CLK     2												//CLK = P3.2
#define PORT    P3OUT  
#define DIR     P3DIR

/*************************************************************************
//名稱	: delay_Nus
//參數	: 延時的時間n
//返回值: 無
//功能	: 延時 n Ns的時間
*************************************************************************/
void delay_Nus(uint n)
{
	uchar i;
	for(i = n;i > 0;i--)
        _NOP();
}

/*************************************************************************
//名稱	: delay_1ms
//參數	: 無
//返回值: 無
//功能	: 延時 1 ms的時間
*************************************************************************/ 
void delay_1ms(void)
{
	uchar i;
	for(i = 150;i > 0;i--)	  _NOP();
} 

/*************************************************************************
//名稱	: delay_Nms
//參數	: 延時的時間n
//返回值: 無
//功能	: 延時 1 ms的時間
*************************************************************************/
void delay_Nms(uint n)
{
    uint i = 0;
    
    for(i = n;i > 0;i--)
        delay_1ms();
}

/*************************************************************************
//名稱	: LcdInit
//參數	: 無
//返回值: 無
//功能	: 初始化12864
*************************************************************************/
void LcdInit(void)
{	
	DIR |= BIT(CLK) + BIT(SID) + BIT(CS);								//相應的位端口設置爲輸出
	delay_Nms(100);														//延時等待液晶完成復位
	Send(0,0x30);														//功能設置:一次送8位數據,基本指令集
	delay_Nus(72);
	Send(0,0x02);														//DDRAM地址歸位
	delay_Nus(72);
	Send(0,0x0c);														//顯示設定:開顯示,不顯示光標,不做當前顯示位反白閃動
	delay_Nus(72);
	Send(0,0x01);														//清屏,將DDRAM的位址計數器調整爲“00H”
	delay_Nus(72);
	Send(0,0x06);														//功能設置,點設定:顯示字符/光標從左到右移位,DDRAM地址加1
	delay_Nus(72);		
}  

/*************************************************************************
//名稱	: Send
//參數	: 數據類型type:0--控制命令,1--顯示數據,transdata--發送的數據
//返回值: 無
//功能	: 向12864發送一個字節的數據,可用於控制可用於顯示
*************************************************************************/
void Send(uchar type,uchar transdata)
{
	uchar firstbyte = 0xf8;
	uchar temp;
	uchar i,j = 3;
	if(type) firstbyte |= 0x02;
	PORT |=  BIT(CS);		 	
	PORT &= ~BIT(CLK);		
	while(j > 0)
	{
		if(j == 3) temp = firstbyte;
		else if(j == 2) temp = transdata&0xf0;
		else  temp = (transdata << 4) & 0xf0;
		for(i = 8;i > 0;i--)
		{
			if(temp & 0x80)	PORT |=  BIT(SID); 
			else		PORT &= ~BIT(SID);			
			PORT |= BIT(CLK);				
			temp <<= 1;
			PORT &= ~BIT(CLK);
		}																//三個字節之間一定要有足夠的延時,否則易出現時序問題
		if(j == 3) delay_Nus(600); 
		else       delay_Nus(200);
		j--;
	} 
	PORT &= ~BIT(SID);       
	PORT &= ~BIT(CS);		
}

/*************************************************************************
//名稱	: Clear_GDRAM
//參數	: 數據類型type:0--控制命令,1--顯示數據,transdata--發送的數據
//返回值: 無
//功能	: 向12864發送一個字節的數據,可用於控制可用於顯示
*************************************************************************/
void Clear_GDRAM(void)
{
    uchar i,j,k;
    Send(0,0x34);														//打開擴展指令集
	i = 0x80;            
	for(j = 0;j < 32;j++)
	{
 	 	Send(0,i++);  	   
 		Send(0,0x80);  
  		for(k = 0;k < 16;k++)
  		{
  		    Send(1,0x00); 
  		}
	}
	i = 0x80;
 	for(j = 0;j < 32;j++)
	{
 	    Send(0,i++);	   
  		Send(0,0x88); 	   
  		for(k = 0;k < 16;k++)
  		{
   		    Send(1,0x00); 
   		} 
	}   
	Send(0,0x30);														//回到基本指令集	
}

/*************************************************************************
//名稱	: WriteStr
//參數	: 顯示的地址addr,待顯示數據的指針,顯示長度
//返回值: 無
//功能	: 在12864指定位置上顯示字符串,包括漢字
		  可以顯示ASCII碼錶上字符,但長度應該減半
*************************************************************************/
void WriteStr(uchar addr,const uchar * pt,uchar num)
{
    uchar i;
	Send(0,addr);          
   	for(i = 0;i < (num*2);i++) 
	   Send(1,*(pt++)); 
} 

/*************************************************************************
//名稱	: DrawPic
//參數	: 待顯示圖片的指針
//返回值: 無
//功能	: 在整個屏幕上畫一個圖片
*************************************************************************/
void DrawPic(const uchar *ptr)
{
    uchar i,j,k;
    Send(0,0x34);														//打開擴展指令集
	i = 0x80;            
	for(j = 0;j < 32;j++)
	{
 	 	Send(0,i++);  	   
 		Send(0,0x80);  
  		for(k = 0;k < 16;k++)
  		{
  		    Send(1,*ptr++); 
  		}
	}
	i = 0x80;
 	for(j = 0;j < 32;j++)
	{
 	    Send(0,i++);	   
  		Send(0,0x88); 	   
  		for(k = 0;k < 16;k++)
  		{
   		    Send(1,*ptr++); 
   		} 
	}
    Send(0,0x36);														//打開繪圖顯示
	Send(0,0x30);														//回到基本指令集	
}

/*************************************************************************
//名稱	: Draw1Pic
//參數	: Yaddr--Y地址,Xaddr--X地址
//返回值: 無
//功能	: 在液晶上描繪一個16*16的圖形
*************************************************************************/
void Draw1Pic(uchar Yaddr,uchar Xaddr,const uchar * dp) 
{
    uchar j;
    uchar k = 0;
	Send(0,0x34);														//使用擴展指令集,關閉繪圖顯示
    for(j = 0;j < 16;j++)
    {
        Send(0,Yaddr++);												//Y地址  
        Send(0,Xaddr);													//X地址
        Send(1,dp[k++]);												//送兩個字節的顯示數據 
        Send(1,dp[k++]);    			
    }
	Send(0,0x36);														//打開繪圖顯示
	Send(0,0x30);														//回到基本指令集模式
}

/*************************************************************************
//名稱	: LocateXY
//參數	: 待寫入地址,橫座標X,縱座標Y(從0開始)
//返回值: 無
//功能	: 12864指針指向指定位置
*************************************************************************/
void LocateXY(uchar X,uchar Y)
{
	Send(0,Address[Y][X]);
}

/*************************************************************************
//名稱	: WriteNum
//參數	: 待寫入數字Num,橫座標X,縱座標Y(從0開始)
//返回值: 無
//功能	: 在指定位置顯示一個數字(不超過5位且小於65536)
*************************************************************************/
void WriteNum(uint n,uchar x,uchar y)
{
	uchar five,four,three,two,one;
	LocateXY(x,y);
	if((n >= 10000)&&(n <= 65535))
	{
		five = n / 10000;
		four = (n % 10000) / 1000;
		three = ((n - five * 10000) % 1000) / 100;
		two = ((n - five * 10000) % 1000 - three * 100 ) / 10;
		one = ((n - five * 10000) % 1000 - three * 100 ) % 10;
		Send(1,NUM[five]);
		Send(1,NUM[four]);
		Send(1,NUM[three]);
		Send(1,NUM[two]);
		Send(1,NUM[one]);
	}
	if((n >= 1000)&&(n <= 9999))
	{
		four = n / 1000;
		three = (n % 1000) / 100;
		two = (n % 1000 - three * 100 ) / 10;
		one = (n % 1000 - three * 100 ) % 10;
		Send(1,NUM[four]);
		Send(1,NUM[three]);
		Send(1,NUM[two]);
		Send(1,NUM[one]);
	}
	if((n >= 100)&&(n <= 999))
	{
		three = n / 100;
		two = (n - three * 100 ) / 10;
		one = (n - three * 100 ) % 10;
		Send(1,NUM[three]);
		Send(1,NUM[two]);
		Send(1,NUM[one]);
	}
	if((n >= 10)&&(n <= 99))
	{
		two = n / 10;
		one = n % 10;
		Send(1,NUM[two]);
		Send(1,NUM[one]);
	}
	if((n >= 0)&&(n <= 9))Send(1,NUM[n]);
}

/*************************************************************************
//名稱	:WriteFloat
//參數	:待寫入浮點數,unsigned char x,unsigned char y
//返回值:無
//功能	:在給定位置顯示一個浮點數(整數部分和小數部分都不超過兩位)
*************************************************************************/
void WriteFloat(float n,uchar x,uchar y)
{
	uint Integer,Decimal;											//Integer用於存放整數部分,Decimal用於存放小數部分
	Integer = (uint)(n/1);
	Decimal = (uint)(n * 100 - Integer * 100);
        if(Integer<10)
        {
          LocateXY(x,y);
          Send(1,' ');
          WriteNum(Integer,x+1,y);
        }
        if(Integer>=10)WriteNum(Integer,x,y);
	Send(1,NUM[10]);
	WriteNum(Decimal,x+2,y);
}

/*************************************************************************
//名稱	:WriteArrary
//參數	:待寫入數組,數組長度,unsigned char x,unsigned char y
//返回值:無
//功能	:在給定位置顯示一個數組
*************************************************************************/
void WriteArrary(uint *a,uint n,uchar x,uchar y)
{
  uchar i;
  LocateXY(x,y);
  for(i = 0;i < n;i ++)
  {
    a[i] = a[i] + '0';
    Send(1,a[i]);
  }
}

發佈了26 篇原創文章 · 獲贊 2 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章