Chinaunix首页 | 论坛 | 博客
  • 博客访问: 469959
  • 博文数量: 164
  • 博客积分: 4024
  • 博客等级: 上校
  • 技术积分: 1580
  • 用 户 组: 普通用户
  • 注册时间: 2009-10-10 16:27
文章分类

全部博文(164)

文章存档

2011年(1)

2010年(108)

2009年(55)

我的朋友

分类: 嵌入式

2009-11-05 22:46:56

真是郁闷了两天了,对我板子和显示屏的连接老是理不清,又看到字库啊串行通信啊对一个初学者来说更是头大,没有老师真是痛苦,又是搜文章又是参考书的老理不到问题的本质,今天总算刚刚走出漩涡,把显示和其他元件暂时撇清关系了,呵呵,虽然原理在明白后觉得及其简单,但是确实花了好多时间才明白了这些,虽然自己有点小笨,不过还是小有成就的(*^__^*) 嘻嘻……,以后自学的道路还很长,不懂的问题还好多,希望可以继续努力吧。。。

#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;
}
阅读(991) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~