//可以比较一下和以前发表的一篇用反转法实现的不同(感觉一下那个更简单)
//这种方法是用只用P3口的前高四位来比较,看改变了么(由于比较仓促,没有proteus仿真,不过这是个比较经典的方法,网上有很多这个代码,源自郭天祥的视频和书籍)
#include
#define uchar unsigned char
#define uint unsigned int
sbit wela=P2^7;
sbit dula=P2^6;
uchar num,num1;
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,
0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
void delay(uint xms)
{
uint x,y;
for(x=xms;x>0;x--)
for(y=111;y>0;y--);
}
void display(uchar num)
{
dula=1;
P1=table[num];
dula=0;
// delay(10);
}
void matrixkeyscan()
{
uchar temp,key;
P3=0xfe; //第一行
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xee:
key=0;
break;
case 0xde:
key=1;
break;
case 0xbe:
key=2;
break;
case 0x7e:
key=3;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
display(key);
}
}
P3=0xfd; //第二行
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xed:
key=4;
break;
case 0xdd:
key=5;
break;
case 0xbd:
key=6;
break;
case 0x7d:
key=7;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
display(key);
}
}
P3=0xfb; //第三行
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xeb:
key=8;
break;
case 0xdb:
key=9;
break;
case 0xbb:
key=10;
break;
case 0x7b:
key=11;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
display(key);
}
}
P3=0xf7; //第四行
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xe7:
key=12;
break;
case 0xd7:
key=13;
break;
case 0xb7:
key=14;
break;
case 0x77:
key=15;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
display(key);
}
}
}
void main()
{
dula=0;
wela=1;
P1=0x00;
wela=0;
//dula=0;
while(1)
{ //dula=0;
matrixkeyscan();
}
}
关键字:课程设计 矩阵键盘 c51 扫描法
引用地址:
课程设计:矩阵键盘(c51,使用扫描法实现)
推荐阅读最新更新时间:2024-03-16 15:09
C51单片机定时器/计数器控制字设置
在使用定时/计数器之前需要先通过定时/计数器的方式控制字来设置其工作方式。 在单片机中有两个特殊功能寄存器与定时/计数有关,这就是TMOD和TCON。顺便说一下,TMOD和TCON是名称,我们在写程序时就能直接用这个名称来指定它们,当然也能直接用它们的地址89H和88H来指定它们(其实用名称也就是直接用地址,汇编软件帮你翻译一下而已)。 从图1中我们能看出,TMOD被分成两部份,每部份4位。分别用于控制T1和T0,至于这里面是什么意思,我们下面介绍。 从图2中我们能看出,TCON也被分成两部份,高4位用于定时/计数器,低4位则用于中断(我们暂不管)。而TF1(0)我们上节课已提到了,当计数溢出后TF1(0)就由0变为
[单片机]
4*4矩阵键盘制作电路+键盘扫描法89c52c程序驱动数码管
这里介绍最常用的4*4矩阵键盘,其他的更多键在此基础上拓展。 一般我们用的电路就如下,此图我随手画下,看懂意思就好了 如果你有兴趣可以按照此电路制作,下面附上焊接实物图 矩阵键盘的识别方法一般有扫描法,线反转法 扫描法: 矩阵式键盘结构:输出行线锁存器,输入列线缓冲器。 工作过程: 1.CPU先使行线P1.0为低,其余行线为高 2.CPU读入输入缓冲器的状态,以确定哪条列线为0状态,若此时P1.7为0,则 C 键按下;若P1.5为0,则 E 键按下 3.若输入缓冲器(列线)状态全部为1,说明P1.0行没有键盘按下,CPU急继续使P1.1为0,其余行线为高,再读入输入缓冲器的状态,以确定哪条列线为0
[单片机]
单片机C语言C51的程序结构
(1)C51中定义的库函数和标准C语言定义的库函数不同。标准的C语言定义的库函数是按通用微型计算机来定义的,而C51中的库函数是按51单片机相应情况来定义的; (2)C51中的数据类型与标准C的数据类型也有一定的区别,在C51中还增加了几种针对51单片机特有的数据类型; (3)C51变量的存储模式与标准C中变量的存储模式不一样,C51中变量的存储模式是与51单片机的存储器紧密相关; (4)C51与标准C的输入输出处理不一样,C51中的输入输出是通过51串行口来完成的,输入输出指令执行前必须要对串行口进行初始化; (5)C51与标准C在函数使用方面也有一定的区别,C51中有专门的中断函数。
[单片机]
基于C51单片机Pl口的矩阵式键盘控制
矩阵式键盘又叫行列式键盘。就是用I/O口线组成行、列结构,按键设置在行列的交点上。在按键较多时多用矩阵式键盘,可以节省I/O口线。例如:占用8个I/O口线的4×4矩阵式结构可以构成16个键的键盘。当有键按下时,要逐行或逐列扫描来判断是哪个按键按下。通常的扫描方式有扫描法和反转法。 1、硬件设计 单片机的Pl口的低4位接矩阵键盘的行线,高4位接矩阵键盘的列线,如下图所示。 2.程序设计 扫描函数的返回值为按键特征码,若无键被按下,返回值为0。程序清单如下:
[单片机]
一个stc89c52单片机下的矩阵键盘程序
下面是一个stc89c52单片机下的矩阵键盘程序,P0口接键盘,显示在P2口. #include reg52.h #define uchar unsigned char #define uint unsigned int sbit key1=P3^2; sbit key2=P3^3; uchar code tab ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00}; //定义八个灯的工作状态。 uchar code wep ={0x00,0x01,0x02,0x03,0x04,0x05,0x06,
[单片机]
STM32 矩阵键盘扫描程序
#define __JUZHENJIANPAN_H extern u8 KeysCAN(void); extern void GPIO_Config(void); #endif #include stm32f10x.h #include juzhenjianpan.h #include gpiobitmap.h #define PC0 PCo_0 #define PC1 PCo_1 #define PC2 PCo_2 #define PC3 PCo_3 #define PC4 PCo_4 void GPIO_Config(void) { R CC _APB2Peri
[单片机]
C51语言使用外部存储器的方法
简介:课本上学到的外部存储器操作基本上都是用汇编语言实现的,但是在实际工作中,大都用C语言编写单片机的程序,那么对外部存储器的操作就不仅仅是给一个普通变量赋值那样子了。 简单地说,注意两个方面: 软件部分: 1.添加头文件#include 2.在需要读写的地方用XBYTE就行,具体做法如下: 比如要访问0xA0B0这个地址(读数据):变量名=XBYTE 就行 反过来要给0xA0B0这个地址赋一个值(写数据):XBYTE =变量名 硬件部分: 硬件连接,将51单片机的P2口接外部存储器的高8位,P0口接数据并通过锁存器接外部存储器的低8位,锁存器的锁存端接51单片机的ALE, 51单片机的读写端要
[单片机]
stm32学习笔记——按键(扫描法)
目的:利用扫描IO口的方式直接操作按键 配置文件:#include stm32f10x_gpio.h #include stm32f10x_rcc.h 寄存器、结构体定义以及库函数参看流水灯一节 程序代码分析:(代码出自FIRE) Led.c文件再次不在叙述,参看流水灯一节 重点分析key.c文件,其基本结构如下: 1、按键io口初始化,这里有两个按键key1和key2,初始化过程完全相同 void Key1_GPIO_Config(void) { GPIO_InitTypeDef GPIO_InitStructure;//定义GPIO初始化结构体
[单片机]