具体是怎么个不行法。
像你这种按键程序
因为单片机速度非常快,在你按一下按键时,单片机已经循环了很多次程序。
因此这样就会导致,当你按下时,其实k一直==0 一直在执行动作。
所以这种按键需要判断按键是第一次按下(由d起状态下按下)。而不是一直按着导致的动作。
方法:建一个变量保存上一次按键的值
char LastKey;LastKey = 1;
while(1)
{
if(k == 0 && LastKey == 1) //按下,且上一次检测按键时是d起状态
{ //这样才能保证每次按下时只执行一次,
//而不是一直在执行
Delay1ms(20);
if(k == 0) //确定是第一次按下,执行动作
{
if((n % 2) == 0)
{
LedFlash();
}
else
{
P0 = 0xFF;
}
n++;
}
}
LastKey = k; //保存按键状态
}
单片机的P10-P13接四个发光二极管L1-L4的阴极,P14-P17接四个开关K1-K4
程序:
ORG
00H
START:
MOV
A,P1
ANL
A,#0F0H
RR
A
RR
A
RR
A
RR
A
ORl
A,#0F0H
MOV
P1,A
SJMP
START
可以检测单个按键,也可以同时检测多个按键
过程:开始——读P1口数据到A——A中的数据右移4次——A中的内容和F0H相或——A中的数据送到P1口——回到开始
如果只检测回车,input就可以搞定:
如果还检测其他按键,可以用keyboard模块:
把‘\n’换成‘a’就能检测按键a。
第二问没看明白什么意思。
程序如下
#include<reg51h>
sbit led1=P10;
sbit key=P11;
sbit key1=P12;
sbit key2=P13;
void main()
{
while(1)
{
if((key|key1|key2)==0)
{led1=~led1;while((key|key1|key2)==0);
}
}
没试过 可能有些地方不对 你自己改改 反正思路就这样了
void keydown(void)
{
P1=0xF0;
if(P1!=0xF0) //判断按键是否按下 如果按钮按下 会拉低P1其中的一个端口
{
keyscan();
}
}
/52系列单片机,晶振12MHz,P10输出100Hz方波(即周期10ms),方波由T0定时器产生
P13接按键
K1,每按一次按键,方波占空比改变一次,依次为:1/10→2/10→……→9/10→1/10,如此循环/
#include"reg52h"
//包含52系列头文件
#define
uchar
unsigned
char
//定义
无符号字符型
#define
uint
unsigned
int
//定义
无符号整型
#define
TRUE
1
//定义
逻辑真
#define
FALSE
0
//定义
逻辑假
#define
th0
0xfc
//100Hz(10ms),占空比分母10,则其最小时间单位应该为10ms/10=1ms,故定时器T0定时时间为
1ms
#define
tl0
0x18
//1ms
at
12HMz
Fosc
#define
DutyDeno
10
//定义
占空比分母
为:10
sbit
WaveOut=P1^0;
//定义
方波输出
接口
sbit
Key1=P1^3;
//定义
按键Key1
接口
uchar
DutyNume=1;
//定义
占空比分子
变量,并初始化为
1(即
占空比
为:1/10)
void
Timer0()
interrupt
1
//定时器T0
中断
函数
{
static
uchar
duty_time=0;
//定义静态变量,作为
占空比
输出时间的参考值(1ms)
TL0=tl0;
TH0=th0;
//重赋定时器初值,1ms
duty_time=++duty_time%DutyDeno;
//该句等效于:duty_time++;duty_time%=DutyDeno;
if(duty_time
评论
0
0
0
加载更多
要求用51单片机做一个风扇温控检测系统,其功能大概就是:当温度达到设定值时候,风扇电机开始转动,以达到散热的目的,题目本身没有什么意思,有意思的是想要用尽可能少的元器件来完成这项工作,要求使用两个数码管,其他没说,所以我就加了3个按键,大体思路是这样的,开机以后,正常显示温度,按下SET键位时候,进温度设置,两个按键+和-设置数值。再按一次SET保存并退出。
最有意思的在于用了两个标志位,这两个标志位简直没把我绕晕。现在完成了,发出来大家一起看看,不在于代码多好,在于一种解决问题的方法。我把文件发上来了,大家一起学习交流。
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
TIM截图20181216211410jpg TIM截图20181216211656jpg TIM截图20181216211828jpg
单片机源程序如下:
代码:
#include "reg52h"
#include <intrinsh>
#define _Nop() _nop_() //定义空指令
/-----------------------------------------------
IO口定义
-----------------------------------------------/
sbit LED_R = P1^6; //红灯
sbit BEEP = P2^1; //蜂鸣器
sbit MOTOR = P2^2; //电机
sbit KEY_ADD = P2^5; //加
sbit KEY_DEC = P2^4; //减
sbit KEY_SET = P2^3; //确认
sbit ONE = P2^6; //个位位选
sbit TEN = P2^7; //十位位选
sbit DQ=P1^7; //DS18B20数据
sbit SDA=P1^1; //模拟I2C数据传送位
sbit SCL=P1^0; //模拟I2C时钟控制位
/-----------------------------------------------
定义变量
-----------------------------------------------/
unsigned char Set_Flag=0; //
unsigned char Set_Value=40; //设定值
unsigned char Tempature = 0; //温度
unsigned char num=40; //数字
unsigned char table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //数码管段选
unsigned char Data=0;
char Temp[12];
bit ack; //应答标志位
/-----------------------------------------------
延时函数
-----------------------------------------------/
void Delay_us(unsigned char t)
{
while(t--);
}
void Delay_ms(unsigned char t)
{
int i,j;
for(i=t;i>0;i--)
for(j=125;j>0;j--);
}
void delay_18B20(unsigned int i)//微秒级延时
{
while(i--);
}
/-----------------------------------------------
DS18B20初始化
-----------------------------------------------/
void ds1820rst(void) /ds1820复位/
{
unsigned char x=0;
DQ = 1; //DQ复位
delay_18B20(5); //延时
DQ = 0; //DQ拉低
delay_18B20(100); //精确延时大于480us
DQ = 1; //拉高
delay_18B20(40);
}
unsigned char ds1820rd(void)//从18b20读取数据
{
unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; //给脉冲信号
dat>>=1;
DQ = 1; //给脉冲信号
if(DQ) dat|=0x80;
delay_18B20(10);
}
return(dat);
}
void ds1820wr(unsigned char wdata)/写数据/
{
unsigned char i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = wdata&0x01;
delay_18B20(25);
DQ = 1;
wdata>>=1;
}
}
//读取DS18B20温度值
//入口参数:无
//返回值:温度值
unsigned int read_18b20(void)/读取温度值并转换/
{
unsigned char a,b;
unsigned char tem;
ds1820rst();
ds1820wr(0xcc);//跳过读序列号/
ds1820wr(0x44);//启动温度转换/
ds1820rst();
ds1820wr(0xcc);//跳过读序列号/
ds1820wr(0xbe);//读取温度/
a=ds1820rd();
b=ds1820rd();
tem=((b<<4)|(a>>4)); //将高低字节组合成字
//Delay_ms(50);
return tem; //完成温度转换
}
/-----------------------------------------------
数码管
-----------------------------------------------/
//共阴数码管
//动态扫描
void display(unsigned char Data)
{
//P3 = 0;
ONE = 1; //打开个位位选
TEN = 0;
P3 = table[Data/10];//送个位
Delay_ms(5);//延时
P3 = 0; //防止重影
//Delay_us(5);
TEN = 1;
ONE = 0;
P3 = table[Data%10];
Delay_ms(5);
P3 = 0;
//Delay_us(5);
}
/-----------------------------------------------
按键处理函数
-----------------------------------------------/
char S_F=0;
unsigned char Key_Value(void)
{
if(!KEY_ADD || !KEY_DEC||!KEY_SET) // 检测是否有任意按键按下
{
Delay_ms(20);
Set_Flag = 1; //切换到显示设置值
if(!KEY_ADD) //如果检测到低电平,说明按键按下
{
Delay_ms(10); //延时去抖,一般10-20ms
if(!KEY_ADD) //再次确认按键是否按下,没有按下则退出
{
while(!KEY_ADD);//如果确认按下按键等待按键释放,没有释放则一直等待
{
if(num<99) //加 *** 作
num++;
}
}
}
if(!KEY_DEC) //如果检测到低电平,说明按键按下
{
Delay_ms(10); //延时去抖,一般10-20ms
if(!KEY_DEC) //再次确认按键是否按下,没有按下则退出
{
while(!KEY_DEC);//如果确认按下按键等待按键释放,没有释放则一直等待
{
if(num>0) //减 *** 作
num--;
}
}
}
if(!KEY_SET) //如果检测到低电平,说明按键按下
{
Delay_ms(10); //延时去抖,一般10-20ms
if(!KEY_SET) //再次确认按键是否按下,没有按下则退出
{
//Set_Flag = 0;
while(!KEY_SET);//如果确认按下按键等待按键释放,没有释放则一直等待
{
//将当前值作为设定值
//Set_Flag = 0; //切换到显示温度值
}
if(S_F)
Set_Flag=0;
}
}
}
Set_Value = num;
return (num);
}
/-----------------------------------------------
24C02初始化
-----------------------------------------------/
/------------------------------------------------
启动总线
------------------------------------------------/
void Start_I2c()
{
SDA=1; //发送起始条件的数据信号
_Nop();
SCL=1;
_Nop(); //起始条件建立时间大于47us,延时
_Nop();
_Nop();
_Nop();
_Nop();
SDA=0; //发送起始信号
_Nop(); //起始条件锁定时间大于4μ
_Nop();
_Nop();
_Nop();
_Nop();
SCL=0; //钳住I2C总线,准备发送或接收数据
_Nop();
_Nop();
}
/------------------------------------------------
结束总线
------------------------------------------------/
void Stop_I2c()
{
SDA=0; //发送结束条件的数据信号
_Nop(); //发送结束条件的时钟信号
SCL=1; //结束条件建立时间大于4μ
_Nop();
_Nop();
_Nop();
_Nop();
_Nop();
SDA=1; //发送I2C总线结束信号
_Nop();
_Nop();
_Nop();
_Nop();
}
以上就是关于想用c语言写一个按键控制小灯闪烁的程序,就是按一下闪烁,再按就熄灭全部的内容,包括:想用c语言写一个按键控制小灯闪烁的程序,就是按一下闪烁,再按就熄灭、按键控制led灯的程序、python如何用按键控制程序开始等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)