按下k1时led灯由上至下流水点亮
按下k2时led灯由下至上流水点亮
按下k3时led灯高低4个led交替点亮
按下K4时led灯闪烁点亮
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源码:
- #include<reg51.h>
- #include<absacc.h>
- #define uchar unsigned char
- bit keyflag; // keyflag为按键按下的标志位
- uchar keyval; // keyval为键值
- uchar forwardtab[ ]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
- uchar backwardtab[ ]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
- uchar altertab[]={0x0f,0xf0};
- uchar blinktab[]={0x00,0xff};
- void delay10ms(void) //函数:软件消抖延时10ms
- { unsigned char i,j;
- for(i=0;i<100;i++)
- for(j=0;j<100;j++)
- ;
- }
- void led_delay(void) //函数:延时
- { unsigned char i,j;
- for(i=0;i<220;i++)
- for(j=0;j<220;j++)
- ;
- }
-
- void forward(void) //函数功能:正向流水点亮LED
- {
- unsigned char i,j;
- for(j=0;j<10;j++)
- { for (i=0;i<8;i++)
- {
- P0=forwardtab[i]; //LED0亮
- led_delay();
- }
- }
- P0=0xff;
- }
- void backward(void) //函数功能:反向流水点亮LED
- {
- unsigned char i,j;
- for(j=0;j<10;j++)
- { for (i=0;i<8;i++)
- {
- P0=backwardtab[i]; //LED0亮
- led_delay();
- }
- }
- P0=0xff;
- }
-
- void alter(void) //函数功能:反向流水点亮LED
- {
- unsigned char i,j;
- for(j=0;j<10;j++)
- { for (i=0;i<2;i++)
- {
- P0=altertab[i]; //LED0亮
- led_delay();
- }
- }
- P0=0xff;
- }
- void blink(void) //函数功能:反向流水点亮LED
- {
- unsigned char i,j;
- for(j=0;j<10;j++)
- { for (i=0;i<2;i++)
- {
- P0=blinktab[i]; //LED0亮
- led_delay();
- }
- }
- P0=0xff;
- }
- void main(void)
- {
- IE=0x81; //总中断允许EA=1,允许中断
- IT0=1; //跳边沿触发INT0
- keyflag=0; //设置按键按下标志为0
- do {
- P0=0x00; //全亮
- if(keyflag) //如果按键按下标志keyflag =1,则有键按下
- {
-
- keyval=~keyval; //键值取反
- switch(keyval) //根据按下键的键值进行分支跳转
- {
- case 1: forward(); //处理0号键
- break;
- case 2: backward(); //处理0号键
- break;
- case 4: alter(); //处理0号键
- break;
- case 8: blink(); //处理0号键
- break; }
- keyflag=0; //清按键按下标志
- }
- } while(1);
- }
-
-
- void int0( ) interrupt 0 //有键按下,则执行的中断函数
- {
- uchar reread_key; // reread_key为重读键值变量;
- IE=0x80; // 屏蔽中断
- keyflag=0; // 把按键按下标志keyflag清0
- P1=0xff; // 向P1口写1,设置P1口为输入
- keyval=P1; // 从P1口读入键盘的状态
- delay10ms(); // 延时10ms
- reread_key=P1; // 再次从P1口读键盘状态,并存reread_key中
- if(keyval==reread_key) // 比较两次读取的键值,如相同,说明键按下
- { keyflag=1; // 按键按下标志key_flag为1 }
- IE=0x81; // 重新允许中断
- }
- }
复制代码
全部资料51hei下载地址:
project512.zip
(58.87 KB, 下载次数: 55)
|