赞
踩
利用普中单片机的代码实现在按下第k个独立按键时,直流电机运作k秒
-
- #include "reg52.h"
-
- typedef unsigned int u16; //对系统默认数据类型进行重定义
- typedef unsigned char u8;
- sbit DC_Motor=P1^0;
- //定义独立按键控制脚
- sbit KEY1=P3^1;
- sbit KEY2=P3^0;
- sbit KEY3=P3^2;
- sbit KEY4=P3^3;
-
- //使用宏定义独立按键按下的键值
- #define KEY1_PRESS 1
- #define KEY2_PRESS 2
- #define KEY3_PRESS 3
- #define KEY4_PRESS 4
- #define KEY_UNPRESS 0
-
- void delay_10us(u16 ten_us)
- {
- while(ten_us--);
- }
- /*delay for 10ms*/
- void delay_ms(u16 ms)
- {
- u16 i,j;
- for(i=ms;i>0;i--)
- for(j=110;j>0;j--);
- }
-
- /*******************************************************************************
- * 函 数 名 : key_scan
- * 函数功能 : 检测独立按键是否按下,按下则返回对应键值
- * 输 入 : mode=0:单次扫描按键
- mode=1:连续扫描按键
- * 输 出 : KEY1_PRESS:K1按下
- KEY2_PRESS:K2按下
- KEY3_PRESS:K3按下
- KEY4_PRESS:K4按下
- KEY_UNPRESS:未有按键按下
- *******************************************************************************/
- u8 key_scan(u8 mode)
- {
- static u8 key=1;
-
- if(mode)key=1;//连续扫描按键
- if(key==1&&(KEY1==0||KEY2==0||KEY3==0||KEY4==0))//任意按键按下
- {
- delay_10us(1000);//消抖
- key=0;
- if(KEY1==0)
- return KEY1_PRESS;
- else if(KEY2==0)
- return KEY2_PRESS;
- else if(KEY3==0)
- return KEY3_PRESS;
- else if(KEY4==0)
- return KEY4_PRESS;
- }
- else if(KEY1==1&&KEY2==1&&KEY3==1&&KEY4==1) //无按键按下
- {
- key=1;
- }
- return KEY_UNPRESS;
- }
-
- void main()
- {
- u8 key=0;
- DC_Motor=0;
- while(1)
- {
- key=key_scan(0);
- if(key!=0){
- DC_Motor=1;//改变5V对应管脚的值
- delay_ms(key*1000);//延时key秒
- DC_Motor=0;
- }
-
- }
- }
使用4*4键盘控制,第一个到第15按键分别对应数码管显示1到F,计划在按下第16的按键时电动机运转数码管显示的秒数,代码如下
-
- #include "reg52.h"
-
- typedef unsigned int u16;
- typedef unsigned char u8;
-
- #define KEY_MATRIX_PORT P1 //使用宏定义矩阵按键控制口
- //定义直流电机控制管脚
- sbit DC_Motor=P2^0;
- #define SMG_A_DP_PORT P0 //使用宏定义数码管段码口
-
- u8 gsmg_code[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
- 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
- void delay_10us(u16 ten_us)
- {
- while(ten_us--);
- }
- void delay_ms(u16 ms)
- {
- u16 i,j;
- for(i=ms;i>0;i--)
- for(j=110;j>0;j--);
- }
- /*******************************************************************************
- * 函数功能 : 使用行列式扫描方法,检测矩阵按键是否按下,按下则返回对应键值
- * 输 出 : key_value:1-16,对应S1-S16键,
- 0:按键未按下
- *******************************************************************************/
- u8 key_matrix_ranks_scan(void)
- {
- u8 key_value=0;
-
- KEY_MATRIX_PORT=0xf7;//给第一列赋值0,其余全为1
- if(KEY_MATRIX_PORT!=0xf7)//判断第一列按键是否按下
- {
- delay_10us(1000);//消抖
- switch(KEY_MATRIX_PORT)//保存第一列按键按下后的键值
- {
- case 0x77: key_value=1;break;
- case 0xb7: key_value=5;break;
- case 0xd7: key_value=9;break;
- case 0xe7: key_value=13;break;
- }
- }
- while(KEY_MATRIX_PORT!=0xf7);//等待按键松开
-
- KEY_MATRIX_PORT=0xfb;//给第二列赋值0,其余全为1
- if(KEY_MATRIX_PORT!=0xfb)//判断第二列按键是否按下
- {
- delay_10us(1000);//消抖
- switch(KEY_MATRIX_PORT)//保存第二列按键按下后的键值
- {
- case 0x7b: key_value=2;break;
- case 0xbb: key_value=6;break;
- case 0xdb: key_value=10;break;
- case 0xeb: key_value=14;break;
- }
- }
- while(KEY_MATRIX_PORT!=0xfb);//等待按键松开
-
- KEY_MATRIX_PORT=0xfd;//给第三列赋值0,其余全为1
- if(KEY_MATRIX_PORT!=0xfd)//判断第三列按键是否按下
- {
- delay_10us(1000);//消抖
- switch(KEY_MATRIX_PORT)//保存第三列按键按下后的键值
- {
- case 0x7d: key_value=3;break;
- case 0xbd: key_value=7;break;
- case 0xdd: key_value=11;break;
- case 0xed: key_value=15;break;
- }
- }
- while(KEY_MATRIX_PORT!=0xfd);//等待按键松开
-
- KEY_MATRIX_PORT=0xfe;//给第四列赋值0,其余全为1
- if(KEY_MATRIX_PORT!=0xfe)//判断第四列按键是否按下
- {
- delay_10us(1000);//消抖
- switch(KEY_MATRIX_PORT)//保存第四列按键按下后的键值
- {
- case 0x7e: key_value=4;break;
- case 0xbe: key_value=8;break;
- case 0xde: key_value=12;break;
- case 0xee: key_value=16;break;
- }
- }
- while(KEY_MATRIX_PORT!=0xfe);//等待按键松开
-
- return key_value;
- }
-
- void main()
- {
- u8 key=0;
- u8 key1=0;
- DC_Motor=0;
- while(1)
- {
- key=key_matrix_ranks_scan();
- if(key!=0){
- if(key==16){
- DC_Motor=1;//开启电机
- delay_ms(key1*1000); //延迟k1秒
- DC_Motor=0;//关闭电机
- }
- else{
- SMG_A_DP_PORT=gsmg_code[key];//得到的按键值减1换算成数组下标对应1-F段码
- key1=key;//给key1赋值
- }
- }
-
- }
- }
不过在未按下按键时,电动机仍然有一定的运转,而且在按下前15个按键的瞬间电动机仍要加速转动,猜想是矩阵键盘的扫描与电机共用一个IO口,互相影响了电平。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。