标题:
3种按键实现不同功能的单片机源程序
[打印本页]
作者:
初学者小乐
时间:
2019-7-19 17:27
标题:
3种按键实现不同功能的单片机源程序
此程序为本人以前刚学时候编写的,还存在许多未经优化的地方,也没有多少注释,请多担待。
功能如下:
1、按下k1,流水灯闪烁。
2、按下k2,开始从20开始计时。
3、按下k3,停止计时,开始累加。
[W8WPN[Q62QXM5XMT3[34.png
(102.03 KB, 下载次数: 36)
下载附件
2019-7-19 17:27 上传
以下为部分程序:
#include "reg52.h"
#include "intrins.h"
#define led P1 //定义LED
sbit k1=P0^0;
sbit k2=P0^1;
sbit k3=P0^2 ; //定义按键
char code smguan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //数字定义
#define num1 P2
#define num2 P3//定义数码管管脚
int a=0,b=2;
int c=0;d=2;
void delay(int i)
{
while(i--);
}
void delay800ms() //误差 0us
{
unsigned char a,b,c;
for(c=95;c>0;c--)
for(b=138;b>0;b--)
for(a=29;a>0;a--);
_nop_(); //if Keil,require use intrins.h
_nop_(); //if Keil,require use intrins.h
}
void twinkle()
{
if(k1==1) //检测按键K1是否按下
{
delay(1000); //消除抖动 一般大约10ms
if(k1==1) //再次判断按键是否按下
{
while(1)
{led=0xaa;
delay(50000);
led=~led; //led状态取反
delay(50000);
if((k2==1)||(k3==1))break;
}
}
}
}
void Timer1Init()
{
TMOD|=0X10;//选择为定时器1模式,工作方式1,仅用TR1打开启动。
TH1=0XFC; //给定时器赋初值,定时1ms
TL1=0X18;
ET1=1;//打开定时器1中断允许
EA=1;//打开总中断
TR1=1;//打开定时器
}
void time()
{
if(k2==1) //检测按键K2是否按下
{
delay(1000); //消除抖动 一般大约10ms
if(k2==1) //再次判断按键是否按下
{
Timer1Init(); //定时器1初始化
}
}
}
void Timer1() interrupt 3
{
static int i;
TH1=0XFC; //给定时器赋初值,定时1ms
TL1=0X18;
i++;
if(i==1000)
{
i=0;
num2=smguan[a++];
num1=smguan[b];
if(a==10)
{
a=0;
if(b==5)
{
b=2;
}
else b++;
}
}
if((k1==1)||(k3==1))TR1=0;
}
void Timer0Init()
{
TMOD|=0X01;//选择为定时器0模式,工作方式1,仅用TR0打开启动。
TH0=0XFC; //给定时器赋初值,定时1ms
TL0=0X18;
ET0=1;//打开定时器0中断允许
EA=1;//打开总中断
TR0=1;//打开定时器
}
void leijia()
{
while(1){
if(k3==1) //检测按键K1是否按下
{
delay(80); //消除抖动 一般大约10ms
if(k3==1) //再次判断按键是否按下
{ num2=smguan[c];
num1=smguan[d];
c=c+1;
if(c==10)
{
c=0;
if(d==5)
{
d=2;
}
else d=d+1;
}
}
}delay(20000);
if((k1==1)||(k2==1)){c=0;d=2;break;}
}
}
void main()
{
while(1)
{
twinkle();
time();
leijia();
}
}
复制代码
新建 Microsoft Word 文档.docx
(15.15 KB, 下载次数: 5)
2019-7-19 17:27 上传
点击文件名下载附件
下载积分: 黑币 -5
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1