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

12864显示屏菜单程序

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

/*34864中文字库*/ 
// 单片机 的连接 
//******************************************************* 
//p3=>数据口 
//p4--控制口 
//p4.0=>rs 
//p4.1=>r/w 
//p4.2=>e 
//p4.4=>psb 
//p4.5=>rst 

//******************************************************* 
//库函数 
//******************************************************* 
#include "MSP430x22x4.h" 
#define keyin    (P2IN&0x0f) 

//*******数组定义*********************************************** 
unsigned char caidan0[]; 
unsigned char caidan1[]; 
unsigned char caidan2[]; 
unsigned char caidan3[]; 
unsigned char caidan4[]; 

//*********函数定义*************************************************** 

void  delay(unsigned int t); //延时函数 
void  delay1(unsigned int m);//延时函数 
int keyprocess(void);//键盘分析函数 
void  transFEData(unsigned char data, char DI);//写命令/数据函数 
void  LCD_mesg1(unsigned char gao,unsigned char di,unsigned char p); 
void  lcd_mesg(unsigned char *p);// 汉字显示函数 
void  Init_Port(void);//端口初始化函数 
void  Init_lcd1(void);//显示汉字初始化程序 
void CLEAR(void);//清屏函数 
void set_caidan3(void); 
void add_fen1(void); 
void add_fen2(void); 
void add_shi1(void); 
void add_shi2(void); 
 void addaoyun22(); 
 void addyue22(); 
 void addri22(); 
 void addnian22(); 

//**************变量定义******************************************* 
unsigned char key[4][4]={{0,1,2,3},{4,5,6,7},{8,9,10,11},{12,13,14,15}}; 
unsigned char hang[]={0xef,0xdf,0xbf,0x7f};// 选中行码 p1口状态与之对应 
unsigned char lie[]={0x0e,0x0d,0x0b,0x07};//相应列值 p1口状态与之对应 
unsigned char save=16,a,b,xian,temp;//键盘相关变量 
unsigned char a=3,b=3,c=1,d=1,e=2,f=2,j=11,count=0;//时钟有关变量 
unsigned char nian1=0,nian2=8,yue1=0,ri1=0,yue2=7,ri2=2;//年月日有关变量 
unsigned char kongqi1=13,kongqi2=16,aoyun1=3,aoyun2=6;//其它变量 
//*********************************************************** 
//要显示的字符 
unsigned char caidan0[]="0123456789*:ABC ";//16个字符 
unsigned char  caidan1[]={             
"    菜单选项    "              
"2.日历表        " 
"1.个人小档案    " 
"3.我的志愿      " 
}; 

unsigned char caidan2[]={ 
"姓名: 吴兵      " 
"爱好: 篮球、乒乓" 
"年龄: 21岁      " 
"专业: 应用电子  " 
}; 

unsigned char caidan3[]={   
"20  年  月  日  "   
"空气指数  温馨提"//显示A或B  C 
"北京时间        "//显示时钟  时分秒表 
"示: 距奥运会  天" 
}; 

unsigned char caidan4[]={  
" ************** " 
"** 单片机 高手****"  
"**  成为一个  **" 
" ************** " 
}; 

unsigned char caidan5[]={ 
"                " 
"      ^_^       " 
"    请稍候      " 
"                " 
}; 

//**********************延时函数*************************************************** 
void delay(unsigned int t)           //延时程序 
                   { 
                      unsigned int i,j; 
                      for(i=0;i                         for(j=0;j<14;j++); 
                   } 

//**********************延时函数1*************************************************** 
void  delay1(unsigned int m) 

   unsigned int i,j; 
   for(i=0;i    for(j=0;j<1400;j++); 

//*********************端口初始化函数*************************************************** 
void Init_Port(void) 

   WDTCTL=WDTPW+WDTHOLD;  
   BCSCTL1=CALBC1_1MHz;            //设定DCO为1MHZ 
   DCOCTL=CALDCO_1MHZ; 
    
   TACTL=TASSEL_2+TACLR+MC_1+ID_3;         //定时器A时钟源为MCLK,并清TAR//启动定时器A为增计数模式 
       CCR0 =45000;                      //计数值为45000个ACLK周期 
         CCTL0|=CCIE;   
   P3DIR=0XFF;//作数据口 
   P3SEL=0; 
   P3OUT=0Xff; 
   
   P4DIR=0XFF;//作控制口 
   P4SEL=0; 
   P4OUT=0Xff; 
    
    P2DIR=0XF0;//P1低4位输入  作键盘输入 
  P2SEL=0; 
  //P2OUT=0X00; 
    
   _BIS_SR(GIE);//两个开总中断的方法随便用哪一个 
         _EINT();// 

//*********************显示汉字初始化程序************************************************** 
void   Init_lcd1(void) 

  delay1(40); 
  P4OUT|=BIT4; 
  delay(1); 
  P4OUT&=~BIT5; 
  delay(1); 
  P4OUT|=BIT5; 
  delay(10); 
   
  transfEDAta(0x30,0); 
  delay(100); 
   transfedata(0x30,0);   
   delay(37); 
    transfedata(0x08,0);//display on control 
    delay(100);     
    transfedata(0x10,0);//光标设置 
    delay(100); 
    transfedata(0x0c,0);//开显示 
    delay(100); 
     transfedata(0x01,0);//清屏 
    delay(500); 
    transfedata(0x06,0);//光标从右向左加1移动 
    delay(100); 

//**********add1****************************************** 
void add_fen1(void) 

  c++; 
if(c>9)c=0;return; 

//*******************************************// 
void add_fen2(void) 
{d++; 
if(d>5)d=0;return;} 
//*******************************************// 
void add_shi1(void) 
{e++; 
if(e>9)e=0; 
if(f==2&&e>3) 
{f=e=0;} 
return;} 
//*******************************************// 
void add_shi2(void) 
{f++; 
if(f>2)f=0; 
if(f==2&&e>3) 
{f=e=0;} 
  return; 


//**************************************** 
void addnian22(void) 

  nian2++; 
  if(nian2>9) 
  {nian2=0;nian1++;} 
  if(nian1==9&&nian2==9) 
  {nian1=nian2=0;} 

//************************ 
void addyue22(void) 

  yue2++; 
  if(yue2>9) 
  {yue2=0;yue1++;} 
  if(yue2>2&&yue1==1) 
  {yue1=yue2=0;} 

//************************************* 
void addri22(void) 

  ri2++; 
  if(ri2>9) 
  {ri2=0;ri1++;} 
  if(ri2>0&&ri1==3) 
  {ri1=ri2=0;} 

//******************************************** 
 void aoyun22(void) 
 { 
    aoyun2++; 
    if(aoyun2>9) 
  {aoyun2=0;aoyun1++;} 
  if(aoyun2==9&&aoyun1==9) 
  {ri1=ri2=0;} 


//********************基本设置******************************************// 
//**********************************************************************// 
//********************算法**********************************************// 


//*****************************定时中断函数*********************************************// 

  #pragma vector =TIMERA0_VECTOR          //ccr0中断服务 
__interrupt void ta1_isr(void) 

  count++; 
  CCTL0&=~CCIFG;  
  if(count!=3)return;  
  count=0; 
    a++; 
    if(a>9) 
    {a=0;b++; 
        if(b>5) 
        {b=0;c++; 
            if(c>9) 
                { 
                c=0;d++; 
                  if(d>5) 
                  {d=0;e++; 
              if(e>9) 
              { 
              e=0;f++; 
            if(f==2&&e==4) 
            { 
            a=b=c=d=e=f=0;//ab秒  cd分  ef时  
            }      CCR0 =45000; 
        }      CCR0 =45000; 
    }      CCR0 =45000; 
}      CCR0 =45000; 
}      CCR0 =45000; 
}      CCR0 =45000; 


//********写命令/数据***************************************************    
void transfedata(unsigned char data, char DI) 

  P4OUT&=~BIT1; 
  if (DI==1)P4OUT|=BIT0; 
  else P4OUT&=~BIT0; 
  delay(10); 
  P4OUT|=BIT2; 
  P3OUT=data; 
   delay(10); 
  P4OUT&=~BIT2;   
  delay(10); 


//***************************清屏*************************************/ 
void CLEAR(void) 

P4OUT&=~BIT0;//RS=0; 
P4OUT&=~BIT1;//RW=0; 
P4OUT|=BIT2;//E=1; 
P3OUT=0x01;//P1=0x01; 
delay(100); 
P4OUT&=~BIT2;//E=0; 



//***************set_caidan3菜单3设置**************************************************** 
void set_caidan3(void) 

      lcd_mesg1(nian1,nian2,0x81);//年 
      lcd_mesg1(yue1,yue2,0x83);//月 
      lcd_mesg1(ri1,ri2,0x85);//日 
      lcd_mesg1(kongqi1,kongqi2,0x8c);//空气指数标志 
      lcd_mesg1(f,e,0x94);//时钟时 
      lcd_mesg1(j,d,0x95);//时钟分 
      lcd_mesg1(c,j,0x96);//时钟分 
      lcd_mesg1(b,a,0x97);//时钟秒 
      lcd_mesg1(aoyun1,aoyun2,0x9e);//奥运倒计时   


//****************lcd_mesg1定点显示********************************************************* 
void  lcd_mesg1(unsigned char gao,unsigned char di,unsigned char p) 

  transfedata(p,0); 
  delay(10);   
    transfedata(caidan0[gao],1); 
    transfedata(caidan0[di],1); 


//******************lcd_mesg显示界面***************************************** 
void  lcd_mesg(unsigned char *p) 

  unsigned char i; 
  transfedata(0x80,0); 
  delay(10); 
  for(i=0;i<64;i++) 
  { 
    transfedata(*p,1); 
    p++; 
  } 


//*******************键盘分析函数***************************************// 

int keyprocess(void) 

  if(keyin!=0x0f){ 
     delay1(10);//延时去抖动  
     P2OUT = 0x00;          //p2口输出全0 
     if(keyin!=0x0f){ 
       for(a=0;a<4;a++)//有键按下 
       { P2OUT=hang[a]; 
            if(keyin != 0x0f)break; //检测该行有键按下则退出循环        
       }     
        
       for(b=0;b<4;b++) 
       { 
         if(keyin==lie[b]) 
         { 
           save=key[a][b];break;        //检测该列有键按下则退出循环 
         } 
       }    
 P2OUT = 0x00; 
     }}} 

//************************************************** 
void main(void) 
{     
    Init_Port(); 
    Init_lcd1(); //调用LCD字库初始化程序 
    CLEAR();//清屏 
    delay(50);            //大于300uS的延时程序   
    lcd_mesg(caidan1);//显示第一屏    
     delay(50);  
     
    for(;;){ 
     
     while(1) 
     {keyprocess(); 
     if(save==0){xian=0;lcd_mesg(caidan1);}//显示界面--菜单选项 
     if(save==1){xian=1;lcd_mesg(caidan2);}//显示界面1.个人小档案 
     if(save==2){xian=2;CCTL0 = CCIE;lcd_mesg(caidan3);}//显示界面2.日历表  
     if(save==3){xian=3;lcd_mesg(caidan4);}//显示界面3.我的志愿   
      save=16; 
     if(xian==2) 
     { 
       set_caidan3();//设置菜单3 
      delay(100); 
     } 
     }}} 



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

热门文章 更多
物联传感与Atmel强强联手 达成智能家居战略合作协议