×
嵌入式 > 技术百科 > 详情

MSP4301602显示Ⅱ

发布时间:2020-06-19 发布时间:
|

/******************************************************************** 

1602液晶显示 

********************************************************************/  

#include  

  

#define CPU_F ((double)8000000)   

#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))   

#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))   

  

#define uchar unsigned char  

#define uint  unsigned int  

#define ulong unsigned long  

  

#define P10 3  

#define P11 6  

#define P12 7  

  

#define RS_CLR  P3OUT &= ~(1 << P10)        //RS置低  

#define RS_SET  P3OUT |= (1 << P10)         //RS置高  

  

#define RW_CLR  P3OUT &= ~(1 << P11)        //RW置低  

#define RW_SET  P3OUT |= (1 << P11)         //RW置高  

  

#define EN_CLR  P3OUT &= ~(1 << P12)        //E置低  

#define EN_SET  P3OUT |= (1 << P12)         //E置高  

  

#define DataPort      P4OUT                 //P4口为数据口  

  

#define KeyPort         P1IN                              //独立键盘接在P14~P17  

#define LED             P2OUT                             //LED灯接在P2上  

  

uchar key;  

  

uchar temp,keynum = 0;  

int shi=23,fen=59,miao=58;  

//*************************************************************************  

//                    系统时钟初始化  

//*************************************************************************  

void Clock_Init()  

{  

  uchar i;  

  BCSCTL1&=~XT2OFF;                 //打开XT振荡器  

  BCSCTL2|=SELM1+SELS;              //MCLK为8MHZ,SMCLK为8MHZ  

  do{  

    IFG1&=~OFIFG;                   //清除震荡标志  

    for(i=0;i<100;i++)  

       _NOP();                      //延时等待  

  }  

  while((IFG1&OFIFG)!=0);           //如果标志为1,则继续循环等待  

  IFG1&=~OFIFG;   

}  

//*************************************************************************  

//              MSP430内部看门狗初始化  

//*************************************************************************  

void WDT_Init()  

{  

   WDTCTL = WDTPW + WDTHOLD;       //关闭看门狗  

}  

  

//*************************************************************************  

//          初始化IO口子程序  

//*************************************************************************  

void Port_init()  

{  

        P1SEL = 0x00;                   //P2普通IO功能  

        P1DIR = 0x0F;                   //P24~P27输入模式,外部电路已接上拉电阻  

        P2SEL = 0x00;                   //P5口普通IO功能  

        P2DIR = 0xFF;   

//        LED = 0X00;                     //P5口输出模式  

    P4SEL = 0x00;  

        P4DIR = 0xFF;  

        P3SEL = 0x00;  

        P3DIR|= BIT3 + BIT6 + BIT7;     //控制口设置为输出模式  

}  

  

//***********************************************************************  

//  显示屏命令写入函数  

//***********************************************************************  

  

  

void LCD_write_com(unsigned char com)   

{     

    RS_CLR;  

    RW_CLR;  

    EN_SET;  

    DataPort = com;                 //命令写入端口  

    delay_ms(5);  

    EN_CLR;  

}  

//***********************************************************************  

//  显示屏数据写入函数  

//***********************************************************************  

  

void LCD_write_data(unsigned char data)   

{  

    RS_SET;  

    RW_CLR;  

    EN_SET;  

    DataPort = data;                //数据写入端口  

    delay_ms(5);  

    EN_CLR;  

}  

//***********************************************************************  

//  显示屏清空显示  

//***********************************************************************  

  

void LCD_clear(void)   

{  

    LCD_write_com(0x01);            //清屏幕显示  

    delay_ms(5);  

}  

//***********************************************************************  

//  写入时分秒  

//***********************************************************************  

void LCD_write_sfm(uchar add,uchar dat)  

{  

  uchar a,b;  

  a = dat/10;  

  b = dat%10;  

  LCD_write_com(0xc0 + add);  

  LCD_write_data(a+0x30);  

  LCD_write_data(b+0x30);  

}  

  

//***********************************************************************  

//  显示屏字符串写入函数  

//***********************************************************************  

  

void LCD_write_str(unsigned char x,unsigned char y,unsigned char *s)   

{  

      

    if (y == 0)   

    {  

        LCD_write_com(0x80 + x);        //第一行显示  

    }  

    else   

    {  

        LCD_write_com(0xC0 + x);        //第二行显示  

    }  

      

    while (*s)   

    {  

        LCD_write_data( *s);  

        s ++;  

    }  

}  

//***********************************************************************  

//  显示屏单字符写入函数  

//***********************************************************************  

  

void LCD_write_char(unsigned char x,unsigned char y,unsigned char data)   

{  

      

    if (y == 0)   

    {  

        LCD_write_com(0x80 + x);        //第一行显示  

    }  

    else   

    {  

        LCD_write_com(0xC0 + x);        //第二行显示  

    }  

      

    LCD_write_data( data);    

}  

//***********************************************************************  

//  显示屏初始化函数  

//***********************************************************************  

  

void LCD_init(void)   

{  

    LCD_write_com(0x38);        //显示模式设置    

    delay_ms(5);  

    LCD_write_com(0x08);        //显示关闭  

    delay_ms(5);  

    LCD_write_com(0x01);        //显示清屏  

    delay_ms(5);  

    LCD_write_com(0x06);        //显示光标移动设置  

    delay_ms(5);  

    LCD_write_com(0x0C);        //显示开及光标设置  

    delay_ms(5);  

}  

//***********************************************************************  

//  时钟显示  

//***********************************************************************  

void clock(void)  

{  

  miao++;  

  if(miao==60)  

  {  

    miao=0;  

    fen++;  

    if(fen==60)  

    {  

      fen=0;  

      shi++;  

      if(shi==24)  

      {  

        shi=0;  

      }  

      LCD_write_sfm(2,shi);  

    }   

    LCD_write_sfm(5,fen);  

  }  

  LCD_write_sfm(8,miao);  

}  

//***********************************************************************  

//  按键检测  

//***********************************************************************  

uchar Key_Scan(void)   

{  

  uchar key_check;  

  uchar key_checkin;  

  key_checkin=KeyPort;              //读取IO口状态,判断是否有键按下  

  key_checkin&= 0xF0;               //读取IO口状态,判断是否有键按下  

  if(key_checkin!=0xF0)             //IO口值发生变化则表示有键按下  

    {  

      delay_ms(20);                     //键盘消抖,延时20MS  

      key_checkin=KeyPort;  

      if(key_checkin!=0xF1)  

        {    

          key_check=KeyPort;  

          switch (key_check & 0xF0)  

            {  

              case 0xE0:key=1;break;  

              case 0xD0:key=2;break;  

              case 0xB0:key=3;break;  

              case 0x70:key=4;break;  

            }           

        }       

   }  

  return key;  

}   

//***********************************************************************  

//      主程序  

//***********************************************************************  

void main(void)  

{  

     WDT_Init();                         //看门狗设置  

//     Clock_Init();                       //系统时钟设置  

     Port_init();                        //系统初始化,设置IO口属性  

     delay_ms(100);                      //延时100ms  

     LCD_init();                         //液晶参数初始化设置  

     LCD_clear();                        //清屏  

            

     LCD_write_com(0xc0+4);  

     LCD_write_data(':');  

     LCD_write_com(0xc0+7);  

     LCD_write_data(':');  

     LCD_write_sfm(2,shi);   

     LCD_write_sfm(5,fen);  

     LCD_write_sfm(8,miao);  

       

     CCR0 = 32768;  

//     TACTL = TASSEL_2 +  MC_3; //+ MC1;  

     TACTL = TASSEL1 + TACLR + MC0 + ID_2;  

     CCTL0 |= CCIE;  

     _EINT();  

           

     while(1)  

     {  

      Key_Scan();                       //键盘扫描,看是否有按键按下  

      if(key != 0xff)                     //如果有按键按下,则显示该按键键值1~4  

        {           

      {  

            switch(key)  

              {  

            case 1: _DINT();break;  //给不同的键赋键值,键值1,亮1个LED灯D1  

                case 2: LED=0xCF;break;  //给不同的键赋键值,键值2,亮1个LED灯D2  

                case 3: LED=0xF8;break;  //给不同的键赋键值,键值3,亮2个LED灯D1.D2  

                case 4: LED=0xFF;break;  //给不同的键赋键值,键值4,亮0个LED灯  

//              default:_EINT();  

              }  

          }   

       }  

     }      

}  

  

#pragma vector=TIMERA0_VECTOR  

__interrupt void TimerA_ISR(void)  

{  

  clock();  

//  P2OUT ^= ~BIT0;  

//  CCR0 += 50000;  

}  

 


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
洪荒之力+无比专注=国内首款机器人离线编程软件