新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 基于MSP430F149的KS0108(LCD)驅動程序

基于MSP430F149的KS0108(LCD)驅動程序

作者: 時間:2016-11-13 來源:網(wǎng)絡 收藏
//MSP43012864連接驅動程序(KS0108)



#include "msp430x14x.h" // Standard Equations
#include "math.h"
#include "stdlib.h"
#include "stdio.h"
#include "string.h"
#include "ctype.h"
//#include "HZTable.h"
//#include "ASCII816.h"
#define uint unsigned int
#define uchar unsigned char
//**********************************************
/*#define RS BIT0
#define RW BIT1
#define E BIT2
#define CS1 BIT3
#define CS2 BIT4
#define RST BIT5
#define EL BIT6 //背光*/

本文引用地址:http://m.butianyuan.cn/article/201611/316436.htm

#define RS 0x01//寄存器選擇信號(0--Command, 1--data) ks0108()
#define RW 0x02//讀/寫選擇信號
#define E 0x04//使能信號
#define CS1 0x02// 左屏
#define CS2 0x04// 右屏
#define RST 0x01

//數(shù)據(jù)線:p4口 ,控制線: p5口
//**********************************************
uchar cradd1,cradd2;

uchar item1[5]={0,1,2,3,50}; //歡迎使用
uchar item2[5]={4,5,6,7,50}; //請等待……

unsigned char hzbei[32]={
0x04,0x04,0x04,0xE4,0x24,0x24,0x25,0x26,0x24,0x24,0x24,0xE4,0x04,0x06,0x04,0x00,
0x00,0x40,0x20,0x13,0x1A,0x42,0x82,0x7E,0x02,0x02,0x0A,0x13,0x30,0x60,0x00,0x00
};

