天堂草原最受欢迎的角色,天堂动漫,天堂在线,色天堂下载,天堂中文在线资源,亚洲男人天堂

技術熱線: 4007-888-234
設計開發

專注差異化嵌入式產品解決方案 給智能產品定制注入靈魂給予生命

開發工具

提供開發工具、應用測試 完善的開發代碼案例庫分享

技術支持

從全面的產品導入到強大技術支援服務 全程貼心伴隨服務,創造無限潛能!

新聞中心

提供最新的單片機資訊,行業消息以及公司新聞動態

初學C.按鍵+ LCD+DS1302+A_D程序

更新時間: 2019-03-23
閱讀量:1613

十年專注單片機方案開發的方案公司英銳恩,分享初學C.按鍵+ LCD+DS1302+A_D程序。英銳恩現提供服務產品涉及主控芯片:8位單片機、16位單片機、32位單片機及各類運算放大器等。

#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<i;>  {

  ;  // 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();
    }  
}

 

(文源網絡,侵刪)

联系我们: 堆龙德庆县| 陇西县| 平安县| 腾冲县| 颍上县| 枞阳县| 阿坝县| 扶余县| 武平县| 于都县| 忻州市| 定西市| 兰州市| 星子县| 柘荣县| 松阳县| 大庆市| 古浪县| 革吉县| 鱼台县| 太和县| 正安县| 廊坊市| 砀山县| 甘泉县| 宜章县| 汉沽区| 班玛县| 孝义市| 商都县| 浮梁县| 普安县| 忻城县| 左贡县| 即墨市| 夏津县| 桃园县| 吴堡县| 乌拉特后旗| 上高县| 安乡县|