真是郁闷了两天了,对我板子和显示屏的连接老是理不清,又看到字库啊串行通信啊对一个初学者来说更是头大,没有老师真是痛苦,又是搜文章又是参考书的老理不到问题的本质,今天总算刚刚走出漩涡,把显示和其他元件暂时撇清关系了,呵呵,虽然原理在明白后觉得及其简单,但是确实花了好多时间才明白了这些,虽然自己有点小笨,不过还是小有成就的(*^__^*) 嘻嘻……,以后自学的道路还很长,不懂的问题还好多,希望可以继续努力吧。。。
#include "msp430x44x.h"
/////////////////////////////////////////////////////////////////////////////////////////
//本函数用于向LCD写一个字节数据
// 依赖性:无
// 前提条件:1。LCD有3片列驱动,由CS来选择,0≤ROW≤63时CS=1; 64≤Row≤127时CS=2; 128≤Row≤191时CS=3
// 2。LCD工作正常,能正确返回状态信息,否则程序会挂死
// 参数:CS为列驱动片选;DAT为待写入的数据
// 返回值:无
void WDAT (unsigned int cs,unsigned int dat)
{
char chip,RState;
switch(cs)
{
case 1:{
chip = 0x00|(P6OUT & 0xfc);
break;
}
case 2:{
chip = 0x01|(P6OUT & 0xfc);
break;
}
case 3:{
chip = 0x02|(P6OUT & 0xfc);
break;
}
}
RState = 0xFF;
P1OUT &= ~0x80; //E=0
P1OUT &= ~0x40; //RS=0
P6OUT = chip;
P2OUT |= 0x01; //R/W=1
P2OUT &=~0x04; //245 enable
P1OUT &= ~0x04; //DIR=0
P5DIR &= ~0xFF;
while((0x80 & RState)==0x80)
{
P1OUT |= 0x80; //E=1
RState = P5IN;
P1OUT &= ~0x80; //E=0
}
P1OUT |= 0x40; //RS=1
P2OUT &= ~0x01; //R/W=0
P1OUT |= 0x80; //E=1
P5OUT = dat;
P5DIR |= 0xFF;
P1OUT |= 0x04; //DIR=1
P1OUT &= ~0x80; //E=0
P6OUT |= 0x03; //no CS
P1OUT |= 0x80; //E=1
}
/////////////////////////////////////////////////////////////////////////////////////////
//本函数用于向LCD写一个命令字
// 依赖性:无
// 前提条件:1。LCD有3片列驱动,由CS来选择,0≤ROW≤63时CS=1; 64≤Row≤127时CS=2; 128≤Row≤191时CS=3
// 2。LCD工作正常,能正确返回状态信息,否则程序会挂死
// 参数:CS为列驱动片选;COM为待写入的命令字
// 返回值:无
void WCOM(unsigned int CS,unsigned int COM)
{
char RState;
char chip;
switch(CS)
{
case 1:{
chip = 0x00|(P6OUT & 0xfc);//1111 1100 第一片
break;
}
case 2:{
chip = 0x01|(P6OUT & 0xfc);//1111 1110 第三片
break;
}
case 3:{
chip = 0x02|(P6OUT & 0xfc);//1111 1101第二片
break;
}
}
RState = 0xFF;
P1OUT &= ~0x80; //E=0
P1OUT &= ~0x40; //RS=0
P6OUT = chip; //CS
P2OUT |= 0x01; //R/W=1 READ
P2OUT &=~0x04; //245 enable
P1OUT &= ~0x04; //DIR=0 B__A INPUT
P5DIR &= ~0xFF;
while((0x80 & RState)==0x80)
{
P1OUT |= 0x80; //E=1
RState = P5IN;
P1OUT &= ~0x80; //E=0
}
P2OUT &= ~0x01; //R/W=0 WRITE
P1OUT |= 0x80; //E=1
P5OUT = COM;
P5DIR |= 0xFF;
P1OUT |= 0x04; //DIR=1 A__B OUTPUT
P1OUT &= ~0x80; //E=0
P6OUT |= 0x03; // no CS
P1OUT |= 0x80; //E=1
}
///////////////////////////////////////////////////////////////////////////////
//本函数用于初始化LCD
// 依赖性:调用基础函数WCOM
// 前提条件:无
// 参数:无
// 返回值:无
//
// 好像没有接LCD时会死机
void InitLCD ()
{
P5OUT |= 0xFF;
P5DIR |= 0xFF; //DB0_DB7 P5为LCD的输入端
P1OUT |= 0x04;
P1DIR |= 0x04; //P1.2__245DIR=1 A__B OUTPUT
P1OUT &= ~0x40;
P1DIR |= 0x40; //P1.6__RS=0 instruction code
P1OUT |= 0x80;
P1DIR |= 0x80; //P1.7__E=1 unable
P2OUT &= ~0x01;
P2DIR |= 0x01; //P2.0__R/W=0 write
P2OUT &= ~0x04;
P2DIR |= 0x04; //P2.2__245 OE=0 enable
P6OUT &= ~0x00;
P6DIR |= 0x03; //作为片选,11为没有CS,disable any block of LCD
WCOM(1,0xC0); //0xC0 设置列起始位置
WCOM(2,0xC0);
WCOM(3,0xC0);
WCOM(1,0x3F); //设置起始页 参见上一篇说明书哦
WCOM(2,0x3F);
WCOM(3,0x3F);
P2OUT |= 0x0E; //display 245 unable
}
int main( void )
{
// Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW + WDTHOLD;
P2OUT |= 0x0E; //P2.1 245key ;P2.2 245DIS; P2.3 245PRN
P2DIR |= 0x0E; // three 245 unable
//本函数用于初始化LCD
InitLCD();
WCOM(1,0xb8);
WCOM(1,0x40);
WDAT(1,0xff);
return 0;
}
阅读(1023) | 评论(0) | 转发(0) |