2017年11月22日
按键程序
#include <reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit we = P2^7;
sbit du = P2^6;
sbit S4 = P3^2;
sbit S5 = P3^3;
//uchar ledflow = 0x7f;
uchar counter,time_counter;
uchar code leddata[]={
0x3F, //"0"
0x06, //"1"
0x5B, //"2"
0x4F, //"3"
0x66, //"4"
0x6D, //"5"
0x7D, //"6"
0x07, //"7"
0x7F, //"8"
0x6F, //"9"
0x77, //"A"
0x7C, //"B"
0x39, //"C"
0x5E, //"D"
0x79, //"E"
0x71, //"F"
0x76, //"H"
0x38, //"L"
0x37, //"n"
0x3E, //"u"
0x73, //"P"
0x5C, //"o"
0x40, //"-"
0x00, //熄灭
0x00 //自定义
};
void delay(uint z)
{
uint x,y;
for(x = z;x > 0;x --)
for(y =112;y > 0;y --);
}
延时函数,前面有说过
void display(uchar i)
{
uchar shi,ge;
shi = i/10;
ge = i%10;
定义shi,ge两个函数为无符号字符型数据
取商为十位, 取余为个位
P0 = 0xff;
P0口初始化
we = 1;
打开位选
P0 = 0xbf;
送入位选数据,也就是你想让八组中的哪一组数码管亮
we = 0;
关闭位选
P0 = 0xff;
P0口初始化防止数码管余晖
du = 1;
打开段选
P0 = leddata[shi];
将上面的leddata[]数组中包括的数字送入段选,shi实际上只是自己定义的数组名称不代表什么
du = 0;
关闭段选
delay(1);
一小段延时
P0 = 0xff;
we = 1;
打开位选
P0 = 0x7f;
送入位选数据,0x7f转二进制是01111111相当于最后一位亮
we = 0;
关闭位选
P0 = 0xff;
P1口初始化
du = 1;
打开段选
P0 = leddata[ge];
送入个位的数据
du = 0;
关闭段选
delay(1);
小延时
}
void main()
主函数开始
{
while(1)
一直运行检测小按键子程序
{
display(time_counter);
显示函数time_counter,用于显示数字
if(S4 == 0)
检测按键是否按下
{
delay(50);
软件去抖动延时
if(S4 == 0)
再次检测按键是否按下
{
time_counter ++;
如果检测到按下那么time_counter函数加1
while(!S4);
等待按键松开,相当于S4等于1这样检测按键是否按下的程序将不成立显示的数字保持不变
如果这里为!0相当于一直按着S4键程序就会停在0上相当于一个死循环
如果这里为!1相当于没有检测按键松开的程序,它会像秒表的毫秒计数一般直到你松开按键
}
}
if(S5 == 0)
检测按键是否按下
{
delay(50);
软件去抖动延时
if(S5 ==0 && time_counter !=0)
检测按键是否按下并且time_counter函数不为零
{
time_counter --;
如果条件成立那么time_counter函数自减1
while(!S5);
检测S5按键是否松开
}
}
}
}