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

📄 lcd 带字库编程.txt

📁 基于FPGA的lcd的驱动程序
💻 TXT
📖 第 1 页 / 共 3 页
字号:
//航标灯MSP430F247函数定义头文件.h
#define uchar unsigned char
#define uint unsigned int
void msec(int x)	//LPC935  7.3728 MHz
{
	int j=0;
	while(x>=0)
	{
        for (j=0; j<669; j++);
		x--;
	}
}

void init()
{
  long int i;
  WDTCTL = WDTPW + WDTHOLD;                 // Stop watchdog timer 
  //BCSCTL1&= ~XT2OFF;                       // 打开XT2
  BCSCTL2|=SELM_2+SELS;                    //mclk,smclk选择XT2
  BCSCTL3 |= XT2S_2;                        // 选择XT2的范围为3~16MHZ
  do                                        //判断晶振是否起振
  {
  IFG1 &= ~OFIFG;                           // Clear OSCFault flag
  for (i = 0x47FF; i > 0; i--);             // Time for flag to set
  }
  while ((IFG1 & OFIFG));                   // OSCFault flag still set?
  BCSCTL2 |= SELM_2+SELS;                        // MCLK 和 SMCLK 选择 XT2时钟源
  caozuoyemian=0;                           //操作页面标志赋初值
  chucijinruyemian=1;                        //初次进入页面标志赋初值
  caozuoneirongxuanzebianliang=0;            //操作内容选择变量赋初值
  caozuogongnengbiaozhi=7;                   //操作功能标志赋初值
  zhidongceshibiaozhi=0;                    //自动测试标志=0
  dianliuxuanzebianliang=0;                   //电流选择变量赋初值
  dianliuxuanzebiaozhi=0;                     //电流选择标志赋初值
  xuanzetiaozhengbiaozhi=1;                   //选择调整标志赋初值
  nianyuerishifenmiaoxuanzebianliang=0;       //年月日时分秒选择变量
  dayinshujuxuanzebiaozhi=0;           //打印数据选择标志赋初值
  quedinghaomabiaozhi=1;             //确定号码选择标志赋初值
  dayanxuanzexunhuan=0;       //打印选择循环用于打印选择测试数据函数循环标志的判断
  io_init();
  USCI_B0_SPI_init();
  USCI_B1_IIC_init();
  USCI_A0_UART_init(); 
  yejing_init();                          //液晶初始化
  adc12_init();                           //adc12初始化
  //P6OUT|=(BIT3+BIT4);              //将数字电位器MCP4261的CS端和AD转换器ADS1255的CS端置高,即不选中这两个芯片
  //USCI_A1_UART_init();
  time_a0_init();
}

void io_init()
{
  ///档位P1.4(200倍) P1.5(100倍) P3.0(50倍) P4.4(25倍)  P4.6(12.5倍) P4.5(6倍)  w0,w1网络接口P4.7 P5.3 ////
  P1DIR=0XFC;                      //P1。0,P1,1口为输入,其他口为输出
  P1REN=BIT0;
  P1OUT=0XCF;                      //p1.0口输入上拉
  //P1IE|=BIT0;
  //P1IES|=BIT0;                    //p1.0打开中断,下降沿有效
  P3SEL=0XFE;
  P3DIR=0X5B;                     //p3.2 p3.4 p3.7输入上拉其他输出上拉
  P3REN=0XF0;
  P3OUT=0XFe;
  P4DIR=0XFF;                    //p4.7输入上拉
  P4REN=0x00;
  P4OUT=0x00;                     //p4.0~p4.3输出开漏   高电平时灯亮 
  P5SEL=0X06;
  P5DIR=0X0F;
  P5REN=0XF0;
  P5OUT=0XF0;                 //p5.4输入上拉 p5.3输出
  P6SEL=BIT1;                  //使能A0、A1端寇输入模拟电压
  P6DIR=0XFc;
  P6REN=0X00;
  P6OUT=0X1c;
  __bis_SR_register( GIE);       // enable interrupts  
}