//=======================================================
void short_delay(uint i)
{ uint j;
for(j=0;j<=i;j++);
}
void delayms(uchar tickms)
{ uchar count,i;
_NOP();
_NOP();
_NOP();

for(i=tickms;i>0;i--)
{ for(count=0;count<=58;count++) {;}
_NOP();
}
}
//**************************************************
void prl0(uchar com1)// 寫指令代碼子程序(左)
{
P3DIR =0X7F; //P3為輸出口
P1DIR =0X7F; //P3為輸出口
P1OUT |=CS1; //csa=1
P1OUT&=~CS2; //csb=0
P3OUT&=~RS;
P3OUT |=RW; //RS=0,R/W=1,以便讀液晶狀態(tài)
P2DIR=0x00; //P2口為輸入口
do
{
P3OUT |= E; //E=1
cradd1=P2IN;
P3OUT&=~E; //E=0
}
while((cradd1&0x80)!=0);
P3OUT&=~RW; //rw=0
P2DIR=0xff; //P2口為輸出口
P2OUT=com1;
P3OUT |=E; //E=1
P3OUT&=~E; //E=0
}
//**************************************************
void prl1(uchar dat1)// 寫顯示數(shù)據(jù)子程序(左)
{
P3DIR =0X7F; //P3為輸出口
P1DIR =0X7F; //P3為輸出口
P1OUT |=CS1; //csa=1
P1OUT&=~CS2; //csb=0
P3OUT&=~RS;
P3OUT |=RW; //RS=0,R/W=1,以便讀液晶狀態(tài)
P2DIR=0x00; //P2口為輸入口
do
{
P3OUT |=E; //E=1
cradd1=P2IN;
P3OUT&=~E; //E=0
}
while((cradd1&0x80)!=0);
P3OUT |=RS; //rs=1
P3OUT&=~RW; //rw=0
P2DIR=0xff; //P2口為輸出口
P2OUT=dat1;
P3OUT|=E; //E=1
P3OUT&=~E; //E=0
}
//**************************************************
void prr0(uchar com2)// 寫指令代碼子程序(右)
{
P3DIR =0X7F; //P3為輸出口
P1DIR =0X7F; //P3為輸出口
P1OUT&=~CS1; //csa=0
P1OUT |=CS2; //csb=1
P3OUT&=~RS;
P3OUT |=RW; //RS=0,R/W=1,以便讀液晶狀態(tài)
P2DIR=0x00; //P2口為輸入口
do
{
P3OUT |= E; //E=1
cradd1=P2IN;
P3OUT&=~E; //E=0
}
while((cradd1&0x80)!=0);
P3OUT&=~RW; //rw=0
P2DIR=0xff; //P2口為輸出口
P2OUT=com2;
P3OUT |=E; //E=1
P3OUT&=~E; //E=0
}
//*************************************************
void prr1(uchar dat2)// 寫顯示數(shù)據(jù)子程序(右)
{
P3DIR =0X7F; //P3為輸出口
P1DIR =0X7F; //P3為輸出口
P1OUT&=~CS1; //csa=0
P1OUT |=CS2; //csb=1
P3OUT&=~RS;
P3OUT |=RW; //RS=0,R/W=1,以便讀液晶狀態(tài)
P2DIR=0x00; //P2口為輸入口
do
{
P3OUT |=E; //E=1
cradd1=P2IN;
P3OUT&=~E; //E=0
}
while((cradd1&0x80)!=0);
P3OUT |=RS; //rs=1
P3OUT&=~RW; //rw=0
P2DIR=0xff; //P2口為輸出口
P2OUT=dat2;
P3OUT |=E; //E=1
P3OUT&=~E; //E=0
}
//****************************************************
//讀顯示數(shù)據(jù)子程序 (左屏)
//****************************************************
uchar ReadDatal(void)
{
uchar Rdata;
P3DIR =0X7F; //P3為輸出口
P1DIR =0X7F; //P3為輸出口
P1OUT |=CS1; //csa=1
P1OUT&=~CS2; //csb=0
P3OUT&=~RS;
P3OUT |=RW; //RS=0,R/W=1,以便讀液晶狀態(tài)
P2DIR=0x00; //P2口為輸入口
do
{
P3OUT |=E; //E=1
cradd1=P2IN;
P3OUT&=~E; //E=0
}
while((cradd1&0x80)!=0);

P3OUT |=RS; //RS=1
//P3OUT =RW; //R/W=1
P3OUT |=E; //E=1
Rdata=P2IN;
P3OUT&=~E; //E=0
return Rdata;
}
//****************************************************
//讀顯示數(shù)據(jù)子程序 (右屏)
//****************************************************
uchar ReadDatar(void)
{
uchar Rdata;
P3DIR =0X7F; //P3為輸出口
P1DIR =0X7F; //P3為輸出口
P1OUT&=~CS1; //csa=0
P1OUT |=CS2; //csb=1
P3OUT&=~RS;
P3OUT |=RW; //RS=0,R/W=1,以便讀液晶狀態(tài)
P2DIR=0x00; //P2口為輸入口
do
{
P3OUT |=E; //E=1
cradd1=P2IN;
P3OUT&=~E; //E=0
}
while((cradd1&0x80)!=0);

P3OUT |=RS; //RS=1
//P3OUT =RW; //R/W=1
P3OUT |=E; //E=1
Rdata=P2IN;
P3OUT&=~E; //E=0
return Rdata;
}
//**********************************************
//**********************************************
void clsr(void) //清屏
{ uchar i,j;
for(i=0;i<8;i++)
{ prl0(i|0xb8); //設置頁地址
prr0(i|0xb8);
prl0(0x40);
prr0(0x40);
for(j=0;j<64;j++) //設置列地址
{ prl1(0x00); //寫0x00
prr1(0x00);
}
}
}
//**********************************************
void allon(void) //滿屏
{ uchar i,j;
for(i=0;i<8;i++)
{ prl0(i| 0xb8);
prr0(i| 0xb8);
prl0(0x40);
prr0(0x40);
for(j=0;j<64;j++)
{ prl1(0xff); //寫0xff
prr1(0xff);
}
}
}
//***********************************************
void stripe(void)
{ uchar i,j;
for(i=0;i<8;i++)
{ prl0(i| 0xb8);
prr0(i| 0xb8);
prl0(0x40);
prr0(0x40);
for(j=0;j<64;j++)
{ prl1(0xaa);
prr1(0xaa); // 寫0xaa
}
}
}
//***********************************************
void stripe1(void)
{ uchar i,j;
for(i=0;i<8;i++)
{ prl0(i| 0xb8);
prr0(i| 0xb8);
prl0(0x40);
prr0(0x40);
for(j=0;j<64;j++)
{ prl1(0x55); // 寫0x55
prr1(0x55);
}
}
}

//***************************************************

