⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ks0108.c

📁 msp430F149芯片驱动ks0108液晶的驱动程序
💻 C
字号:
#include           "msp430x14x.h"        // Standard Equations
//#include           "math.h"
#include "fontlib.h"//显示字符库。
#include <stdarg.h>
#include <stdio.h>
//**********************************************
//cs1:p2.0
//cs2:p2.2
//d/i:p4.5
//r/w:p4.6
//e:  p4.7
//d0-d7:p5

#define CS1_1 P2OUT|=BIT0
#define CS1_0 P2OUT&=~BIT0
#define CS2_1 P2OUT|=BIT2
#define CS2_0 P2OUT&=~BIT2

#define RS_1 P4OUT|=BIT5//寄存器选择信号
#define RS_0 P4OUT&=~BIT5
#define RW_1 P4OUT|=BIT6//读/写选择信号
#define RW_0 P4OUT&=~BIT6
#define E_1  P4OUT|=BIT7//使能信号
#define E_0  P4OUT&=~BIT7

#define D_PDIR P5DIR
#define D_PIN P5IN
#define D_POUT P5OUT
//数据线:p4口   ,控制线:  p5口

#define ON 1
#define on 1
#define OFF 0
#define off 0
//**********************************************

char revfonthead,revfontnum;

void CheckLcmState(void)
{
    char cradd1;
    RS_0;
    RW_1;
    D_PDIR=0x00;
    do
    {
        E_1;
        cradd1=D_PIN;
        E_0;
    }
    while((cradd1&0x80)!=0);
}
//**************************************************
void WriteCode(char code)// 写指令代码子程序
{
        CheckLcmState();
        RW_0;
        D_POUT=code;
        D_PDIR=0xff;
        E_1;
        E_0;
}
//**************************************************
void WriteData(char data)// 写显示数据子程序
{
        CheckLcmState();
        RS_1;
        RW_0;
        D_PDIR=0xff;
        D_POUT=data;
        E_1;
        E_0;
}
//****************************************************
char ReadData(void)//读显示数据子程序
{
      char data;
      CheckLcmState();
      RS_1;
      E_1;
      data=D_PIN;
      E_0;
      return data;
}
//****************************************************
void SetRow(char row)//设定行地址(页)--X 0-7
{
    row=row & 0x07; // 0<=row<=7
    row=row|0xb8; //1011 1xxx
    WriteCode(row);
}

void SetCol(char column)//设定列地址--Y 0-63
{
    column=column & 0x3f; // 0=<column<=63
    column=column | 0x40; //01xx xxxx
    WriteCode(column);
}
//设定显示开始行--XX
void SetStartRow(char startrow) //0--63
{
    startrow=startrow & 0x07;
    startrow=startrow|0xc0; //1100 0000
    WriteCode(startrow);
}
//开关显示
void SetOnOff(char onoff)
{
    onoff=0x3e | onoff; //0011 111x
    WriteCode(onoff);
}
//选择屏幕
//screen: 0-全屏,1-左屏,2-右屏
void SelectScreen(char screen)
{
    switch(screen)
    {
        case 0: CS1_0;CS2_0;break;
        case 1: CS1_0;CS2_1;break;
        case 2: CS1_1;CS2_0;break;
    }
}
//---------------------------------------------------
void Cls(void)     //清屏
{
       char i,j;
       SelectScreen(0);
       for(i=0;i<8;i++)
       {
           SetRow(i);
           SetCol(0);
           for(j=0;j<64;j++)  //设置列地址
           {
                WriteData(0x00);
           }
       }
}
//
void LcmInit(void)
{
   SelectScreen(0);
   SetOnOff(off);
   Cls();
   SetOnOff(on);
   SetStartRow(0);
}

//反显字符,head:反显字符相对位置,num:反显字符个数。
void RevPos(char head,char num){revfonthead=head;revfontnum=num;}

