51单片机入门(三)

数码管显示,定时器中断;键盘检测:

1.数码管:分共阳极和共阴极数码管。我的实验板是共阴极,多位数码管的公共端叫做“位选线”,连接在一起的段线叫做“段选线”。位选是独立控制的,而段选是连接在一起的。段选数据由P0口发送,位选由P2口的2.3.4控制。(消影用P0=0x00)

2.中断:为使单片机具有对外部或内部随机事件发生的时间实时处理而设置的,中断功能的存在,很大程度上提高了单片机处理外部或内部时间的能力。51单片机内部共有5个中断源,外部中断0、1;定时器中断0、1;串行口中断。

1)中断级别:INT0>T0>INT1>T1>TI/RI;

2)设置两个与中断有关的寄存器:中断允许寄存器IE和中断优先级寄存器IP。

3)定时器/计数器控制寄存器TCON;定时器/计数器工作方式寄存器TMOD。

4)中断服务程序的写法:

void 函数名()interrupt 中断号 using 工作组

{

   中断服务程序内容

}

5)实例:

#include<reg52.h>
unsigned char num=0;
void main()
{
//initial timer
TMOD=0x01;
TH0=(65535-49539)/256;
TL0=(65535-49539)%256;
EA=1;
ET0=1;
TR0=1;
while(1)
{
if(num==20)
{
num=0;
P2=~P2;
}
}
}
//*********interrupt server
void time() interrupt 1
{
TH0=(65535-49539)/256;
TL0=(65535-49539)%256;
num++;
}

3.独立键盘的检测:扫描法(去抖:延时10ms)

4.矩阵键盘的检测:行列扫描

实例:

#include<reg52.h>
#define uchar unsigned char
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
void delay10ms();
void keydown();
uchar KeyValue;
uchar code table[17]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
void main()
{
LSA=0;
LSB=0;
LSC=0;
while(1)
{
keydown();
P0=table[KeyValue];
}
}
//**************keydown()
void keydown()
{
P1=0x0f;
if(P1!=0x0f)
{
delay10ms();
if(P1!=0x0f)
{
//test colume
P1=0x0f;
switch(P1)
{
case(0X07): KeyValue=0;break;
case(0X0b): KeyValue=1;break;
case(0X0d): KeyValue=2;break;
case(0X0e): KeyValue=3;break;
}
//test row
P1=0xf0;
switch(P1)
{
case(0X70): KeyValue=KeyValue;break;
case(0Xb0): KeyValue=KeyValue+4;break;
case(0Xd0): KeyValue=KeyValue+8;break;
case(0Xe0): KeyValue=KeyValue+12;break;
}
while(!P1);
}
}
}
//**************delay10ms()
void delay10ms()
{
uchar i,j;
for(i=10;i>0;i--)
for(j=110;j>0;j--);
}

转载于:https://www.cnblogs.com/ljd4you/p/6506120.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值