(四)开关控制的 跑马灯 以及流水灯 电路图以及程序
电路图:
目的:
K1 开始跑马灯 左->右
K2 停止
K3 跑马灯 右-> 左
K4 流水灯
参考程序:
#include<reg52.h> #include<intrins.h> #define uchar8 unsigned char #define uint16 unsigned int #define LED P1 sbit key1=P2^0; sbit key2=P2^1; sbit key3=P2^2; sbit key4=P2^3; /*****************************/ // 函数名称: DelayMS( ) // 函数功能: 延时 // 入口函数: 延时毫秒 // 出口函数: 无 /************************* *******************/ void DelayMs(uint16 val) { uint16 i,j; for( i=0;i<val;i++) for(j=0;j<113;j++); } /****************************/ // 函数名称: keyscan( ) // 函数功能: 检测按键 // 入口函数: 无 // 出口函数: keyscan_num /*****************************/ uchar8 keyscan() { uchar8 keyscan_num,temp; P2=0xff; // 置电平 temp=P2; // 读P2口电平,送入 temp 中(因为这时候可能改变按键了) // if(~(temp&0xff)) 不会用,先不看,用下面的 if(temp!=0xff) // 说明有键按下 { if(key1==0) { keyscan_num=1; } else if(key2==0) { keyscan_num=2; } else if(key3==0) { keyscan_num=3; } else if(key4==0) { keyscan_num=4; } else { keyscan_num=2; } } return keyscan_num; } void main() { uchar8 key_num , temp , i ; while(1) { key_num = keyscan(); // 将按键扫描的键值送入 key_num 中 switch(key_num) { case 1: goto function0; case 2: goto function1; case 3: goto function2; case 4: goto function3; default: break ; } function0: // 跑马灯 从左向右走 temp=0x01; // 0000 0001 for(i=0;i<8;i++) { LED= ~temp; DelayMs(1000); temp=temp<<1; } key_num = keyscan(); // 将按键扫描的键值送入 key_num 中 switch(key_num) { case 1: goto function0; case 2: goto function1; case 3: goto function2; case 4: goto function3; default: goto function0; break ; } function1: //停止 LED=0xff; key_num = keyscan(); // 将按键扫描的键值送入 key_num 中 switch(key_num) { case 1: goto function0; case 2: goto function1; case 3: goto function2; case 4: goto function3; default: goto function1; break ; } function2: // 从右向左 temp=0x80; // 1000 0000 for(i=0;i<8;i++) { LED= ~temp; DelayMs(1000); temp=temp>>1; } key_num = keyscan(); // 将按键扫描的键值送入 key_num 中 switch(key_num) { case 1: goto function0; case 2: goto function1; case 3: goto function2; case 4: goto function3; default: goto function2; break ; } function3: // 流水灯 LED=0xff ; // 这里端口全被设置为 1111 1111 ,相当于 全灭 for(i=0;i<8;i++) { LED=LED<<1; // 选择了左移循环 DelayMs(1000); } key_num = keyscan(); // 将按键扫描的键值送入 key_num 中 switch(key_num) { case 1: goto function0; case 2: goto function1; case 3: goto function2; case 4: goto function3; default: goto function3; break ; } } }
分析以及相关疑点:
1、按键按下,是遵循实验现象了,但是不太好,按其他键不能立即响应,当然我们不要求
2、实际用弹性开关,比较好,具体自己体会,一按下松开对程序没影响,