|
有朋友想用独立键盘控制LED灯和蜂鸣器,这里有一个我早期编的程序,可以作为例子。板子:HC6800-ES-V2.0
芯片:STC89C52RD
一直都添加不了附件,所以直接上程序了。- /*
- 本实例是独立键盘实验
- 1、键盘消抖动的含义和编程时的做法
- 2、熟悉C语言,让结果丰富多彩
- 3、复习了静态数码管
- */
- #include<reg51.h>
- #include<intrins.h>
- #define GPIO_LED P2
- #define GPIO_DIG P0
- sbit LSA=P2^2;
- sbit LSB=P2^3;
- sbit LSC=P2^4;
- sbit k1=P3^1;
- sbit k2=P3^0;
- sbit k3=P3^2;
- sbit k4=P3^3;
- sbit Beep = P1^5 ;
- void Delay(unsigned int i);
- void Delay10ms(unsigned int c);
- unsigned char code DIG_CODE[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
- 0x77,0x7c,0x39,0x5e,0x79,0x71};
- void main(void)
- {
- unsigned int i,j,n;//i为松手消抖计数变量;j为LED灯状态暂存变量;n为移动LED灯的循环
- bit f; //计数变量和发声音的脉冲次数计数变量;f为蜂鸣器刚才响过的声音标志
- f=0;
- j=0xff;
- GPIO_LED=j;
- while(1)
- {
- if(k1==0)//扫描键盘k1
- {
- Delay10ms(1);
- if(k1==0)
- {
- if(j==0xff)//如果全灭
- {
- j=0x00;//则全开
- GPIO_LED=j;
- }
- else//反之
- {
- j=0xff;//则全灭
- GPIO_LED=j;
- }
- while((i<50)&&(k1==0))
- {
- Delay10ms(1);
- i++;
- }
- i=0;
- }
- }
- if(k2==0)//扫描键盘k2
- {
- Delay10ms(1);
- if(k2==0)
- {
- if(j<0x80)//如果亮的LED灯第7位亮了,其它位也可能亮着
- {
- j=0x7f;//则只亮第7位
- GPIO_LED=j;
- Delay10ms(10);
- for(n=0;n<7;n++)//并以此向右移动LED灯
- {
- j=_cror_(j,1);
- GPIO_LED=j;
- Delay10ms(10);
- }
- }
- else//反之
- {
- j=0xfe;//亮第0位LED灯
- GPIO_LED=j;
- Delay10ms(10);
- for(n=0;n<7;n++)//并以此向左移动LED灯
- {
- j=_crol_(j,1);
- GPIO_LED=j;
- Delay10ms(10);
- }
- }
- while((i<50)&&(k2==0))
- {
- Delay10ms(1);
- i++;
- }
- i=0;
- }
- }
- if(k3==0)//扫描键盘k3
- {
- Delay10ms(1);
- if(k3==0)
- {
- j=0xff;//初始化:关闭LED灯
- GPIO_LED=j;
- if(f==0)//如果刚才响过低音
- {n=0;
- while(n<5000)
- {
- Beep= 1;
- Delay(10);//时间间隔短,高音
- Beep= 0;
- Delay(10);
- n++;
- }
- f=1;//记录这次响的是高音
- }
- else//反之
- {n=0;
- while(n<1000)
- {
- Beep= 1;
- Delay(50);//时间间隔长,低音
- Beep= 0;
- Delay(50);
- n++;
- }
- f=0;//记录这次响的是低音
- }
- while((i<50)&&(k3==0))
- {
- Delay10ms(1);
- i++;
- }
- i=0;
- }
- }
- if(k4==0)
- {
- Delay10ms(1);
- if(k4==0)
- {
- j=0xff;//初始化:关闭LED灯
- GPIO_LED=j;
- LSA=0;LSB=0;LSC=0;//数码管静态显示
- GPIO_DIG=DIG_CODE[0];
- Delay10ms(50);
- LSA=1;LSB=0;LSC=0;
- GPIO_DIG=DIG_CODE[1];
- Delay10ms(50);
- LSA=0;LSB=1;LSC=0;
- GPIO_DIG=DIG_CODE[2];
- Delay10ms(50);
- LSA=1;LSB=1;LSC=0;
- GPIO_DIG=DIG_CODE[3];
- Delay10ms(50);
- LSA=0;LSB=0;LSC=1;
- GPIO_DIG=DIG_CODE[4];
- Delay10ms(50);
- LSA=1;LSB=0;LSC=1;
- GPIO_DIG=DIG_CODE[5];
- Delay10ms(50);
- LSA=0;LSB=1;LSC=1;
- GPIO_DIG=DIG_CODE[6];
- Delay10ms(50);
- LSA=1;LSB=1;LSC=1;
- GPIO_DIG=DIG_CODE[7];
- Delay10ms(50);
- LSA=0;LSB=0;LSC=0;
- GPIO_DIG=DIG_CODE[8];
- Delay10ms(50);
- LSA=1;LSB=0;LSC=0;
- GPIO_DIG=DIG_CODE[9];
- Delay10ms(50);
- LSA=0;LSB=1;LSC=0;
- GPIO_DIG=DIG_CODE[10];
- Delay10ms(50);
- LSA=1;LSB=1;LSC=0;
- GPIO_DIG=DIG_CODE[11];
- Delay10ms(50);
- LSA=0;LSB=0;LSC=1;
- GPIO_DIG=DIG_CODE[12];
- Delay10ms(50);
- LSA=1;LSB=0;LSC=1;
- GPIO_DIG=DIG_CODE[13];
- Delay10ms(50);
- LSA=0;LSB=1;LSC=1;
- GPIO_DIG=DIG_CODE[14];
- Delay10ms(50);
- LSA=1;LSB=1;LSC=1;
- GPIO_DIG=DIG_CODE[15];
- Delay10ms(50);
- GPIO_DIG=0x00;
- }
- }
- }
- }
- void Delay10ms(unsigned int c)
- {
- unsigned char a,b;
- for(c;c>0;c--)
- for(b=38;b>0;b--)
- for(a=130;a>0;a--);
- }
- void Delay(unsigned int i)//延时19.3us
- {
- char j;
- for(i; i > 0; i--)
- for(j = 200; j > 0; j--);
- }
复制代码 |
|