在键盘的电路中,存在这线与这玩意,
线与和线或:一条线和一个开关,一端是高电平另一端是低电平,开关闭合,整条线就会变为低电平,总的来说就是存在线与的关系,只要一端是低电平闭合开关后,整条线就会拉低,这就是线与;有一端是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 编辑:什么鱼 引用地址:上一篇:《初学者C51自学笔记》之PS/2
下一篇:《初学者C51自学笔记》之89C51初步认识
推荐阅读
《初学者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
《初学者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(
本文来自电机新闻,电机行业资讯-中国华东电机信息网,经授权后发布,转载请联系原作者。原文链接:http://www.huadongmotor.com/jishu/20719.html