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

📄 main.c

📁 MSP430控制128×64液晶程序
💻 C
📖 第 1 页 / 共 2 页
字号:
  Write_0108_Data2(0x00);
  }
} */
}


void Lcd_num()
{
   Set_XY(0,1);
   Num1(6);Num2(60);Num2(18);Num2(12);Num2(42);Num2(6);
   Set_XY(32,1);
   Num1(12);Num1(48);Num1(0); Num1(48);
   
  
   
   Set_XY(0,2);
   Num1(18);Num2(60);Num2(30);Num2(12);Num2(24);Num2(30);
   Set_XY(32,2);
   Num1(0); Num1(12); Num1(36);Num1(48); Num1(12);
   

  
      Set_XY(0,3);
   Num1(0);Num1(54);Num2(60);Num2(12);Num2(6);Num2(0);Num2(48);
   Set_XY(32,3);
   Num1(42);Num1(12);Num1(0);Num1(36);
   
      Set_XY(0,4);
   Num1(0);Num1(12); Num2(60); Num2(30);Num2(12); Num2(54); Num2(48);
   Set_XY(32,4);
   Num1(0); Num1(54); Num1(0); Num1(42); Num1(54); 
   
   Set_XY(34,5);
   Num1(12);Num1(6);Num1(84);Num1(12); Num1(90);
   Set_XY(0,5);
   Num2(0);Num2(18);Num2(72);Num2(42);Num2(12);Num2(30);Num2(96);
   
   Set_XY(34,6);
   Num1(0);Num1(0);Num1(42);Num1(84);Num1(18);
   Set_XY(0,6);
   Num2(36);Num2(90);Num2(12);Num2(42);Num2(72);Num2(42);Num2(30);Num2(54);Num2(12);Num2(96);
   Set_XY(34,7);
   Num1(60);Num1(36); Num1(0); Num1(72); Num1(36);
   

}

void InitMcuXT(void)
{
  unsigned int Iq0;
  BCSCTL1&=~XT2OFF;             //打开XT2振荡器
  do
  {
    IFG1 &= ~OFIFG;    // 清除振荡器失效标志
    for (Iq0 = 0xFF; Iq0 > 0; Iq0--); // 延时,等待XT2起振
  } while ((IFG1 & OFIFG) != 0);  // 判断XT2是否起振
  BCSCTL2 =SELM_1+SELS;                 //选择MCLK和SMCLK为XT2
}

void InitMcuIO( void )
{
  P1SEL=0x00;                   //P1为I/O功能
  P1DIR=0xff;
  P1OUT=0x00;
  P1IE=0x00;                    //stop interrupt

  P2SEL=0x00;                   //P2为I/O功能
  P2DIR=0xff;
  P2OUT=0x00;
  P2IE=0x00;                    //stop interrupt

  P3SEL=0xf0;                 //P3.7,P3.6,P3.5,P3.4为SCI
  P3DIR=0x50;                 //P3.6,P3.4输出 
  P3OUT=0x00;

  P4SEL=0x00;                   //P4为I/O 
  P4DIR=0xff;
  P4OUT=0x00;                   //0为LED ON,1为LED OFF;
  
  
  P5SEL=0x00;                   //P5为I/O功能
  P5DIR=0xff;
  P5OUT=0x00;
  
 // P6SEL=0xff;                   //P6?I/O ??
  //P6DIR=0x00;
  
}
//================================================================
//  喇叭响
//================================================================
void PowerOn(void)
{
  int j=0x33;
   //P1OUT|=(bit6);
  //P5OUT&=~(bit0);
  //Delay(0xff);
  //P5OUT|=(bit0);
for(int m=0;m<8;m++)
{
  for(int i=0;i<400;i++)
     {
       P1OUT&=~(bit6);
       Delay();
       P1OUT|=(bit6);
       Delay();
     }
 j-=0x03;
}
//================================================================
//  串口初始化
//================================================================ 
}
void UartInit(uchar mode)
{
 switch(mode)   //?????
  {
    case 0:
           {   
             UCTL0 = CHAR;
             UCTL1 = CHAR;}                      break;//Uart settings: n,8,1
    case 1:{UCTL0 &= ~SPB;UCTL0 = PEV+PENA+CHAR;}break;//Uart settings: e,8,1
    case 2:{UCTL0 &= ~SPB;UCTL0 = PENA+CHAR;}    break;//Uart settings: o,8,1
    default:                                     break;
   }    
    
}
void UartInitBT(uchar mode)  //波特率
{ 
  switch(mode)  
    {
      case 0:{
              UBR00=0x05;UBR10=0x0d;UMCTL0=0x00;
              UBR01=0x05;UBR11=0x0d;UMCTL1=0x00;
              } break;                                 //baud = 1200
      case 1:{
              UBR00=0x82;UBR10=0x06;UMCTL0=0xb7;
              UBR01=0x82;UBR11=0x06;UMCTL1=0xb7;
             }  break;                                 //baud = 2400
      case 2:{
              UBR00=0x41;UBR10=0x03;UMCTL0=0x00;
              UBR01=0x41;UBR11=0x03;UMCTL1=0x00;
              } break;                                 //baud = 4800
      case 3:{
              UBR00=0xa0;UBR10=0x01;UMCTL0=0xc0;
              UBR01=0xa0;UBR11=0x01;UMCTL1=0xc0;
              }break;                                  //baud = 9600
      case 4:{
              UBR00=0xd0;UBR10=0x00;UMCTL0=0x05;
              UBR01=0xd0;UBR11=0x00;UMCTL1=0x05;
             }break;                                   //baud = 19200
      case 5:{
              UBR00=0x68;UBR10=0x00;UMCTL0=0x40;
              UBR01=0x68;UBR11=0x00;UMCTL1=0x40;
             }break;                                   //baud = 38400
      case 6:{
              UBR00=0x45;UBR10=0x00;UMCTL0=0x4A;
              UBR01=0x45;UBR11=0x00;UMCTL1=0x4A;
             }break;                                   //baud = 57600     
      default  :                                 break;
    }
    
}  
void UartCom(uchar mode)
{
  UTCTL0 = SSEL1;                       // UCLK = SMCLK
  UTCTL1 = SSEL1;
  switch(mode)
   {
     case 0:{
              ME1 |= UTXE0 + URXE0;                 // Enable USART0 TXD/RXD
              IE1 |= URXIE0;                        // Enable USART0 RX interrupt 
            };  break;
     case 1:{
              ME2 |= UTXE1 + URXE1;                 // Enable USART1 TXD/RXD
              IE2 |= URXIE1;                        // Enable USART1 RX interrupt 
            };  break;
     case 2:{ 
              ME1 |= UTXE0 + URXE0;                 // Enable USART0 TXD/RXD
              IE1 |= URXIE0;                        // Enable USART0 RX interrupt 
              ME2 |= UTXE1 + URXE1;                 // Enable USART1 TXD/RXD
              IE2 |= URXIE1;                        // Enable USART1 RX interrupt 
            };  break;
     default :break;
     
   }
}

void Com0String(uchar *array)     //??0????
{
     uchar length=0;
     uchar i=0;
     length=strlen(array);
     for(i=0;i<length;i++)
         {
              while (!(IFG1 & UTXIFG0));
              TXBUF0=array[i];
             // Delay(0xf);
          }
}
/****************************************************************************************/
void Com1String1(uchar *array)     //??1????
{
     uchar length=0;
     uchar i=0;
     length=strlen(array);
     for(i=0;i<length;i++)
         {
              while (!(IFG2 & UTXIFG1));
              TXBUF1=array[i];
          }
     Delay();
}

void Com1String(uchar *m)     //串口1发送
{
     //uchar length=0;
     //uchar i=0;
     //length=strlen(array);
     //for(i=0;i<length;i++)
         //{
              while (!(IFG2 & UTXIFG1));
              TXBUF1=*m;
          //}
              _NOP();
}


void INIT_MCU_TIMEB(void)
{
  TBCTL = TASSEL_2 + TBCLR;     //SMCLK,定时器停止并复位,一次=0.25us
  TBCCTL0 = CCIE;              // CCR0 interrupt enabled
  TBCCR0 =40000;               //定时10MS
  TBCCTL1=OUTMOD_7;            //将CCR1设为比较模式,中断禁止
  TBCCTL2=OUTMOD_7;            //将CCR2设为比较模式,中断禁止
  TBCCR1=0;
  TBCCR2=0;
  TBCTL |= MC0;               //选择up,16位模式
}


//================================================================
//  KS0108BUSY位检测
//================================================================
void Check_0180_State1()   //监测BUSY信号
{
  uchar  ucState;
  P2OUT&=~CSA;
  P4DIR=0x00; 
  P2OUT&=~RS;
  P2OUT|=RW;
do
  {
    P2OUT|=E;
    _NOP();
    _NOP();
    ucState=P4IN;
   _NOP();
   _NOP();
    P2OUT&=~E;
    //Com1String(&ucState);
  }while((ucState&0x80)!=0);
    P2OUT|=CSA;
}

void Check_0180_State2()
{
  uchar  ucState;
  P2OUT&=~CSB; 
  P4DIR=0x00; 
  P2OUT&=~RS;
  P2OUT|=RW;
do
  {
    P2OUT|=E;
    _NOP();
    _NOP();
    ucState=P4IN;
    _NOP();
    _NOP();
    P2OUT&=~E;
   // Com1String(&ucState);
  }while((ucState&0x80)!=0);
    P2OUT|=CSB; 
}
//================================================================
//  AD采样初始化
//================================================================
void Init_ADC(void)   //AD初始化
{
       WDTCTL=WDTPW+WDTHOLD;                    //停止Watchdog
        /* ADC12 Settings: */
       P6SEL|=(bit5);
       ADC12CTL0&=~ENC;                     //在进行设置时首先复位ADC的转换使能
       ADC12CTL0=SHT0_2+ADC12ON+MSC;        //内部振荡器,置位MSC位,因此转换自动进行
       ADC12CTL1=SHP+CONSEQ_2;             
                                                    // 起始地址ADCMEM0 +ADC12DIV_7
                                                    //ADC12SC位触发采样和保持ADC12SSEL_2
                                                   //采样脉冲由定时器产生
                                                  //时钟源:SMCLK 时钟分频:8
                                                  //转换模式:单通道,单次转换
                                                  //选择参考电压和输入管脚
      ADC12MCTL0=INCH_5;                      //REF=AVss,AVcc;INPUT=A5
      ADC12IE|=0x01;                         //使能通道5转换完成后中断 
      ADC12CTL0|=ENC;                      //使能ADC转换
      //_EINT();
      //ADC12CTL0 |=ADC12SC;                 //开始转换  
      //_BIS_SR(LPM0_bits);
     // return;
}

void Change_ADC(int data)   //输出AD转换结果
{
  uchar p,q;
  p=((data>>8)&0xff);
  q=((data)&0xff);
  Com1String(&p);
  Com1String(&q);
}


void FlagInt()
{
   flag0=0;
   flag1=0;
}
void Explainstring(void)
{
  uchar value=0;
  value=rx1_buf[rx1num];
  switch(value)
    {
      case '0':   number=54;break;
      case '1':   number=0;break;
      case '2':   number=6;break;
      case '3':   number=12;break;
      case '4':   number=18;break;
      case '5':   number=24;break;
      case '6':   number=30;break;
      case '7':   number=36;break;
      case '8':   number=42;break;
      case '9':   number=48;break;
      case '-':   number=60;break;
      case '.':   number=72;break;
      case 'a':   number=84;break;
      case 'b':   number=90;break;
      case 'c':   number=96;break;
      default:    
        number=102;break;
    }
  rx1num++;
}

void main( void )
{
      //uchar p,q,m,n;
      

      WDTCTL=WDTPW+WDTHOLD;                //stop watchdog
      InitMcuXT();
      InitMcuIO();
      //PowerOn();
      UartInit(0);
      UartInitBT(3);
      UartCom(2);
      //INIT_MCU_TIMEB();
      Delay();
      Init_0108();
      Lcd_data();
      //Lcd_num();
      _EINT();
      FlagInt();

     // Com1String1("Begin to config...\r\n");
     
  while(1)
   {
      if(flag0==1)
      {
        flag0=0;
        for(int i=0;i<2;i++)
        {
        Explainstring(); 
        Set_XY((rx1num-2)*6,1);Num1(number);
        }
        for(int i=0;i<5;i++)
        {
        Explainstring(); 
        Set_XY(32+(rx1num-4)*6,1);Num1(number);
        }
        for(int i=0;i<5;i++)
        {
        Explainstring(); 
        Set_XY((rx1num-9)*6,1);Num2(number);
        }
        for(int i=0;i<5;i++)
        {
        Explainstring(); 
        Set_XY(34+(rx1num-14)*6,5);Num1(number);
        }
        for(int i=0;i<10;i++)
        {
        Explainstring(); 
        Set_XY((rx1num-19)*6,5);Num2(number);
        }
        
        
        
/*        for(int i=0;i<2;i++)
        {
        Explainstring(); 
        Set_XY((rx1num-14)*6,2);Num1(number);
        }
        
        for(int i=0;i<5;i++)
        {
        Explainstring(); 
        Set_XY(32+(rx1num-16)*6,2);Num1(number);
        }
        for(int i=0;i<5;i++)
        {
        Explainstring(); 
        Set_XY((rx1num-21)*6,2);Num2(number);
        }*/
        rx1num=1;
        memset(rx1_buf,0,64);
      }
      if(flag1==1)
      {
        Clr_Screen();
        Lcd_data();
        flag1=0;
      }
        
   }
}
    
      

/////////scib  rx
#pragma vector=UART1RX_VECTOR
__interrupt void UART_RX1 (void)
{ 
  
  if(flag1==0)
  {
    if(rx1_cnt>63)    rx1_cnt=0;
    rx1temp=RXBUF1;
    if(rx1temp=='I')  rx1_cnt=0;
    rx1_buf[rx1_cnt]=rx1temp;
    rx1_cnt++;
   if(rx1_buf[0]=='I')
     {  
        if(rx1temp==0x0a)
         {
           flag0=1;
         }
   }

 } 
}
   








⌨️ 快捷键说明

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