新闻中心

EEPW首页>嵌入式系统>设计应用> 51单片机 独立键盘控制

51单片机 独立键盘控制

作者: 时间:2016-11-25 来源:网络 收藏
键盘部分原理图:



本文引用地址://m.amcfsurvey.com/article/201611/321310.htm

历程里面设计到数码管,这个参考前面的文章《51单片机 数码显示数字》。

代码如下:注释很详细。

//按键key1显示数字加1,按键key2显示数字减1,按键key3清零,按键key4数字每秒加1.
#include//头文件
#define uint unsigned int//宏定义
#define uchar unsigned char
//按键标示声明
sbit key1=P3^4;
sbit key2=P3^5;
sbit key3=P3^6;
sbit key4=P3^7;
sbit duanxuan=P2^6;
sbit weixuan=P2^7;

uint number;//需要显示的数字
uint time_number; //T0计时器方式一计满次数

void delay(uint);//延时函数声明
void init();//T0定时器中断初始化函数声明
void display(uint);//显示函数声明
void keyscan();//按键检测函数声明

uchar code table[]={//字符断码
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};//C语言编码定义

void main()//主函数入口
{
init();//T0定时器方式一中断初始化
while(1)
{
display(number);//显示函数
keyscan();//键盘扫描函数
}
}
//延时函数主体
void delay(uint s)
{
uint i,j;
for(i=s;i>0;i--)
{
for(j=110;j>0;j--)
{

}
}
}
//定时器T0方式一中断初始化函数主体
void init()
{
TMOD=0x11;//TMOD赋值,确定T0/T1工作方式
TH0=(65536-46080)/256;//TH0/TL0;TH1/TL1计算初值
TL0=(65536-46080)%6;
EA=1;//总中断打开
ET0=1;//开T0/T1中断
//TR0=1;//TR0/TR1置位,启动定时器(本程序当key4按下之后TR=1)
}
//显示函数主体
void display(uint number0)
{
uint no1,no2,no3,no4,no5;
no1=number0/10000;
no2=number0000/1000;
no3=number000/100;
no4=number00/10;
no5=number0;
//数码管1显示①送断码;②选择要显示数码管
duanxuan=1;//打开段选锁存器
P0=table[no1];//送断码
duanxuan=0;//关闭(锁住)锁存器
P0=0xff;//必不可少的清屏
weixuan=1;//打开位选锁存器
P0=0xfe;//选择数码管
weixuan=0;//关闭锁存器
delay(2);//延时
//数码管2显示
duanxuan=1;
P0=table[no2];
duanxuan=0;
P0=0xff;
weixuan=1;
P0=0xfd;
weixuan=0;
delay(2);
//数码管3显示
duanxuan=1;
P0=table[no3];
duanxuan=0;
P0=0xff;
weixuan=1;
P0=0xfb;
weixuan=0;
delay(2);
//数码管4显示
duanxuan=1;
P0=table[no4];
duanxuan=0;
P0=0xff;
weixuan=1;
P0=0xf7;
weixuan=0;
delay(2);
//数码管5显示
duanxuan=1;
P0=table[no5];
duanxuan=0;
P0=0xff;
weixuan=1;
P0=0xef;
weixuan=0;
delay(2);
}
void keyscan() //按键检测函数主体
{
if(key1==0)//检测key1按下
{
delay(10); //延时10us
if(key1==0)//检测键盘依然是按下的
{
number++;//显示数字加1
if(number==10000)//如果记满10000
{
number=0;//清零重新开始
}
while(!key1); //等待按键放下
}
}
if(key2==0)
{
delay(10);
if(key2==0)
{
number--;
if(number==0)
{
number=10000;
}
while(!key2);
}
}
if(key3==0)
{
delay(10);
if(key3==0)
{
number=0;
while(!key3);
}
}
if(key4==0)
{
delay(10);
if(key4==0)
{
while(!key4);
TR0=~TR0;
}
}
}
//T0定时器方式一中断服务函数主体
void R0_Time_no1()interrupt1
{
TH0=(65536-46080)/256;//预装值
TL0=(65536-56080)%6;
time_number++;//记满次数
if(time_number==20)//20次为1s
{
time_number=0;
number++;
if(number==10000)
{
number=0;
}
}
}

以上,结束。



评论


技术专区

关闭