《初学者C51自学笔记》之8X8键盘(线与和线或)

最新更新时间:2022-04-22来源: eefocus关键字:初学者  C51 手机看文章 扫描二维码
随时随地手机看文章

在键盘的电路中,存在这线与这玩意,

线与和线或:一条线和一个开关,一端是高电平另一端是低电平,开关闭合,整条线就会变为低电平,总的来说就是存在线与的关系,只要一端是低电平闭合开关后,整条线就会拉低,这就是线与;有一端是Z(高组态),闭合开关后,另一端是高电平整条线就是高低电平,反之亦然,这就是线或;

如何编程:先P3=11110000(图中从下至上11110000),假设按下S1则其高四位变为1110(线与)(忽略低四位)这时你已经确定是键盘的第一列的某一按键被按下;再把P3=11101111,把低四位变为一(高四位不变),这时你还没放开按键,因为线与,则P3=11101110;(要想判断按键是否被按下:用&0xf0)

#include

#define uchar unsigned char 

#define uint unsigned int 

 

unsigned char code smg_du[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};

unsigned char code smg_we[]={0x08,0x18,0x28,0x38,0x48,0x58,0x68,0x78};

 

//************************************************

//延时函数,在12MHz的晶振频率下

//大约50us的延时

//************************************************

void delay_50us(uint t)

{

uchar j;

for(;t>0;t--)

        for(j=19;j>0;j--);

}

 

//************************************************

//延时函数,在12MHz的晶振频率下

//大约50ms的延时

//************************************************

void delay_50ms(uint t)