void USCI_B0_SPI_init()
{
 UCB0CTL0 |=UCMST+UCSYNC;  // 3-pin, 8-bit SPI master不活动时钟为低电平,4261为00模式
  UCB0CTL1 |= UCSSEL_2;                     // SMCLK
  UCB0BR0 |= 0x02;                          // /2
  UCB0BR1 = 0;                              //
  UCB0CTL1 &= ~UCSWRST;                     // **Initialize USCI state machine**
  //IE2 |= UCB0RXIE;                          // Enable USCI1 RX interrupt
}


void USCI_B1_IIC_init()
{
  UCB1CTL0|=UCMODE_3+UCSYNC;                //选择IIC功能和同步模式
  UCB1CTL1 |= UCSSEL_2+ UCSWRST+UCMST;      // SMCLK,I2C Master, synchronous mode
  UCB1BR0 |= 12;                          // /12
  UCB1BR1 = 0;                              //
  //UCB1I2CSA = 0x4E;                         // Set slave address
  P5OUT&=~BIT0;                              //将时钟芯片的RST置为位为低电平
  UCB1CTL1 &= ~UCSWRST;                     // **Initialize USCI state machine**
  //IE2 |= UCB1RXIE;                          // Enable RX interrupt
}


void USCI_A0_UART_init()                    //波特率为9600
{
  UCA0CTL1 |= UCSSEL_1+UCMSB+ UCSWRST;               // CLK = ACLK MSB先发送
  UCA0BR0 = 0x03;                           // 32kHz/9600 = 3.41
  UCA0BR1 = 0x00;                           //
  UCA0MCTL = UCBRS1 + UCBRS0;               // Modulation UCBRSx = 3
  UCA0CTL1 &= ~UCSWRST;                     // **Initialize USCI state machine**
  //IE2 |= UCA0RXIE;                          // Enable USCI_A0 RX interrupt
}

/*void USCI_A1_UART_init()
{
  
}*/

void yejing_init()
{
  uchar cmd;
  P2DIR=0XFF;
  P2OUT=0X00;
  cmd=0x30;               //功能设置 8位数据,基本指令
  WriteCom(cmd);     //写指令
  cmd=0x0d;               //显示状态 ON,游标Off,反白On
  WriteCom(cmd);     //写指令
  cmd=0x01;               //清除显示
  WriteCom(cmd);     //写指令
  cmd=0x02;               //地址归位
  WriteCom(cmd);     //写指令
  cmd=0x80;               //设置DDRAM地址
  WriteCom(cmd);    //写指令
  msec(1);         //延时
}


void Set_RS()            //置位RS端
{
  P6OUT|=BIT5;
}

void Clr_RS()            //复位RS端
{
  P6OUT&=~BIT5;
}

void Set_RW()
{
  P6OUT|=BIT6;
}

void Clr_RW()
{
  P6OUT&=~BIT6;
}

void Set_EN()
{
  P6OUT|=BIT7;
}

void Clr_EN()
{
  P6OUT&=~BIT7;
}


void WriteCom (uchar CMD)  //写控制命令函数
{
 while(CheckBusy());       //检测液晶内部是否忙
 Clr_RS();
 Clr_RW();
 P2OUT=CMD;
 Set_EN();
 void _no_operation(void);       //空操作
 void _no_operation(void);
 Clr_EN();
}


void WriteDat(uchar DAT)  //写数据函数
{
 while(CheckBusy());   //检测液晶内部是否忙
 Set_RS();
 Clr_RW();
 P2OUT=DAT;           //将数据从P2口发送出去
 Set_EN();
 void _no_operation(void);
 void _no_operation(void);
 Clr_EN();
}

uchar CheckBusy()          //检测液晶内部是否在忙的状态
{
   uchar temp;
   P2OUT=0XFF;
   Clr_RS();
   void _no_operation(void);                    //这里的nop不能省略,否则不行
   Set_RW();
   void _no_operation(void);
   Set_EN();
   void _no_operation(void);
   P2DIR=0X00;
   void _no_operation(void);
   temp = P2IN;
   void _no_operation(void);
   Clr_EN();
   void _no_operation(void);
   P2DIR=0XFF;
   temp&=0x80;
   return(temp);
}

void Char_Set_XY (uint x, uint y, char *p)               //显示函数,X列数0~16,Y行数0~3,
{
   if(y == 0)
 {
   WriteCom((0x80+x)); 
 }
 if(y == 1)
 {
  WriteCom((0x90+x));
 }
 /*if(y == 2)
 {
  WriteCom((0xa0+x));
 }
 if(y == 3)
 {
  WriteCom((0xB0+x));
 }*/
 while(*p != 0)
 {
  WriteDat(*p++);
 }
}



void adc12_init()
{
  P6SEL = 0x03;                             // Enable A/D channel inputs
  ADC12CTL0 = ADC12ON+MSC+SHT0_8;           // Turn on ADC12, extend sampling time
                                            // to avoid overflow of results
  ADC12CTL1 = SHP+CONSEQ_1;                 // Use sampling timer, repeated sequence
  ADC12MCTL0 = INCH_0;                      // ref+=AVcc, channel = A0
  ADC12MCTL1 = INCH_1+EOS;                      // ref+=AVcc, channel = A1
  ADC12IE=0X0003;       //打开A1 A0通道中断
  ADC12CTL0 |= ENC;                         // Enable conversions
}


void time_a0_init()
{
  TACTL=0x0000;     //复位TA控制寄存器 
  TACTL=0X0110;       //ACLK 增模式 开中断
  TACCR0=0X028F;      //大概10ms
  TACCTL1=0x0090;     //比较模式,翻转 
  TACCR1=0X028F;
}
//////////////////////////////////键盘函数//////////////////////////////////////////////


void jianpan()         //键盘函数
{
  anjianbianliang=0x00;           //清按键标志,实现一次按键执行一次动作
  if((P5IN&BIT4)==0)              //判断左移键是否按下
  {
     while((P5IN&BIT4)==0);       //判断按键是否松开
     anjianbianliang|=0x01;
  }
  else anjianbianliang&=0xFE;
  
  if((P5IN&BIT5)==0)              //判断右移键是否按下
  {
     while((P5IN&BIT5)==0);
     anjianbianliang|=0x02;
  }
  else anjianbianliang&=0xFD;
  
  if((P5IN&BIT6)==0)              //判断确认键是否按下
  {
     while((P5IN&BIT6)==0);
     anjianbianliang|=0x04;
  }
  else anjianbianliang&=0xFb;
  
  if((P5IN&BIT7)==0)              //判断取消键是否按下
  {
     while((P5IN&BIT7)==0);
     anjianbianliang|=0x08;
  }
  else anjianbianliang&=0xF7;
}


///////////////////////////////////操作内容选择函数/////////////////////////////////////////////


void chaozuoneirongxuanze() //操作内容选择函数
{
  if(caozuoyemian==0)                //如果操作页面标志为0则进入初始页面
  { 
    if(chucijinruyemian)                   //如果初次进入页面,则发送显示字符进入液晶屏
    {
      WriteCom(0x01);                                //清除液晶屏
      Char_Set_XY (1, 0, "江苏科技大学");            //在第一行第六个字开始显示江苏科技大学
      Char_Set_XY (0, 1, "08年电子设计竞赛");  //在第二行第二个字开始显示 2008年江苏省电子设计竞赛
      Char_Set_XY (8, 0, "作品:电阻测试仪");
      Char_Set_XY (9, 1, "请按确认键    ");
      chucijinruyemian=0;
    }
    if(anjianbianliang&0X04) 
    {
        caozuoyemian=1;          //确认键按下操作页面标志置1
        chucijinruyemian=1;       //将初次进入页面标志置,以便下个页面使用
        anjianbianliang&=0xFb;
      }
  }
  if(caozuoyemian==1)               //如果操作页面标志为1则进入操作页面
  {
    if(chucijinruyemian)          //如果初次进入页面,则发送显示字符进入液晶屏
    {
      WriteCom(0x01);                       //清除液晶屏
      Char_Set_XY (1, 0, "操作内容选择");
      Char_Set_XY (10, 1, "开始测试");
      Char_Set_XY (10, 0, "自动设置");
      Char_Set_XY (2, 1, "手动设置");
      //Char_Set_XY (1, 2, "内存");
     // Char_Set_XY (6, 2, "时钟调整");
      //Char_Set_XY (11, 2, "打印数据");
      chucijinruyemian=0;            //将初次进入页面标志置为0,以便下次不重复发送字符过来
    }
    if(anjianbianliang&0x01)             //左移键按下操作内容选择变量减1
    {
      if(caozuoneirongxuanzebianliang==0) caozuoneirongxuanzebianliang=2;
      else caozuoneirongxuanzebianliang--;
      anjianbianliang&=0xFE;
    }
    if(anjianbianliang&0x02)              //右移键按下操作内容选择变量加1
    {
      if(caozuoneirongxuanzebianliang==2) caozuoneirongxuanzebianliang=0;
      else caozuoneirongxuanzebianliang++;
      anjianbianliang&=0xFD;
    }
    if(anjianbianliang&0x04)             //确认键按下则回在下回循环中跳出该页面,并进入下个页面
    {
      caozuogongnengbiaozhi=caozuoneirongxuanzebianliang; //将操作内容选择变量赋值给操作功能标志,以便进入子页面
      caozuoyemian=2;                   //将操作页面标志写入2,下次循环不进入该页面
      chucijinruyemian=1;               //将初次进入页面标志置,以便下个页面使用
      anjianbianliang&=0xFb;
    }
    if(anjianbianliang&0x08)              //取消键按下返回初始页面
    {
      caozuoyemian=0;                    
      caozuoneirongxuanzebianliang=0;    //操作内容选择变量置0
      chucijinruyemian=1;                //将初次进入页面标志置,以便下个页面使用
      anjianbianliang&=0xF7;
    }
    switch(caozuoneirongxuanzebianliang)      //在操作内容选择变量对应的地方闪烁
    {
    case 0: Char_Set_XY (10, 1, "开始测试");break;
    case 1: Char_Set_XY (10, 0, "自动设置");break;
    case 2: Char_Set_XY (2, 1, "手动设置");break;
   // case 3: Char_Set_XY (1, 2, "内存显示");break;
   // case 4: Char_Set_XY (6, 2, "时钟调整");break;
   // case 5: Char_Set_XY (11, 2, "打印数据");break;
    default: break;
    }
    if(caozuogongnengbiaozhi==1)
    {
      caozuoneirongxuanzebianliang=0;    //操作内容选择变量置0
      caozuogongnengbiaozhi=7;           //清操作功能标志
      caozuoyemian=1;                    //操作页面标志=1
      zhidongceshibiaozhi=1;             //自动测试标志=1
    }
  }
}


//////////////////////////////////手动设置函数//////////////////////////////////////////////


void shoudongshezhi()        //手动设置函数
{
  if(caozuogongnengbiaozhi==2)
  {
    zhidongceshibiaozhi=0;             //自动测试标志=0
    if(chucijinruyemian)          //如果初次进入页面,则发送显示字符进入液晶屏
    {
      WriteCom(0x01);                       //清除液晶屏
      Char_Set_XY (1, 0, "手动电流选择");
      Char_Set_XY (1, 1, "5A");
      Char_Set_XY (5, 1, "1A");
      Char_Set_XY (8, 0, " 100mA");
      Char_Set_XY (12, 0, "10mA");
      chucijinruyemian=0;            //将初次进入页面标志置为0,以便下次不重复发送字符过来
    }
    if(anjianbianliang&0x01)             //左移键按下电流选择变量减1
    {
      if(dianliuxuanzebianliang==0)dianliuxuanzebianliang=3;
      else dianliuxuanzebianliang--;
      anjianbianliang&=0xFe;
    }
    if(anjianbianliang&0x02)              //右移键按下电流选择变量加1
    {
      if(dianliuxuanzebianliang==3) dianliuxuanzebianliang=0;
      else dianliuxuanzebianliang++;
      anjianbianliang&=0xFd;
    }
    if(anjianbianliang&0x04)             //确认键按下则选定测量电流,并返回操作页面
    {
     dianliuxuanzebiaozhi=dianliuxuanzebianliang; //将电流选择变量赋值给电流选择标志
      caozuoyemian=1;                   //返回操作页面
      chucijinruyemian=1;               //将初次进入页面标志置,以便下个页面使用

⌨️ 快捷键说明

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