/*****************************************************************
//文件名 :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]);
}
}
12864控制forMSP430
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.