專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> MCU設(shè)計(jì)實(shí)例 >> 瀏覽文章

M8單片機(jī)驅(qū)動(dòng)繼電器,1602液晶,按鍵程序

作者:huqin   來源:本站原創(chuàng)   點(diǎn)擊數(shù):  更新時(shí)間:2014年02月21日   【字體:


#include <iom8v.h>
#include <macros.h>
#define  uchar unsigned char
#define  uint unsigned int
///////////////////////////////////////////////////////////////
#define  rs_L     PORTD&=~BIT(0)
#define  rs_H     PORTD|=BIT(0)
#define  rs_out   DDRD|=BIT(0)

#define  rw_L     PORTD&=~BIT(1)
#define  rw_H     PORTD|=BIT(1)
#define  rw_out   DDRD|=BIT(1)

#define  en_L     PORTD&=~BIT(2)
#define  en_H     PORTD|=BIT(2)
#define  en_out   DDRD|=BIT(2)

 

#define  s1_L     PORTD&=~BIT(4)
#define  s1_H     PORTBD|=BIT(4)
#define  s1_out   DDRD|=BIT(4)

#define  s2_L     PORTD&=~BIT(5)
#define  s2_H     PORTD|=BIT(5)
#define  s2_out   DDRD|=BIT(5)

#define  s3_L     PORTD&=~BIT(6)
#define  s3_H     PORTD|=BIT(6)
#define  s3_out   DDRD|=BIT(6)

#define  s4_L     PORTD&=~BIT(7)
#define  s4_H     PORTD|=BIT(7)
#define  s4_out   DDRD|=BIT(7)
uchar miu=0;
signed char t,tt,z,zz,a,b,c,d,e,f,g;
uchar table1[]="<Himetech>~00~00";
uchar table2[]="Z00~X00~z00~x0  ";
/////////////////////////////////////////////////////////////////
const table3[10]={20,40,60,80,100,120,140,160,180,200};
/////////////////////////////////////////////////////////////
void delay(uint ms)//yan shi han shu
{
uchar a;
uint b;
for(a=0;a<ms;a++)
for(b=0;b<1141;b++);
}
///////////////////////////////////////////////////////////////
uchar key_press()//pan dan an jian shi fu an xia
{
    uchar j;
    DDRC|=0X0f;
PORTC|=0X0f;
DDRC&=0XF0;
j=PINC;
j=j&0X0F;//00001111
if(j==0X0F)
{
 return 0;
}
else
{
return 1;
}
}

//////////////////////////////////////////////////////////
void key_scan()//pan dan an xia de  jian
{   
    uchar key;
    delay(10);
if(key_press())
{
key=PINC;
key&=0X0F;
switch(key)
{
  case 0X0E: //guang biao zuo yi
      {
     zhilin(0x0f);
     miu--;
              if(miu==1){zhilin(0x80+11);}
     if(miu==2){zhilin(0x80+12);}
 if(miu==3){zhilin(0x80+14);}
 if(miu==4){zhilin(0x80+15);}
 
         if(miu==5){zhilin(0x80+0x40+1);}
     if(miu==6){zhilin(0x80+0x40+2);}
 if(miu==7){zhilin(0x80+0x40+5);}
 if(miu==8){zhilin(0x80+0x40+6);}
 if(miu==9){zhilin(0x80+0x40+9);}
 if(miu==10){zhilin(0x80+0x40+10);}
 if(miu==11){zhilin(0x80+0x40+13);}
 if(miu==-1){miu=12;}
  }break;
 
 
  case 0X0B: //guang biao you yi
      {
     zhilin(0x0f);
     miu++;
              if(miu==1){zhilin(0x80+11);}
     if(miu==2){zhilin(0x80+12);}
 if(miu==3){zhilin(0x80+14);}
 if(miu==4){zhilin(0x80+15);}
 
         if(miu==5){zhilin(0x80+0x40+1);}
     if(miu==6){zhilin(0x80+0x40+2);}
 if(miu==7){zhilin(0x80+0x40+5);}
 if(miu==8){zhilin(0x80+0x40+6);}
 if(miu==9){zhilin(0x80+0x40+9);}
 if(miu==10){zhilin(0x80+0x40+10);}
 if(miu==11){zhilin(0x80+0x40+13);}
 if(miu==12){miu=0;}
  }break;
 
 
  case 0X0D://dui guang biao suo zai xiang, jin xin jia shu
      {
     
 if(miu==1){t++;if(t==2)t=0;zhilin(0x0c);dizhishujv((0x80+11),(0x30+t));}
     if(miu==2){tt++;if(tt==10)tt=0;zhilin(0x0c);dizhishujv((0x80+12),(0x30+tt));}
 if(miu==3){z++;if(z==2)z=0;zhilin(0x0c);dizhishujv((0x80+14),(0x30+z));}
 if(miu==4){zz++;if(zz==2)zz=0;zhilin(0x0c);dizhishujv((0x80+15),(0x30+zz));}  
     if(miu==5){a++;if(a==2)a=0;zhilin(0x0c);dizhishujv((0x80+0x40+1),(0x30+a));}
     if(miu==6){b++;if(b==10)b=0;zhilin(0x0c);dizhishujv((0x80+0x40+2),(0x30+b));}
     if(miu==7){c++;if(c==2)c=0;zhilin(0x0c);dizhishujv((0x80+0x40+5),(0x30+c));}
     if(miu==8){d++;if(d==10)d=0;zhilin(0x0c);dizhishujv((0x80+0x40+6),(0x30+d));}
     if(miu==9){e++;if(e==2)e=0;zhilin(0x0c);dizhishujv((0x80+0x40+9),(0x30+e));}
 if(miu==10){f++;if(f==10)f=0;zhilin(0x0c);dizhishujv((0x80+0x40+10),(0x30+f));}
     if(miu==11){g++;if(g==2)g=0;zhilin(0x0c);dizhishujv((0x80+0x40+13),(0x30+g));}
           }break;
     
 
  case 0X07:
      {
  DDRC&=~BIT(4);
  PORTC|=BIT(4);
  //ji qi shi xv
           if(t)PORTD|=BIT(6);else PORTD&=~BIT(6);//qi
//////////////////////////////////////////////////////////////// 
         if(z)PORTD|=BIT(7);else PORTD&=~BIT(7);//zhu zhou
          
/////////////////////////////////////////////////////////////////////  
           if(a){PORTD|=BIT(4); }else PORTD&=~BIT(4);//z  zou en
            delay(table3[b]);
////////////////////////////////////////////////////////////
           if(c)PORTD|=BIT(5);else PORTD&=~BIT(5);   //x zou en
           while(PINC&0x10);
           delay(table3[d]);
///////////////////////////////////////////////////////////////
           if(e)PORTD&=~BIT(4);else PORTD|=BIT(4);  //z shou en
  PORTD&=~BIT(7);
           delay(table3[f]);
  PORTD&=~BIT(6);
  delay(table3[tt]);
///////////////////////////////////////////////////////////
           if(g)PORTD&=~BIT(5);else PORTD|=BIT(5);  // x shou  en
          
  } 
  break;
 
  
  default: 
      key=0;      
}
 while(key_press());
}
}
/////////////////////////////////////////////////////////////////////
void zhilin(uchar zhi)
{
rs_H; rw_H; en_L;
rs_L; rw_L;
PORTB=zhi;
delay(1);
en_H;
delay(1);
en_L;
}
////////////////////////////////////////////////////////////////
void shujv (uchar shu)
{
rs_L; rw_H; en_L;
rs_H; rw_L;
PORTB=shu;
delay(1);
en_H;
delay(1);
en_L;
}
///////////////////////////////////////////////////////////////////
void init_lcd (void)
{
uchar e;
DDRB=0xff;  PORTB=0xff;
rs_out;     rw_out;     en_out;

delay(1);
zhilin(0x38);
delay(1);
zhilin(0x38);
delay(1);
zhilin(0x38);
zhilin(0x38);

zhilin(0x08);
zhilin(0x01);
zhilin(0x06);
zhilin(0x0c);

zhilin(0x80+0x00);

for(e=0;e<16;e++)
     {
shujv (table1[e]);
delay(1);
}
zhilin(0x80+0x40);

for(e=0;e<16;e++)
     {
shujv (table2[e]);
delay(1);

 
}

void dizhishujv(uchar dizhi,uchar shu)
{
   zhilin(dizhi);
  shujv(shu);

}

void init_time(void) //din shi qi chu shi hua
{
TCCR1B=0X00;//wu fen pin
TCNT1H=0X80;//chu zhi H
TCNT1H=0X80;//chu zhi L
TIMSK|=BIT(2);//kai din shi qi 1 zhong dan
SREG|=BIT(7);//kai zong zhong dan

}

/////////////////////////////////////////////////////////////////////////////
void main (void)                  
{
   init_lcd ();
   init_time();
   DDRD|=0xf0;
    while(1)
{
      key_scan();                            
    }                                        
}                                           

#pragma interrupt_handler timer1:9
void timer1(void)//din shi qi 1 zhong dan
{
TCNT1H=0X80;
TCNT1H=0X80;
}
 

關(guān)閉窗口

相關(guān)文章