//***************************************************
void hzw_pr(uchar colum2,uchar page2)// 寫漢字
//page2:頁 colum2:列 code2:代碼 code2=0,1,2,3……表示第幾個漢字
{ uchar i,j,colum;
uchar *hzp;

uchar flag;

hzp=hzbei;

for(j=0;j<2;j++)
{ prl0(page2 |0xb8); //頁
prr0(page2 |0xb8);
colum=colum2;
if(colum2>63) //右屏
{ colum=colum-64;
prr0(colum |0x40);
flag=1;
}
else //左屏
{prl0(colum| 0x40);
flag=0;
}

for(i=0;i<16;i++)
{
if(flag==0)
{
prl1(*hzp);
}
else
{prr1(*hzp);}
hzp++;
if(colum==64) //列=64
{
colum=0;
if(flag==0)
{
flag=1;
prr0(colum |0x40);
}
else{break;}
}
colum++;
}
page2++;
}
}
//***********************************************
/*void w_hzstr(uchar colum4,uchar page4,uchar *str1)// 寫漢字字符串
{
while(*str1!=50)
{
hzw_pr( colum4, page4,*str1) ;
colum4=colum4+16;
str1++;
}
}*/
//***************************************************
//init_xt2; 初始化XT2 晶振為4MHZ
//*****************************************************
void init_xt2(void)
{
unsigned int iq0;

//使用XT2振蕩器
BCSCTL1&=~XT2OFF; //打開XT2振蕩器
do
{
IFG1 &= ~OFIFG; // 清除振蕩器失效標志
for (iq0 = 0xFF; iq0 > 0; iq0--); // 延時,等待XT2起振
} while ((IFG1 & OFIFG) != 0); // 判斷XT2是否起振

BCSCTL2 =SELM_2+SELS; //選擇MCLK、SMCLK為XT2,
BCSCTL2 =DIVM_1; //MCLK 2分頻SMCLK=MCLK=2MHZ
}


void InitMcu430(void)
{
unsigned char ti;

//_BIS_SR(OSCOFF); //Disable LFXT1
BCSCTL1&=~XT2OFF; // XT2OFF=0
//BCSCTL1|=XTS;
BCSCTL2|=SELS+SELM1;

do{
IFG1&=~OFIFG; //Clear OscFault flag
for(ti=255;ti>1;ti--);
}while((IFG1 & OFIFG)==OFIFG);
for(ti=255;ti>1;ti--);
IFG1&=~OFIFG;

//SCTL1&=~XTS;
//BCSCTL1|=0x30; //8分頻
BCSCTL1&=0x8F; //1分頻, ACLK=32768HZ

/* ------------------------Setup Timer_A---------------------- */
TACTL=0x0004; /*Timer_A控制寄存器:連續(xù)模式,輸入時鐘不分頻,時鐘源為TACLK,連續(xù)模式*/

/* ------------------------Setup ADC12 ----------------- */

//WDTCTL = WDTPW+0x0019; //500ms timer,MCLK

//WDTCTL =WDT_ADLY_250; //ACLK
//WDTCTL =WDTPW+BIT7;

P1DIR=0x7F; //set P1 input
P2DIR=0xFF; //set P2,P3,P5 is output
P3DIR|=0x7F;
P4DIR=0xFF;
P5DIR=0xFF;

P1SEL=0x00;
P2SEL=0x00;
P3SEL=0x00;
P4SEL=0x00;
P5SEL=0x00;
//P6SEL=0xFF; //P6 外部模塊功能
//P1SEL|=0x08; //P1.3 外部模塊功能

}
//***********************************************
//主程序
//***********************************************

void main(void)
{
uchar a;
// uchar i,j;
WDTCTL=WDTPW+WDTHOLD;
InitMcu430();
//init_xt2();
P1DIR =0X7F; //P3為輸出口
//P1OUT&=~RST; //rst=0
//delayms(50); //1ms
//P1OUT |=RST; //rst=1
//P3OUT&=~EL; //EL=0 背光=0

clsr(); // clear screen
do
{
prl0(0xc0);prr0(0xc0); //顯示開始行
prl0(0x3f);prr0(0x3f); //開顯示
//P3OUT&=~EL; //EL=0 背光=0
//******************************************************
clsr(); // clear screen
//寫漢字字符串1 歡迎使用
//寫漢字字符串2 請等待…
//w_hzstr(32,2,item1);
//w_hzstr(32,5,item2);
hzw_pr(32,5);
delayms(100);
for(a=0;a<250;a++)
{ delayms(100);}

delayms(100);
for(a=0;a<250;a++)
{ delayms(100);}

prl0(0xc0);prr0(0xc0);

//stripe();
//clsr();

allon(); // fill screen

delayms(100);
for(a=0;a<250;a++)
{ delayms(100);}
prl0(0xc0);prr0(0xc0);
clsr(); // clear screen
delayms(100);
for(a=0;a<250;a++)
{ delayms(100);}


// stripe screen
prl0(0xc0);prr0(0xc0);
stripe();
delayms(100);
for(a=0;a<250;a++)
{ delayms(100);}
prl0(0xc0);prr0(0xc0);
stripe1();
delayms(100);
for(a=0;a<250;a++)
{ delayms(100);}

}while(1);}
//****************************************************



評論


技術專區(qū)

關閉