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

PIC单片机开发板独立键盘扫描+蜂鸣器响+数码管 C程序代码

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

/*

为自已写的独立键盘扫描+蜂鸣器响+数码管

犯的错:unsigned密写成了unsigner一直提示找不到a,b

  PORTD0=1;不行,要写成PORTD=0x01;才可以,经实验证得没有PORTD0没这个东西,应为RD0=1; 

  PORTD=0x03;不是第三个灯亮,而是0000 0011是两个灯亮

  PORTD=0x8则是0000 1000是第4个灯亮。。。。。出错因原进制转化,刚开始写程序进制转化混掉了。

*/

#include

#define uchar unsigned char

#define uint unsigned int

__CONFIG(0x3B31);

const unsigned char table[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};  //数码管数组

uchar key_num;

void delay(uint x)  //延时函数

{

uint a,b;

for(a=x;a>0;a--)

  for(b=110;b>0;b--);

}

void scan();   //扫描键盘函数  声明

void didi(uchar num); //蜂鸣器响 函数 声明

void disp(uchar num0,uchar num1,uchar num2,uchar num3,uchar num4,uchar num5,uchar num6,uchar num7); //数码管显示 声明

//-----------------------------------------------------------------------------------

void init()        //初始化函数

{

TRISA=0x00; 


TRISB=0xff;  


TRISC=0X00;


TRISD=0x00; 


TRISE=0x00;  


PORTC=0Xff;  


PORTD=0x00; 


}

//-------------------主函数-----------------------------------------------------------

void main()

{

init ();

while(1)

{

scan();   //扫描键盘

disp(key_num,2,3,4,5,6,7,8); //后面的直接传给数码管而第一个是几,我们要用键盘来检测,则第一个变量由key_num

}

}

//-------------------------------------------------------------------------------------


void didi(uchar num) //蜂鸣器函数,num响几声

{

uchar di_num; //di_num响几声

for(di_num=num;di_num>0;di_num--)

  {

  RE0=1;

  delay(100);

  RE0=0;

  delay(50);

  }

}

void scan()  

if(RB0==0)

  {

  delay(10); 


  if(RB0==0)

   {

   didi(1);

   while(!RB0); 


//   PORTD=0x01;  //若写成RD0=1;也可,不过呢,会出现灯亮了之后不会灭掉,还得加清零(灭灯)

   key_num=1;

   }

  }

if(RB1==0)

  {

  delay(10); 


  if(RB1==0)

   {

   didi(2);

   while(!RB1);


//   PORTD=0x02;

   key_num=2;

   }

  }

if(RB2==0)

  {

  delay(10); 


  if(RB2==0)

   {

   didi(3);

   while(!RB2);


//   PORTD=0x04;

   key_num=3;

   }

  }

if(RB3==0)

  {

  delay(10); 


  if(RB3==0)

   {

   didi(4);

   while(!RB3); 


//   PORTD=0x08;

   key_num=4;

   }

  }

}


//---------------------------数码管显示函数,数组------------------------------------------------

void disp(uchar num0,uchar num1,uchar num2,uchar num3,uchar num4,uchar num5,uchar num6,uchar num7)

{

PORTD=table[num0];

PORTA=0x00;  //第一个数码管选通

delay(2);  //延时,显示2ms


PORTD=table[num1];

PORTA=0x02;  //第二个数码管选通

delay(2);  //延时,显示2ms


PORTD=table[num2];

PORTA=0x04;  //第三个数码管选通

delay(2);  //延时,显示2ms


PORTD=table[num3];

PORTA=0x06;  //第四个数码管选通

delay(2);  //延时,显示2ms


PORTD=table[num4];

PORTA=0x08;  //第五个数码管选通

delay(2);  //延时,显示2ms


PORTD=table[num5];

PORTA=0x0A;  //第六个数码管选通

delay(2);  //延时,显示2ms


PORTD=table[num6];

PORTA=0x0c;  //第七个数码管选通

delay(2);  //延时,显示2ms


PORTD=table[num7];

PORTA=0x0e;  //第八个数码管选通

delay(2);  //延时,显示2ms

}



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

热门文章 更多
51单片机中断源的扩展方法