㈠ 51单片机4*5键盘程序。
if( INT_0 != 0 ) //再次判断是否有键按下
{
EA=0;
scan_key();
delay(50);
INT_0 =judge_hitkey();
while( INT_0 !=1); //等待按键释放
EA=1;
}
在EA=0;这句前,有无加上了,重新把 INT_0 =judge_hitkey(); 再赋回来了?,,我在郭天祥的板子上调试不行; EXITE.C(93): warning C206: 'manage_key1': missing function-prototype;
这是我花两个多小时写得51单片机,矩阵键盘的显示,希望能对你有帮助;
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
sbit la=P2^6;
sbit wela=P2^7;
void init();
void display(uchar);
uchar keyscan();
uchar temp,num; //键盘扫描
void delay(uint xms) //延时子函数
{
int i,j;
for(i=xms;i>0;i--) //延时xms毫秒
for(j=110;j>0;j--);
}
void main()
{
init();
while(1)
{
keyscan();//不断扫描键盘;
display(num);
}
}
void init()
{
num=0xff; //控制让程序开始时不出现乱码;
wela=1;
P0=0xc0; //打开数码管显示,静态显示;
wela=0;
}
uchar keyscan()
{
P3=0xfe;
temp=P3;
temp=temp&0xf0;//按位与,只能用&;
if(temp!=0xf0) //在用while语句时,一定要加上去抖动,否则程序会停不下来的哦;
{ //还是统一用if语句吧,只有在去抖动才一定要用if语句;
delay(5); //至于中括号加在那都无所谓啦;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xee:num=1;
break;
case 0xde:num=2;
break;
case 0xbe:num=3;
break;
case 0x7e:num=4;
break;
}
while (temp!=0xf0) //去抖动只能用while ,只有松开手才会执行下面的,才会有数码显;
{ ////一松开手,就相当于把P3口的电平改变了;所以去抖不能在switch前
temp=P3;
temp=temp&0xf0; //不能不要,只有松开手,才会退出这个循环;
}
}
}
P3=0xfd;
temp=P3;
temp=temp&0xf0;//按位与,只能用&;
if(temp!=0xf0)
{
delay(5);
if(temp!=0xf0)
{
temp=P3;
// temp=temp&0xf0; //该句子一定不能要,因为下面判断的,只是P3口的电平状态而已;
}
switch(temp)
{ case 0xed: num=5; break;
case 0xdd: num=6; break;
case 0xbd: num=7; break;
case 0x7d: num=8; break;
}
}
while (temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
P3=0xfb;
temp=P3;
temp=temp&0xf0;//按位与,只能用&;
if(temp!=0xf0)
{
delay(5);
if(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
}
if(temp!=0xf0)
{
temp=P3;
// temp=temp&0xf0;
}
switch(temp)
{ case 0xeb: num=9; break;
case 0xdb: num=10; break;
case 0xbb: num=11; break;
case 0x7b: num=12; break;
}
while (temp!=0xf0) //去抖动只能用while ,只有松开手才会执行下面的,才会有数码显;
{ ////一松开手,就相当于把P3口的电平改变了;所以去抖不能在switch前
temp=P3;
temp=temp&0xf0; //不能不要,只有松开手,才会退出这个循环;
}
P3=0xf7;
temp=P3;
temp=temp&0xf0;//按位与,只能用&;
if(temp!=0xf0)
{
delay(5);
if(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
}
if(temp!=0xf0) //该句子不能用while语句,因为如果用while语句,如果松手了,P3的电平就改变了,temp的值也会改变的。
//因此建议,非必要,还是用if语句;
{
temp=P3;
// temp=temp&0xf0;
}
switch(temp)
{ case 0xe7: num=13; break;
case 0xd7: num=14; break;
case 0xb7: num=15; break;
case 0x77: num=16; break;
}
while (temp!=0xf0) //去抖动只能用while ,只有松开手才会执行下面的,才会有数码显;
{ ////一松开手,就相当于把P3口的电平改变了;所以去抖不能在switch前
temp=P3;
temp=temp&0xf0; //不能不要,只有松开手,才会退出这个循环;
}
return num;
}
void display(uchar num)
{
P0=table[num-1];
la=1;
la=0;
}
下面的是郭天祥老师写的
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit la=P2^6;
sbit wela=P2^7;
sbit key1=P3^4;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,0};
uchar num,temp,num1;
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
uchar keyscan();
void display(uchar aa);
void main()
{
num=17;
la=1;
P0=0;
la=0;
wela=1;
P0=0xc0;
wela=0;
while(1)
{
display(keyscan());
}
}
void display(uchar aa)
{
la=1;
P0=table[aa-1];
la=0;
}
uchar keyscan()
{
P3=0xfe;
temp=P3;
temp=temp&0xf0;
while(temp!=0xf0)
{
delay(5);
temp=P3;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xee:num=1;
break;
case 0xde:num=2;
break;
case 0xbe:num=3;
break;
case 0x7e:num=4;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
}
}
P3=0xfd;
temp=P3;
temp=temp&0xf0;
while(temp!=0xf0)
{
delay(5);
temp=P3;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xed:num=5;
break;
case 0xdd:num=6;
break;
case 0xbd:num=7;
break;
case 0x7d:num=8;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
}
}
P3=0xfb;
temp=P3;
temp=temp&0xf0;
while(temp!=0xf0)
{
delay(5);
temp=P3;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xeb:num=9;
break;
case 0xdb:num=10;
break;
case 0xbb:num=11;
break;
case 0x7b:num=12;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
}
}
P3=0xf7;
temp=P3;
temp=temp&0xf0;
while(temp!=0xf0)
{
delay(5);
temp=P3;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xe7:num=13;
break;
case 0xd7:num=14;
break;
case 0xb7:num=15;
break;
case 0x77:num=16;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
}
}
return num;
}
㈡ 51单片机怎样用键盘控制数码管显示
51单片机怎样用键盘控制数码管显示的方法。
如下参考:
1.首先,编写代码并点亮数码管。
㈢ 51单片机3键键盘电路图[只有三个按键,链接pc的]
同学你好,我来帮你,你可以使用串口啊,比如:1:给你一个从PC发给单片机数据后,单片机再原样发给PC的参考代码:2:将51某一个(引脚)按键0,1状态,发给PC;
1::::::::::::::
#include <REG52.H>
bit Flag;
unsigned int R_D,S_D;
unsigned char i;
void usart_init(void); ///串口初始化
void main (void) {
usart_init(void); ///串口初始化
while(1)
{
if (Flag==1)
{
SBUF = S_D; //SUBF接受/发送缓冲器(又叫串行通信特殊功能寄存器)
while(!TI);// 等特数据传送(TI发送中断标志)
TI = 0;// 清除数据传送标志
Flag=0;
}
}
}
}
void ser_int (void) interrupt 4 using 1
{
if(RI == 1) //RI接受中断标志
{
RI = 0; //清除RI接受中断标志
R_D = SBUF; //SUBF接受/发送缓冲器
S_D=R_D;///////返回PC发送
Flag=1;
}
}
void usart_init(void)///串口初始化
{
SCON = 0x50; //REN=1允许串行接受状态,串口工作模式1
TMOD|= 0x20; //定时器工作方式2
PCON|= 0x80;
TH1 = 0xF3;// //baud*2 /* 波特率4800、数据位8、停止位1。效验位无 (12M)
TL1 = 0xF3;
TR1 = 1;
ES = 1; //开串口中断
EA = 1; // 开总中断
}
2:::::::::::::
#include <REG52.H>
sbit p34=P3^4;////////定义一个按键
bit Flag=1;
unsigned int S_D;
unsigned char i;
void usart_init(void); ///串口初始化
void delay (unsigned int Z) ; //延时程序 Z倍 MS
void key_p34(void) ; /////按键检
void main (void) {
usart_init(void); ///串口初始化
key_p34(void) ; ////上电后检测一次按键的状态
if (Flag==1)//上电后发送一次按键的状态
{
SBUF =1; //SUBF接受/发送缓冲器(又叫串行通信特殊功能寄存器)
while(!TI);// 等特数据传送(TI发送中断标志)
TI = 0;// 清除数据传送标志
}
else
{
SBUF =0; //SUBF接受/发送缓冲器(又叫串行通信特殊功能寄存器)
while(!TI);// 等特数据传送(TI发送中断标志)
TI = 0;// 清除数据传送标志
}
while(1)
{
key_p34(void) ;
if (Flag==1)
{
SBUF =1; //SUBF接受/发送缓冲器(又叫串行通信特殊功能寄存器)
while(!TI);// 等特数据传送(TI发送中断标志)
TI = 0;// 清除数据传送标志
}
else
{
SBUF =0; //SUBF接受/发送缓冲器(又叫串行通信特殊功能寄存器)
while(!TI);// 等特数据传送(TI发送中断标志)
TI = 0;// 清除数据传送标志
}
}
}
void usart_init(void)///串口初始化
{
SCON = 0x50; //REN=1允许串行接受状态,串口工作模式1
TMOD|= 0x20; //定时器工作方式2
PCON|= 0x80;
TH1 = 0xF3;// //baud*2 /* 波特率4800、数据位8、停止位1。效验位无 (12M)
TL1 = 0xF3;
TR1 = 1;
ES = 1; //开串口中断
EA = 1; // 开总中断
}
void delay (unsigned int Z)//延时程序 Z倍 MS
{
unsigned int x,y;
for(x=Z;x>0;x--)
for(y=110;y>0;y--) ;
}
void key_p34(void) /////按键检测
{
if(p34==0)
{ delay(10);
if(p34==0)
{
while(!p34) ;/////等待按键松手
Flag=0;
}
}
}
㈣ 51单片机键盘接口电路的计算器的实现的毕业设计及开题报告
51单片机计算器的设计(开题报告实物论文)
目 录
1.课程设计的目的………………………………………………3
2.课程设计题目描述和要求……………………………………3
3.单片机发展简史………………………………………………4
4.MCS-51单片机系统简介………………………………………6
5.MCS-51单片机内部定时器/计数器简介……………………7
6.理论设计………………………………………………………8
7.主要电路分析…………………………………………………8
8.硬件设计………………………………………………………10
9.软件设计………………………………………………………11
10.程序代码……………………………………………………12
11.设计总结……………………………………………………18
12.参考文献……………………………………………………20
随着社会的发展,科学的进步,人们的生活水平在逐步的提高,尤其是微电子技术的发展,犹如雨后春笋般的变化。电子产品的更新速度快就不足惊奇了。
计算器在人们的日常中是比较的常见的电子产品之一。可是它还在发展之中,以后必将出现功能更加强大的计算器,基于这样的理念,本次设计是用单片机来设计的四位数计算器。该设计系统是以AT89S51为单片机, P3口作为输入端,外接4X4的键盘,通过键盘扫描来对输入数的控制,在P1口,P2口接了驱动电路。用来保证LED的工作正常。计算器将完成的功能有加,减,乘,除等功能。
功能:
完成0~9999整数的一次加/减/乘/除运算,
减法运算结果可以实现计算结果的负数显示,
除法运算结果为0~999并保留两位小数,
按键音,
设有清零键,
首位零不显示,
其它的显示"E"
按键排布为:
清零/确认/除/乘
减/加/9/8
7/6/5/4
3/2/1/0
㈤ 51单片机的4*4键盘输入的编程
呵呵,自己写的,可以根据你的引脚排布自己做适当修改,希望对你有帮助
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
uchar code num[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
void delay(uint z);
main()
{
while(1)
{
P1=0xfe;
if(P1==0xee||P1==0xde||P1==0xbe||P1==0x7e)
delay(5);
if(P1==0xee||P1==0xde||P1==0xbe||P1==0x7e)
{
switch(P1)
{
case 0xee: P0=num[1]; break;
case 0xde: P0=num[2] ;break;
case 0xbe: P0= num[3];break;
case 0x7e: P0=num[4] ;break;
}
}
P1=0xfd;
if(P1==0xed||P1==0xdd||P1==0xbd||P1==0x7d)
delay(5);
if(P1==0xed||P1==0xdd||P1==0xbd||P1==0x7d)
{
switch(P1)
{
case 0xed: P0=num[5]; break;
case 0xdd: P0=num[6] ;break;
case 0xbd: P0= num[7];break;
case 0x7d: P0=num[8] ;break;
}
}
P1=0xfb;
if(P1==0xeb||P1==0xdb||P1==0xbb||P1==0x7b)
delay(5);
if(P1==0xeb||P1==0xdb||P1==0xbb||P1==0x7b)
{
switch(P1)
{
case 0xeb: P0=num[9]; break;
case 0xdb: P0=num[10] ;break;
case 0xbb: P0= num[11];break;
case 0x7b: P0=num[12] ;break;
}
}
P1=0xf7;
if(P1==0xe7||P1==0xd7||P1==0xb7||P1==0x77)
delay(5);
if(P1==0xe7||P1==0xd7||P1==0xb7||P1==0x77)
{
switch(P1)
{
case 0xe7: P0=num[13]; break;
case 0xd7: P0=num[14] ;break;
case 0xb7: P0= num[15];break;
case 0x77: P0=num[0] ;break;
}
}
}
}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
㈥ 为51单片机设计一个上拉输入和下拉输入的按键电路并分析其工作原理
按键一般是上拉,单片机的IO通过电阻上拉高电平,按键正常高电平当按键按下短路,把IO变成低电平,单片机检测到低电平表示有按键按下,按键下拉一般是把单片机IO通电阻接到GND,按键正常是低电平,当按键按下把IO拉高,单片机检测到高电平表示有按键按下。