<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          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://www.ex-cimer.com/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ū)

          關閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();