//显示8*8点阵 与原先显示数据重叠(或)。
//旋转90度:字模被竖着切分
//row:行(0-7), column: 列(0-15), addr : 字模区首地址, revflag: 取反标志位
void Show88(char row,char col,char const *addr,char revflag)
{
    char i,data;
    row%=8;
    col%=16;
    if(col<8) SelectScreen(1);
    else SelectScreen(2);
    col*=8;
    SetRow(row);
    for(i=0;i<8;i++)
    {
        SetCol(col+i+1);
        data=ReadData();
        if(revflag)data|=~*addr;
        else data|=*addr;
        SetCol(col+i);
        WriteData(data);
        addr++;
    }
}
//row:行(0-7), column: 列(0-15) 字符(字模被竖着切分):8*16;, 汉字(字模被竖着切分):16*16;,
char Dprintf(char urow,char ucol,char *fmt, ...)
{
  va_list arg_ptr;
  signed char c1,c2;
  char tmpBuf[128];
  char i=0,j,uLen;
  const char *p;

  va_start(arg_ptr, fmt);
  uLen = (char)vsprintf(tmpBuf, fmt, arg_ptr);
  va_end(arg_ptr);
  while(i<uLen)
  {
      c1 = tmpBuf[i];
      c2 = tmpBuf[i+1];
      if(c1 >= 0)
      {
          if(c1<STARTNUM)c1=STARTNUM;
          p=(const char *)&ASC_MSK[(c1-STARTNUM)*16];
          if( revfontnum >0 && revfonthead <= i+1)
          {
              Show88(urow,ucol,p,ON);
              Show88(urow+1,ucol,p+8,ON);
              revfontnum--;
          }
          else
          {
              Show88(urow,ucol,p,OFF);
              Show88(urow+1,ucol,p+8,OFF);
          }
          ucol++;
      }
      else
      {
          for(j=0;j<sizeof(GB_16)/sizeof(GB_16[0]);j++)
          {
              if(c1 == GB_16[j].Index[0] && c2 == GB_16[j].Index[1])
              break;
          }
          if(j < sizeof(GB_16)/sizeof(GB_16[0]))
          {
              p=(const char *)&GB_16[j].Msk[0];
              if( revfontnum >0 && revfonthead <= i+1)
              {
                  Show88(urow,ucol,p,ON);
                  Show88(urow,ucol+1,p+8,ON);
                  Show88(urow+1,ucol,p+16,ON);
                  Show88(urow+1,ucol+1,p+24,ON);
                  revfontnum--;
              }
              else
              {
                  Show88(urow,ucol,p,OFF);
                  Show88(urow,ucol+1,p+8,OFF);
                  Show88(urow+1,ucol,p+16,OFF);
                  Show88(urow+1,ucol+1,p+24,OFF);
              }
          }
          ucol += 2;
          i++;
    }
    if(ucol >= 16)
    {
      urow +=2;
      if(urow < 8) ucol -= 16;
      else {urow = 0;ucol = 0;}
    }
    i++;
  }
  return uLen;
}
//***************************************************
//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
}
//**************** 画水平直线(首列坐标)
//row:0~64; 行;col1:0~128起始列,col:0~128 终止列
void Line(char row,char col1,char col2)
{
  char i,bit,data;
  bit=row%8;
  row/=8;
  SelectScreen(0);
  SetRow(row);
  for(i=col1;i<=col2;i++)
  {
      if(i<64) SelectScreen(1);
      else SelectScreen(2);
      SetCol(i+1);
      data=ReadData();
      SetCol(i);
      data|=0x01<<bit;
      WriteData(data);
  }
}

void main(void)
{
   WDTCTL=WDTPW+WDTHOLD;
   init_xt2();
   P4DIR=0xe0;
   P4OUT=0xe0;
   P2DIR=0x05;
   P2OUT=0x05;
   LcmInit();
   do
   {
        Cls();        //  clear screen
        Dprintf(0,0,"!abcdefg1234567890");
        Line(2,1,127);
        Dprintf(4,1,"abcdefg1234567890");
        RevPos(1,1);
        Dprintf(0,0,"电力电力监测仪电力电力监测仪");
   }
   while(1);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -