counter.c

来自「《PIC单片机C语言开发入门》所有章节源程序」· C语言 代码 · 共 138 行

C
138
字号

//**************************************************************/
    /*计数器实验源程序,源文件名counter.c。使用MPLAB C18
      编译器。*/
    //使用PIC18F452高性能单片机,RA1输入脉冲信号,RB口输出BCD码,
    //由LED数码管显示RB口输出的两位十进制数。
    //使用AW-2型实验板。
//**************************************************************/

/*
 *PICC编译器源程序注释也可以使用“//“符号。
*/ 

//---------------------------------------------------------------
#include <p18cxxx.h>      /* head file*/
#include <p18f452.h>      //PIC18F452 head file。
//---------------------------------------------------------------

//---------------------------------------------------------------
#define uchar unsigned char
#define uint unsigned int
//---------------------------------------------------------------

//---------------------------------------------------------------
void initPORTB();
void initPORTA();
void uinttouchar(uchar x);     //hex to BCD
uchar connectbyte(uchar y1,uchar y2);   //合并BCD字节。
void delayx1ms(uchar count);  // 声明按键延迟函数。
//---------------------------------------------------------------  

//---------------------------------------------------------------
uchar counter;            //按键计数。

uchar x1,x2;              //x1是BCD高4位,x2是BCD低4位。
//---------------------------------------------------------------

void main (void)
{
    initPORTB();
    initPORTA();
   
    counter = 0;          //设置初值。

    while (1)             //永久循环扫描键盘。
    {
       TRISA=0x00;        
       PORTAbits.RA1=0; 

       if(PORTAbits.RA1==0)     /* have key down*/
      {
         delayx1ms(10);           /*delay 10ms*/
         if(PORTAbits.RA1==0)
         {
           counter++;           /*key value memory in counter*/
           
           TRISA=0x00;        
           PORTAbits.RA1=1;

           while(1)    
           { 
             if(PORTAbits.RA1==1)    //按键松开否?    
             delayx1ms(10);            //延迟10ms。
             
             if(PORTAbits.RA1==1)    //按键松开。
                break;               //退出。      
           }
           
           uinttouchar(counter);     //hex to decimal       
           PORTB=connectbyte(x1,x2); //connect bcd high 4 bit and low 4 bit 

          }
      }

    }
}

//*************************************************************************
// inicial PORTB.
//*************************************************************************
void initPORTB()
{
    TRISB = 0x00;         //设置B口为输出。
    INTCON=0x00;          //关闭所有中断。
    PORTB=0x00;           //清B口。
}

//*************************************************************************
// delay 1ms*count subprogram.
//*************************************************************************
void initPORTA()
{
    PORTA=0x00;           //清A口。          
    ADCON1=0x07;          //设置A口为开关量I/O使用。
    TRISA=0xff;           //设置A口为输入。
    //PORTA=0xff;
}

//*************************************************************************
// delay 1ms*count subprogram.
//*************************************************************************
void delayx1ms(uchar count)
{
     uchar i,j;
     for(i=0;i<count;i++)      //count is delay sum
         for(j=0;j<130;j++)
           ;
}

//*************************************************************************
//    uint hex change into decimai.
//*************************************************************************
void uinttouchar(uchar x)
{
     uchar mid,y;

     mid=x;
     y=x;
     x2=(uchar)(y%10);

     y=mid;
     x1=(uchar)(((y-x2)%100)/10);
}

//*************************************************************************
//    合并字节.
//*************************************************************************
uchar connectbyte(uchar y1,uchar y2)
{
     return(((0xf0)&(y1<<4))|((0x0f)&y2));
}






⌨️ 快捷键说明

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