{

uint j;

for(;t>0;t--)

for(j=6245;j>0;j--);

 

void main()

{

uchar key_l,key_h;

uchar key;

while(1)

{

P3=0xf0;//11110000

key_l=P3;

key_l=key_l&0xf0;//判断按键是否被按下

if(key_l!=0xf0)

{

delay_50us(100);//消抖

if(key_l!=0xf0)//再判断

{

key_l=P3&0xf0;

key_l=key_l|0x0f;//11101111(准备对行进行检查)

P3=key_l;

key_h=P3;

key_h=key_h&0x0f;//00001110(把列忽略)

key_l=key_l&0xf0;//11100000(把行忽略)

key=key_h+key_l; //11101110

 

}

}

switch (key)

{

case 0xee:P1=smg_du[0];break;

case 0xde:P1=smg_du[1];break;

case 0xbe:P1=smg_du[2];break;

case 0x7e:P1=smg_du[3];break;

case 0xed:P1=smg_du[4];break;

case 0xdd:P1=smg_du[5];break;

case 0xbd:P1=smg_du[6];break;

case 0x7d:P1=smg_du[7];break;

case 0xeb:P1=smg_du[8];break;

case 0xdb:P1=smg_du[9];break;

case 0xbb:P1=smg_du[10];break;

case 0x7b:P1=smg_du[11];break;

case 0xe7:P1=smg_du[12];break;

case 0xd7:P1=smg_du[13];break;

case 0xb7:P1=smg_du[14];break;

case 0x77:P1=smg_du[15];break;

 

}

}

}

关键字:初学者  C51 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic562862.html

上一篇:《初学者C51自学笔记》之PS/2
下一篇:《初学者C51自学笔记》之89C51初步认识

推荐阅读

c51单片机中断详解--适合初学者
工程图第一题**每次亮一个灯的流水灯,定义P1为led1。外部中断0允许中断:EX0=1;下降沿触发:IT0=1;总开关:EA=1;中断要执行的是P0引脚的4个二极管闪六次。其实这里还有个想说的是,IE在中断请求的时候,会置位为1,然后CPU同意并执行中断程序后,IE自动清零。为什么说这个,这个可以在以后的一些情况,作为中断条件。第二题每次亮一个灯的流水灯和第一题的一样;中断0下降沿触发也和第二题一样;中断0程序是:P1引脚每次亮两个二极管的流水灯讨论一下:每次亮两个二极管,如果低电平亮,那就要11111100B→11110011B。个人觉得在中断中使用while造成的后果是很致命的,一般杜绝在里面用while,否则永远跳不出中断。
发表于 2022-06-21
c51单片机中断详解--适合<font color='red'>初学者</font>
初学者C51自学笔记》之74HC573芯片及发光二极管闪烁
当LE为高电平时,D与Q的状态一样,同高同低;LE为低电平时,D是任意的状态而Q保持原来的状态;OE是低电平有效。用总线方法使发光二极管闪烁#include <reg52.h>/* 不精确延时*/void delay(void){ unsigned int a; a=55400; while(a--); }void main(){ while(1) { P0=0xfd;//11111101 delay(); P0=0xff;//11111111 delay(); }}
发表于 2022-02-17
《<font color='red'>初学者</font>C51自学笔记》之74HC573芯片及发光二极管闪烁
初学者C51自学笔记》之流水灯实现(总线操作)
#include <reg52.h>#define uchar unsigned char //宏定义#define uint unsigned intunsigned char table[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//11111110,11111101,11111011...../* 延时*/void delay(void){ uchar a,b; for(a=0;a<200;a++) for(b=0;b<200;b++);}void main(){ uchar i; while(1) { for(i=0;i<8;i++) {
发表于 2022-02-17
初学者C51自学笔记》之流水灯实现(移位操作)
#include <reg52.h>#define uchar unsigned char#define uint unsigned intvoid delay(void){ uchar a,b; for(a=0;a<200;a++) for(b=0;b<200;b++);}void main(){ uchar k,i; while(1) { k=0xfe; //11111110 for(i=0;i<8;i++) { P0=k; delay(); k=k<<1; //11111100 k=k|0x01; //末尾变为1 11111100 | 00000001 = 11111101(有1即
发表于 2022-02-17
初学者C51自学笔记》之流水灯实现(移位操作二)
#include <reg52.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned intvoid delay(void){ uchar a,b; for(a=0;a<200;a++) for(b=0;b<200;b++);}void main(){ uchar k; k=0xfe; //11111110 while(1) { P0=k; delay(); k=_crol_(k,1);//移位 K移一位 11111101 11111011 11110111......(intrins.h里的函数) }}
发表于 2022-02-17
初学者C51自学笔记》之蜂鸣器与继电器
继电器,三是拨码开关与蜂鸣器;依次对应连接(继电器同理)#include <reg52.h>sbit beep=P0^1;void main(){ beep=1;}小电流从引线流入,铁心产生磁力将衔铁吸到下边,从而端点也会随之而下;//反复吸合,听到d滴答滴答声#include <reg52.h>sbit relay=P0^0;void delay(void){ unsigned char a,b; for(a=0;a<200;a++) for(b=0;b<200;b++);}void main(){ while(1) { relay=1; delay(); relay=0; delay(
发表于 2022-02-17
《<font color='red'>初学者</font>C51自学笔记》之蜂鸣器与继电器

推荐帖子

DWDM系统光发射机温度控制电路的优化设计
摘要:本文提出了一种在激光发射机温度控制电路中提高控制精度、降低功耗、增加集成度的有效方法,给出了波长的热电温度控制原理及测试结果。DWDM系统光发射机温度控制电路的优化设计
fighting 工控电子
频谱分析仪使用准则
频谱分析仪对于射频工程师来说是必不可少的测试工具,广泛应用于无线电技术的各个领域,本人毕业后一直从事研究的领域为微波与天线测量技术、微弱信号监测、EMC/EMI测量等。射频测量离不开频谱分析仪,故同频谱分析仪结下了不解之缘,因此,在这里我重点谈一下“射频万用表”——频谱分析仪。  频谱分析仪广泛应用于无线电技术的各个领域,例如:电子对抗、卫星通信、移动通信、散射通信、雷达、遥控遥测、侦察干扰、射电天文、卫星导航、航空航天和频谱监测等领域。频谱分析仪对各种类型的信号进行测量和分析时,可测量信
xtss RF/无线
HDVICP_H.264压缩问题
1.dsp端单独运行HDVICP测试程序,通过开发器读取本地文件进行H.264压缩,压 缩结果正确可以播放。由于测试程序读取的测试图像较小为176*144,用开发器读 取本地文件的时间还可以接受,当尝试测试2448*2048的图像压缩时,粗略计算用 开发器读取本地文件时间为1个多小时,于是想将HDVICP封装成一个库,一 个.a64p的文件,在arm端调用该.a64p文件,然后再arm端读取本地文件(读取时 间很短),调用自己封装的压缩库,完成大图片的压缩。问题:在dsp端,读取本地文
lyc715088692 TI技术论坛
ZLG 的USBCAN和以太网卡都支持c++和c#吗?
ZLG的USBCAN和以太网卡都支持c++和c#吗?ZLG的USBCAN和以太网卡都支持c++和c#吗?
喜鹊王子 TI技术论坛
HSPICE中传输线模型的结构及参量控制
HSPICE中传输线模型的结构及参量控制HSPICE中传输线模型的结构及参量控制
linda_xia Microchip MCU
TI低功耗蓝牙芯片CC2541
特性点RF2.4-GHz蓝牙低能量符合和专有的RF片上系统支持250kbps的,500kbps的,1Mbps的,2Mbps的数据传输速率–出色的链路预算,启用如果没有外部的远程应用前端–可编程输出功率为0dBm–卓越的接收灵敏度(-94dBm的输出功率1Mbps),选择性和阻断性能–适用于系统定位符合随着世界范围的无线电频率法规:ETSIEN300328和EN3004402级(欧洲),FCCCFR47第15部分(美国),ARIBSTD-T66(日本
深圳动能世纪SI RF/无线
小广播
实战 培训 开发板 精华推荐

何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2022 EEWORLD.com.cn, Inc. All rights reserved