微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 51单片机 独立键盘控制

51单片机 独立键盘控制

时间:11-25 来源:互联网 点击:
键盘部分原理图:



历程里面设计到数码管,这个参考前面的文章《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() interrupt 1
{
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;
}
}
}

以上,结束。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top