基于MSP430F149的KS0108(LCD)驱动程序

发布者:化羽2015最新更新时间:2016-08-18 来源: eefocus关键字:MSP430F149  KS0108  LCD  驱动程序 手机看文章 扫描二维码
随时随地手机看文章
//MSP430与12864连接驱动程序(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          //背光*/

#define RS      0x01 //寄存器选择信号(0--Command, 1--data) ks0108()
#define RW      0x02 //读/写选择信号
#define E       0x04 //使能信号
#define CS1     0x02 // 左屏
#define CS2     0x04 // 右屏
#define RST     0x01

//数据线: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,以便读液晶状态
        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)// 写显示数据子程序(左)
{       
         P3DIR =0X7F;      //P3为输出口
         P1DIR =0X7F;      //P3为输出口
         P1OUT |=CS1;       //csa=1  
         P1OUT&=~CS2;      //csb=0
         P3OUT&=~RS;         
         P3OUT |=RW;        //RS=0,R/W=1,以便读液晶状态
         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,以便读液晶状态
        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)// 写显示数据子程序(右)

         P3DIR =0X7F;      //P3为输出口
         P1DIR =0X7F;      //P3为输出口
         P1OUT&=~CS1;      //csa=0  
         P1OUT |=CS2;       //csb=1
        P3OUT&=~RS;         
        P3OUT |=RW;        //RS=0,R/W=1,以便读液晶状态
        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  
}
//****************************************************
//读显示数据子程序      (左屏)
//****************************************************
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,以便读液晶状态
      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;        
}
//****************************************************
//读显示数据子程序          (右屏)
//****************************************************
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,以便读液晶状态
      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控制寄存器:连续模式,输入时钟不分频,时钟源为TACLK,连续模式*/
 
 /* ------------------------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);}
//****************************************************

关键字:MSP430F149  KS0108  LCD  驱动程序 引用地址:基于MSP430F149的KS0108(LCD)驱动程序

上一篇:ucos2移植到msp430过程中出现的问题
下一篇:基于MSP430F149的应用实例

推荐阅读最新更新时间:2024-03-16 15:06

STM32 FSMC接口驱动TFT-LCD设计
0 引言 随着电子产品的不断更新,各种显示界面的开发越来越多,由于TFT彩屏的性价比高,因而被广泛用在各种电子设备上作为显示屏。目前驱动TFT彩屏的方案有很多,可以用底端单片机驱动一个终端类型的液晶模组,这种模组价格比较贵,当然用起来还是很方便的。 只要单片机通过串口或并行口向TFT发送几个字节的命令,就能在屏幕上显示你需要的效果。本设计利用STM32 的FSMC 总线直接驱动TFT 数字彩屏。这种方案对相应的寄存器进行配置后就可以自动向TFT数字彩屏发送数据,无需CPU参与,让CPU有足够时间来处理其他程序。 1 STM32 简介 STM32 是基于ARM 内核Cortex-M3 的32 位微控制器系列。Cortex-M3
[单片机]
STM32 FSMC接口驱动TFT-<font color='red'>LCD</font>设计
S3C2440 Linux2.6 I2C驱动程序之框架和编写(二十八)
上一节 我们学习了: IIC接口下的AT24C02驱动分析:https://blog.csdn.net/xiaodingqq/article/details/81808875 接下来本节,学习Linux下如何利用linux下I2C驱动体系结构来操作AT24C02 1、I2C体系结构分析 1.1 首先进入linux内核的driver/i2c目录下,如下图所示: 其中重要的文件介绍如下: 1)algos文件夹(algorithms) 里面保存I2C的通信方面的算法 2)busses文件夹 里面保存I2C总线驱动相关的文件,比如i2c-omap.c、 i2c-versatile.c、 i2c-s3c241
[单片机]
S3C2440 Linux2.6 I2C<font color='red'>驱动程序</font>之框架和编写(二十八)
业内:LCD面板跌势或持续至明年Q2
业内最新预测,到2022年第一季度末或第二季度初,LCD面板价格将持续下降趋势。 根据WitsView数据,9月32英寸LCD面板单价下降了18美元,43英寸面板单价下降了20美元,55英寸和65英寸分别下降了25美元和24美元。与去年同期相比,65英寸面板的降幅最小,为8.8%,32英寸面板的降幅最大,为24.3%。 据《电子时报》报道,业内人士表示,由于需求疲软,预计面板价格下跌至少会持续到今年第四季度或明年第二季度初。 与此相对的,中国的一些面板制造商选择继续提高产量或进入专业细分领域。京东方最近宣布,将把武汉的产能从每月12万张提高到18万张;彩虹股份计划投资91亿元,将咸阳8.5+代玻璃基片的年产量提高到580万片;惠科
[手机便携]
LG蝉联首季全球LCD TV面板龙头,京东方第三
南韩面板厂 LG Display(简称 LGD)第一季蝉联 LCD TV 面板龙头,即便在面板产业向 OLED 转进之际,整体 LCD 面板出货量有下滑趋势。 根据市调机构 WitsView 调查,LGD 今年前三个月产出 LCD TV 面板 1,260 万片,虽然较前一季下滑 7%,但仍守住第一位置。 台湾面板厂群创同期间 LCD TV 面板产出 990 万片,排名第二。中国最大面板厂京东方(BOE)、星达光电(Star Optoelectronics)紧追在后,分居第三、第四名。已逐渐淡出 LCD 面板市场的三星,则以 880 万片的出货量,落居第五。 WitsView 指出,尽管 LCD TV 面板市场开始萎缩,但超高分辨率
[手机便携]
基于Small RTOS51的PS/2键盘驱动程序开发
引言   随着嵌入式系统的发展,嵌入式软件设计向软件平台靠近,单片机软件设计不再是单一线程结构方式,而是逐步采用多任务的设计思想。实时操作系统使得实时应用程序的设计、扩展和维护变得更容易,无需大的改动就可以增加新的功能。然而随着任务的增加,要求输入的数据也会增加,类型也呈多样化。如果仍然用矩阵式扫描键盘,势必浪费单片机巨大的资源,且增加了成本。若用PC机标准PS/2键盘取而代之,将可解决以上矛盾。本文介绍基于实时操作系统 Small RTOS51的PS/2键盘驱动程序的设计,具有响应快,移植性强,占用资源少等优点。 1 驱动的设计   驱动的实现一般可用以下几种方法:① 使用任务编写;② 使用消息编写;③ 使用信号量编写。P
[单片机]
Linux下PCI设备驱动程序开发
       一、PCI总线系统体系结构        PCI是外围设备互连(Peripheral Component Interconnect)的简称,作为一种通用的总线接口标准,它在目前的计算机系统中得到了非常广泛的应用。        PCI提供了一组完整的总线接口规范,其目的是描述如何将计算机系统中的外围设备以一种结构化和可控化的方式连接在一起,同时它还刻画了外围设备在连接时的电气特性和行为规约,并且详细定义了计算机系统中的各个不同部件之间应该如何正确地进行交互。        无论是在基于Intel芯片的PC机中,或是在基于Alpha芯片的工作站上,PCI毫无疑问都是目前使用最广泛的一种总线接口标准。同旧式的
[嵌入式]
单片机CCFL控制器改善大屏幕LCD TV的图像质量
虽然LCD背光有多种方式,例如LED、EL、CCFL等,但对于大尺寸LCD屏来说,由于CCFL发光效率高而成为主流背光光源。传统的LCD屏主要用于笔记本电脑或台式电脑,背光组件在有一定亮度的前提下,还要尺寸小和重量轻等,大多采用侧面背光方式(CCFL灯管安装在屏的二边或四周,通过导光板将光漫射到整个屏幕后面);而LCD TV特别是大尺寸LCD TV,由于对显示亮度(450cd/m2)、视角广角(170%26;#176;)、图像对比度(500:1)等有更高的要求,因而需要采用光源利用率更高的垂直背光技术。 1 垂直背光 垂直背光,顾名思义,是将CCFL灯管直接安装在LCD屏后面,并利用全反射膜将发散到其他方向的光线反射到屏幕
[应用]
ELDIM推出第三代时间测量系统,完整评价LCD时间依赖性
如今,液晶显示屏在很多领域得到广泛应用,为了提高竞争力,必须保证显示屏的光电技术指标。因此,像素点的电子寻址具有非常重要的作用。这一技术近年来得到了很快的发展,不幸的是,测量标准跟不上发展的需求,在特征表示技术上留下了空白。 为了向显示器工业提供一种可靠的方案,法国ELDIM公司日前推出了第三代时间测量系统Imaging OPTIScope。经过多次测试和试验之后,Imaging OPTIScope系统可以提供有效的方案,以准确和完整地评价液晶显示屏的时间依赖性。 Imaging OPTIScope系统的设计目的,是为了符合现有的ISO, VESA, EIAJ等等标准,但在设计中也考虑了系统的发展潜力,以适应用户最新的
[新品]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
热门活动
换一批
更多
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

更多精选电路图
换一换 更多 相关热搜器件
更多每日新闻
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved