×
单片机 > 单片机程序设计 > 详情

PIC按键LCD+DS1302+AD程序(C程序)

发布时间:2020-06-06 发布时间:
|
//;*******************************************




#include
#include
#define uchar  unsigned char
#define uint   unsigned int
static volatile unsigned char acc @ 0x20;
static volatile bit acc0     @ (unsigned)&acc*8+0;
static volatile bit acc7     @ (unsigned)&acc*8+7;
#define PORTAIT(add,bit) ((unsigned)(&add)*8+(bit))
#define PORTBIT(add,bit) ((unsigned)(&add)*8+(bit))
#define PORTCIT(add,bit) ((unsigned)(&add)*8+(bit))

static  bit    RS  @  PORTCIT(PORTC,0);   
static  bit    RW  @  PORTCIT(PORTC,1);   
static  bit    E   @  PORTCIT(PORTC,2);   
static  bit T_RST  @  PORTCIT(PORTC,5);   
static  bit  T_CLK @  PORTCIT(PORTC,6);   
static  bit  T_IO  @  PORTCIT(PORTC,7);  

static  bit  PORTA_0 @  PORTAIT(PORTA,0);   ///*定义PORTA 0位*/
static  bit  PORTA_1 @  PORTAIT(PORTA,1);   ///*定义PORTA 1位*/
static  bit  PORTA_2 @  PORTAIT(PORTA,2);   ///*定义PORTA 2位*/
static  bit  PORTA_5 @  PORTAIT(PORTA,5);  

static  bit  RB_7 @  PORTBIT(PORTB,7);
const   unsigned char  Data[ ]={'0', '1', '2','3','4', '5', '6','7', '8','9',' '};
const   unsigned char  Ds1302[] = {9, 9, 0, 7,  1, 9 ,3,9,  2,4, 5, 9 ,5,9,};
                                                      // // 年  星期   月    日    时   分  秒
const   unsigned char ds1302_sub[ ]={0};
uchar  DisCash[]={0x00,0x30,0x09,0x1,0x06,0x06,0x06}; 
                              //初始化参数  秒  分  时  日 月 星期 年 
  unsigned  char  y,i; 
            char *pc;
  uchar  BCD[3];
uchar get1302[7];
uchar appear[]={0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0};
void Delay   (  );
void enable  ();
void  display();//显示程序
//延时子程序
void delay()
{  
unsigned  int i=1000;
  while(i--) //for(i=6000;0   {
     ;  // continue;
     }
}
////////////////十六进制转十进制程序

void  H_BCD (uchar x)
{  
         //i,j,t1,t2;
    BCD [2]=x%10;
    BCD [1]=(x%100)/10;
    BCD [0]=x/100;
}
    
//////////写入数据子程序////////////////////////////
void W_data ()
{
         Delay();//判断液晶显示器是否忙
         RS=1;
         RW=0;
         PORTB=y;
       // enable();//写入控制命令子程序
         E=1;
         E=0;
}

//////写入控制命令子程序////////////////////////////
void enable  ()
{  Delay();
   RS=0;
   RW=0;
   PORTB =y;
   E=1;
   E=0;
}
///////判断液晶显示器是否忙///////////////////////
void Delay ()
{
    RS=0;
    RW=1;
    E=0;
    NOP();
    TRISB=0x80;
    E=1;
while(RB_7==1 )
     {
       RS=0;
       RW=1;
       E=0;
       NOP();
       E=1;
     }
     TRISB=0x00;
}
///////////////////////////////////////////////////////////////////////////

void  interrupt  adint(void)
  { 
      ADIF=0;//清/AD中断标志位
  }

////////系统 各I/O初始化子程序///////////////////////////////////////////
void  initial ()
{   TRISB=0;
    TRISC=0;
    TRISA=0x0ff;
}
//////////A/D转换初始化子程序//////////////////////////////
void  adinitial()
{
      ADCON1=15;//;设置RA为A/D甬道模拟输入
                   //;RC时钟。打开A/D转换器。先中通道0
     ADCON0=0x0c1;// B'11000001'   // ;A/D时钟为RC。RA0作A/D输入等
       ADIE=1; //时。开放中断
       ADIF=0; //清/AD中断标志位   PIR1,
       PEIE=1; //开放外围部件中断INTCON,
       GIE=1;   //开放总中断   INTCON,
}
/////往1302写入1Byte数据////////////////////////
void RTInputByte(uchar d) 

    uchar i;
    acc = d;
    TRISC=0x00;
    for(i=8; i>0; i--)
    {
      T_IO = acc0;//CARRY;//ACC0;  //*相当于汇编中的 RRC */
      T_CLK = 1;
      T_CLK = 0;
      acc = acc >> 1; 
    } 
}
///////从1302读取1Byte数据////////////////////////
uchar RTOutputByte(void) 

    uchar i;
    TRISC=0x80;
    for(i=8; i>0; i--)
    {
      acc = acc >>1;         //*相当于汇编中的 RRC */
      acc7= T_IO;// CARRY
      T_CLK = 1;
      T_CLK = 0;
    } 
     return(acc); 
}
///////先写地址,后写命令/数据//////////////////////////
void W1302(uchar ucAddr, uchar ucDa)
{
    T_RST = 0;
    T_CLK = 0;
    T_RST = 1;
    RTInputByte(ucAddr);      // /* 地址,命令 */
    RTInputByte(ucDa);        // /* 写1Byte数据*/
    T_CLK = 1;
    T_RST = 0;
}
///////先写地址,后读命令/数据////////////////////////
uchar R1302(uchar ucAddr)
{
    uchar ucData;
    T_RST = 0;
    T_CLK = 0;
    T_RST = 1;
    RTInputByte(ucAddr);            // /* 地址,命令 */
    ucData = RTOutputByte();        // /* 读1Byte数据 */
    T_CLK = 1;
    T_RST = 0;
    return(ucData);
}
/////////向1302写入 秒 分 时 日 月 星期 年 */////////////
void Set1302(uchar *pClock) 
{
    uchar i;
    uchar ucAddr = 0x80; 
    W1302(0x8e,0x00);           ///* 控制命令,WP=0,允许写操作*/
    for(i =7; i>0; i--)
    { 
      W1302(ucAddr,*pClock);    ///* 秒 分 时 日 月 星期 年 */ 
      pClock++;
      ucAddr +=2;
    }
     W1302(0x8e,0x80);          // /* 控制命令,WP=1,写保护*/
}
////////从1302读出 秒 分 时 日 月 星期 年 *//////////////////
void v_Get1302(unsigned char  ucCurtime[]) 
{
unsigned char i;
unsigned char ucAddr = 0x81;
for (i=0;i<7;i++)
   {
      ucCurtime[i] = R1302(ucAddr);///*格式为: 秒 分 时 日 月 星期 年 */
      ucAddr += 2;
   }
}
//////////拆字子程序///////////////////////////////////////
void  bcd_bcd( )
  {  uchar   a=6;


    for (i=0;i<=15;)
     {
           appear[i]=(get1302[a]&0xf0)/16;
           i++;
           appear[i]=get1302[a]&0x0f;
           i++;
           a--;
     }
}
////////按键扫描///////////////////////////////////////////////////
               
//////////按键扫描/////////////////////////////////////////////////
void   Key()
{  
   uchar a,b,c,i;
  di();
  a=PORTA ;
  if(56!=(a&56))
   { 
      display();
      a=PORTA ;
      if(56!=(a&56))
      { 
        for (b=0;b<14;)
          {
                uchar  z,x;
     
                for(z=50;z>0&&b<14;z--)
                  {    z--;
                      display();// delay();
                       delay();
                       a=PORTA;
                       a=a&56;
                       switch(a)
                        {
    
                            case 48 :
                                if(Ds1302[b]!=appear[b] ) 
                                   (appear[b])++;
                                    a=PORTA ;
                                  for(x=20;x>0&&56!=(a&56);x--)
                                   {   display();// delay();
                                       delay();
                                    } break; // 年  星期  月 日   时  分 秒  
                            case 40 : if(appear[b]!=0)(appear[b])--;
                                       a=PORTA ;
                                        for(x=20;x>0&&56!=(a&56);x--)
                                        {  display();// delay();
                                              delay();
                                        } break;//  年  星期  月 日   时  分 秒    
                            case 24 :  b++;   while( PORTA_5==0);     break;
                        }
                    }
                     
                     a=PORTA ;
                   for(z=50;( z>0&&56==(a&56));z--)
                   {  
                      
                      i=appear[b];
                      appear[b]=10;
                      display( );
                      delay();
                      appear[b]=i;
                      a=PORTA;
                     //a=a&56; 
                     z--;
                 
                    }
                   
          }
                 while( PORTA_5==0);
                  i=13;
                  c=12;
                for(b=0;b<7;b++)
                 {
                      DisCash[b]=((appear[c]&0x0f)*16)|(appear[i]&0x0f);
                       i=i-2;
                       c=c-2;
                 }
                 Set1302(&DisCash[0]); 
                 a=PORTA ;
       }  
    }

//////////显示子程序/////////////////////////////////////////////
void  display()//显示程序
{
      y=0x80;//0x0C0;写入起始地址
       enable();//写入控制命令子程序
      
       for(i=0;i<8;)
       {
          y=Data[ appear[i]];    // 1';//0x47;
          W_data ();//写入数据子程序
       // delay();
           i++;
           y=Data[ appear[i]];    // 1';//0x47;
           W_data ();//写入数据子程序
       // delay();
           i++;
           y='-'; // 1';//0x47;
           W_data ();//写入数据子程序
        //delay();
       }
        y=0x0C0;
        enable();//写入控制命令子程序
        for(i=8;i<14;)
         {
             y=Data[appear[i]];    // 1';//0x47;
             W_data ();//写入数据子程序
                //delay();
               i++;
               y=Data[appear[i]];    // 1';//0x47;
               W_data ();//写入数据子程序
               // delay();
                i++;
                y=':';    // 1';//0x47;
                W_data ();//写入数据子程序
                // delay();
       
          }
             y='-';    // 1';//0x47;
             W_data ();//写入数据子程序
             // delay();

          for(i=0;i<3;i++)
               {
        
                 y=Data[ BCD[i]];    // 1';//0x47;
                 W_data ();//写入数据子程序
                }
}
///////主程序//////////////////////////////////////////////////////
void main()
{   
    // TRISB=0x00;
    // TRISC=0x00;
         Set1302(&DisCash[0]);
        initial ();//系统 各I/O初始化子程序
        adinitial();//A/D转换初始化子程序/
        y=0x01;//PORTB
        enable();//写入控制命令子程序
        y=0x38;//8位2行5X7点阵0x3c
        enable();//写入控制命令子程序
        y=0x0C;//显示器开,F=光标开,闪烁开。
        enable();//写入控制命令子程序
        y=0x06; //文字不动,光标自动右移。
        enable();//写入控制命令子程序

///////////////////////////////////////////////////
   while(1)
   {
        v_Get1302(get1302);//从1302读出 秒 分 时 日 月 星期 年 
       bcd_bcd(get1302);//拆字子程序
       H_BCD ( ADRES ); //十六进制转十进制程序
       ei();
       ADGO=1;      //启动A/D转换 ADCON0,
       
       display();
        Key();
    }  
}




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

热门文章 更多
单片机中高阻态的实质及意义