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

📄 430_lcd_led_key_time.c

📁 430例程1:液晶显示
💻 C
字号:
//已经调试通过   南京航空航天大学   魏小龙
//LCD显示程序,使用于430实验板的电表液晶。可以直接下载到电路运行的
//走时钟程序   液晶与数码管同时显示  只有秒与分,(只是意思以一下,不准的哦)其他原理一样,希望网友自己编写。
//*****************************************************************************
//  MSP-FET430P440 Demo - LCD Put "6543210" on STK/EVK LCD 
//
//  Description; Put "6543210" on MSP-EVK430S320 LCD. 
//  ACLK = LFXT1 = 32768, MCLK = SMCLK = DCO = 32xACLK = 1.048576MHz
//  //*An external watch crystal is required on XIN/XOUT for ACLK*//	  
//
//                MSP430F449
//            -----------------
//        /|\|              XIN|-  
//         | |                 | 32kHz
//         --|RST          XOUT|-
//           |                 |
//         +-|R33          P5.1|     -----------------
//        1m |              -  |--> | + 7 6 5 4 3 2 1 |
//         +-|R23          P3.2|     -----------------
//        1m |             COM0|-----||||
//         +-|R13          COM1|------|||
//        1m |             COM2|-------||
//         +-|R03          COM3|--------|
//         | |                 |
//        Vss
//
//  M.Buccini
//  Texas Instruments, Inc
//  January 2002
//  Built with IAR Embedded Workbench Version: 1.25A
//*****************************************************************************

#include  <msp430x44x.h>
#define uchar unsigned char
#define uint unsigned int
uchar key_buffer;
uchar key_long;
unsigned char disbuffer[8]={0,1,3,8,0xf,5,0x18,7};
char digit[20] = {1,0,0,0,0,2,1,8
};
char distab[]={        0xaf,0x06,0x6d,0x4f,
	0xc6,0xcb,0xeb,0x0e,
	0xef,0xcf,      0x77,0x7c,
	0x39,0x5e,0x79,0x71
	};
unsigned char seg[]={0x3f,0x06,0x5b,0x4f,
	0x66,0x6d,0x7d,0x07,
	0x7f,0x6f,0x77,0x7c,
	0x39,0x5e,0x79,0x71,
	0xbf,0x86,0xdb,0xcf,
	0xe6,0xed,0xfd,0x87,
	0xff,0xef,0xf7,0xfc,
	0xb9,0xde,0xf9,0xf1,

	0x80,0x40,0x00,0x73,0xc0};

void delay(int v)
    {
        while(v!=0)v--;
    }

void disp(void)
    {
    unsigned char i=0,j=0;
    unsigned char temp_wei=0x04,temp_duan=0;
//    P1IE=0X0;
    P1DIR  =  0x1f;
    for(i=0;i<8;i++)
      {
        P1OUT  &=  ~BIT3;  
        temp_duan=seg[disbuffer[i]] ;
        for(j=0;j<8;j++)
            {
             if(temp_duan&0x80)   
                P1OUT  |=   BIT0;
             else
                P1OUT  &=  ~BIT0;
             temp_duan=temp_duan<<1;
             P1OUT  &=   ~BIT4;   P1OUT  |=  BIT4;       
            }
         P1OUT  =  (P3IN&0xf8) | temp_wei;
         P1OUT  |=   BIT3;      
         temp_wei++;
         delay(80);
      }
     for(i=0;i<8;i++)
     { P1OUT  &=  ~BIT0;   P1OUT  &=   ~BIT4;   P1OUT  |=  BIT4;     
     }
    P1DIR=0XF;
    P1OUT=0XF;
    P1IFG=0;
    P1IE=0xf0;
    }


void main(void)
{
   int i;
  WDTCTL = WDTPW + WDTHOLD;             // Stop watchdog timer
  FLL_CTL0 |= XCAP14PF;                 // Configure load caps
//  LCDCTL = LCDON + LCD4MUX + LCDP2;     // STK LCD 4Mux, S0-S17
  LCDCTL = 0XFD;
  BTCTL = BTFRFQ1;                      // STK LCD freq 
  P5SEL = 0xFC;                         // Common and Rxx all selected
  for(i=0;i<20;i++)     
  LCDMEM[i]=0;
  
  for (i=1; i<9; ++i)                   // Display "6543210" 
  LCDMEM[i] = distab[digit[i-1]];//digit[i];
  P1DIR=0x1f;
    P1DIR=0X0f;
    P1OUT=0X0f;
    P1IE=0Xf0;
    P1IES=0;
    P1IFG=0;
  TACTL = TASSEL1 + TACLR;              // SMCLK, clear TAR
  CCTL0 = CCIE;                         // CCR0 interrupt enabled
  CCR0 = 20000;
  TACTL |= MC1;                         // Start Timer_A in continuous mode
  P4DIR = 0XFF;
  _EINT();                              // Enable interrupts
 
  for (;;)                              
  {
    _BIS_SR(CPUOFF);                    // CPU off
    _NOP();                             // Required only for C-spy
  }
}

interrupt[TIMERA0_VECTOR] void Timer_A (void)
{  char i=0;
 disp(); 
  for(i=0;i<7;i++)
      disbuffer[8-i]=digit[i];
  CCR0 += 20000;                        // Add Offset to CCR0
  for(i=1;i<7;i++)
      LCDMEM[i-1]=distab[digit[i]];
  digit[0]++;
  LCDMEM[7]=0xa;
  LCDMEM[8]=0x90;
  LCDMEM[9]=0x12;
  LCDMEM[10]=0x80;
  LCDMEM[11]=0x2;
  LCDMEM[12]=0x93;
  LCDMEM[13]=0x72;
  LCDMEM[14]=0x5b;
  LCDMEM[15]=0x94;
    

  if(digit[0]==50)
       {
       digit[0]=0;
       digit[1]++;
       P4OUT = ~P4OUT;
       if(digit[1]==10)
           {
           digit[1]=0;
           digit[2]++;
           if(digit[2]==6)
               {
               digit[2]=0;
               digit[3]++;
               if(digit[3]==10)
                    {
                    digit[3]=0;
                    digit[4]++;
                    if(digit[4]==6)
                         {
                         digit[4]=0;
               }
               }
               }
               }
       }
}

//*************************************888888
//
//************************************8888888
uchar key_just(void)    //00:down  0xff:no down
    {
    P1DIR=0xf;
    P1OUT=0xf;
    if((P1IN&0xf0)==0)
          return(0xff);
    return(0);
    }
    
uchar key_code(void)    
    {uchar in;
     P1DIR=0XF;
     P1OUT=0x8;
     in=P1IN&0x0f0;
     if(in!=0)
         {
         if(in==0X10)
           return(0); //C-F
         if(in==0X20)
           return(1);
         if(in==0X40)
           return(2);
         if(in==0X80)
           return(3);
          }
     P1OUT=0X4;
     in=P1IN&0x0f0;
     if(in!=0)
         {
         if(in==0X10)
           return(4);   //8-B
         if(in==0X20)
           return(5);
         if(in==0X40)
           return(6);
         if(in==0X80)
           return(7);
         }
     P1OUT=0X2;
     in=P1IN&0x0f0;
     if(in!=0)
         {
         if(in==0X10)
           return(8);   //4-7
         if(in==0X20)
           return(9);
         if(in==0X40)
           return(10);
         if(in==0X80)
           return(11);
         }
     P1OUT=0X1;
     in=P1IN&0x0f0;
     if(in!=0)
         {
         if(in==0X10)
           return(12);   //0-3
         if(in==0X20)
           return(13);
         if(in==0X40)
           return(14);
         if(in==0X80)
           return(15);
          }
        return(0xff);
      }
    
uchar key(void)
    {
    uchar temp=0xff    ;//=key_buffer;
    uint time=0;
    P1IFG=0;
    if(key_just()==0)
        delay(500);
    if(key_just()!=0)
        return(temp);
    temp=key_code();
    key_buffer=temp;
key_loop:    
    if(key_just()==0)
       {
       time++;
       delay(300);
       if(time>200)
            key_long=0xf;
       goto  key_loop;
       }
    else
       {
       P1IFG=0;
       return(temp);
       }
    }
//***************************************   


interrupt[PORT1_VECTOR] void key_p1(void)
      {
      uchar key_;
      uchar i=0;
      P1IFG=0;
      key_=key();
      LCDMEM[6]=distab[key_];
      disbuffer[0]=key_;
      }

⌨️ 快捷键说明

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