2018/3/18单片机1.说在前面1.今天从图书馆借到了一本51单片机的基础教程,从其中看到了一些关于单片机的基础知识1-1:单片机是在一块硅片上集成微处理器,储存器以及各种输入输出接口,所以被称为单片微型计算机,简称单片机1-2:通俗的来说,单片机就是一块集成芯片,但是有一些特殊的功能,通过在不同时间控制芯片输出高低电平从而输出不同的电平,控制和引脚相连的外围电路的电气情况对于我的单片机板子ST89c52 40ISTC:前缀 8:8051内核 9:内部是FlashE^2prom存储器 c:cmos存储器 5:无特殊含意 2:内存为2*4KB40I:40表示单片机的最高晶振为40mhz,I:表示为工业用(c:商业 a:汽车用品 m:军用)
2.矩阵键盘(进入正题)1.矩阵键盘其实和独立键盘的原理差不多,都是机械按键,都需要实现消抖,但是矩阵键盘需要加上一些特定的条件,不能跟独立键盘一样一个一个定义了(否则定义16个不是要爆炸),所以如果要判断是哪个键位按下,有两种判断方法 方法一:先通过高四位全部输出低电平,然后逐行扫描,如果低四位不为1(非门)则,该行的按键被按下
方法二(常用):先给高四位全部输出低电平,低四位输出高电平,接受数据,当低四位不全为高电平时,判断所在列,然后,低四位输出低电平,高四位输出高电平,判断行,行列都判断了;
#include
//采用宏定义,定义矩阵端口和数码管发送端口
#define GPIO_KEY P1//矩阵端口
#define GPIO_DIG P0//数码管端口
typedef unsigned char u8;
typedef unsigned int u16;
/*实现38译码器的使用,实现数码管的位选*/
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
u8 KEY_VALUE;//定义矩阵键盘所定义的数
u16 i;//延时参数
u16 a=0;
//使用数组定义,code为定义常量数组,将数组定义在ROM中
u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,
0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//定义数码管的字码
//延时函数
void delay(u16 i)
{
while(i--);
}
//判断按键按下的情况
void KEYDown()
{
GPIO_KEY=0x0f;//00001111 定义高四位为低电平,低四位为高电平
if(GPIO_KEY!=0x0f)//说明某一列按键按下
{
delay(1000);//消抖
if(GPIO_KEY!=0x0f) //检测代码是否按下
{
//列判断
GPIO_KEY=0x0f;//00001111定义高四位为0,低四位为1
switch(GPIO_KEY)
{
//给samg数组赋值,便于让按钮控制数值
case(0x07): KEY_VALUE=0;break;//第一列,00000111
case(0x0b): KEY_VALUE=1;break;//第二列,00001011
case(0x0d): KEY_VALUE=2;break;//第三列,00001101
case(0x0e): KEY_VALUE=3;break;//第四列;00001110
}
//行判断
GPIO_KEY=0xf0;
switch(GPIO_KEY)
{
GPIO_KEY=0xf0;//定义高四位为1,低四位为0(第二次判断)
case(0x70): KEY_VALUE=KEY_VALUE;break;//第一行,01110000
case(0xb0): KEY_VALUE=KEY_VALUE+4;break;//第二行,10110000
case(0xd0): KEY_VALUE=KEY_VALUE+8;break;//第三列,11010000
case(0xe0): KEY_VALUE=KEY_VALUE+12;break;//第四列;11100000
}
//设置a,设置运转时间
while((a<50)&&(GPIO_KEY!=0xf0))//按键松手检测
{
delay(1000);
a++;
}
}
}
}
void main()
{
//表示38译码器
LSA=1;
LSB=1;
LSC=0;
while(1)
{
KEYDown();
GPIO_DIG=smgduan[KEY_VALUE];
}
}