矩阵键盘按键不灵敏是什么问题?

矩阵键盘按键不灵敏是什么问题?,第1张

一般的键盘去抖程序是 检测--延时--检测,第一次检测都可以检测一行或一列,第二次读按键值;如果逻辑正确的话,不应该有哪个按键不响应。先自己查查。
没看懂你的程序,
全部程序都贴出来看看。

#include<reg52h>
#define uint unsigned int
#define uchar unsigned char
sbit wei=P1^1;
sbit duan=P1^0;
uchar code tablekey[]={0xfe,0xfd,0xfb,0xf7};
uchar code tableduan[]={0x00,0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f,0x77,
0x7c,0x39,0x5e,0x79,0x71};
uchar keynum,keyi,keytemp;
void delay(uchar z)
{
uchar x,y;
for(x=110;x>0;x--)
for(y=z;y>0;y--);
}
void init()
{
keynum=0;
keyi=1;
}
void key()
{
P2=0xf7;//检测第一行
keytemp=P2;
keytemp=keytemp&0xf0;
if(keytemp!=0xf0)
{
delay(2);
keytemp=P2;
keytemp=keytemp&0xf0;//延时后重新检测是否按键按下,消除抖动
if(keytemp!=0xf0)
{
switch(keytemp)
{
case 0xe0:keynum=1;//第一列按键
break;
case 0xd0:keynum=2;//第二列按键
break;
case 0xb0:keynum=3;//第三列按键
break;
case 0x70:keynum=4;//第四列按键
break;
}
keytemp=P2;
keytemp=keytemp&0xf0;
while(keytemp!=0xf0)//松手检测
{
keytemp=P2;
keytemp=keytemp&0xf0;
}
}
}
P2=0xfb;//检测第二行
keytemp=P2;
keytemp=keytemp&0xf0;
if(keytemp!=0xf0)
{
delay(2);
keytemp=P2;
keytemp=keytemp&0xf0;//延时后重新检测是否按键按下,消除抖动
if(keytemp!=0xf0)
{
switch(keytemp)
{
case 0xe0:keynum=5;//第一列按键
break;
case 0xd0:keynum=6;//第二列按键
break;
case 0xb0:keynum=7;//第三列按键
break;
case 0x70:keynum=8;//第四列按键
break;
}
keytemp=P2;
keytemp=keytemp&0xf0;
while(keytemp!=0xf0)//松手检测
{
keytemp=P2;
keytemp=keytemp&0xf0;
}
}
}
P2=0xfd;//检测第三行
keytemp=P2;
keytemp=keytemp&0xf0;
if(keytemp!=0xf0)
{
delay(2);
keytemp=P2;
keytemp=keytemp&0xf0;//延时后重新检测是否按键按下,消除抖动
if(keytemp!=0xf0)
{
switch(keytemp)
{
case 0xe0:keynum=9;//第一列按键
break;
case 0xd0:keynum=10;//第二列按键
break;
case 0xb0:keynum=11;//第三列按键
break;
case 0x70:keynum=12;//第四列按键
break;
}
keytemp=P2;
keytemp=keytemp&0xf0;
while(keytemp!=0xf0)//松手检测
{
keytemp=P2;
keytemp=keytemp&0xf0;
}
}
}
P2=0xfe;//检测第四行
keytemp=P2;
keytemp=keytemp&0xf0;
if(keytemp!=0xf0)
{
delay(2);
keytemp=P2;
keytemp=keytemp&0xf0;//延时后重新检测是否按键按下,消除抖动
if(keytemp!=0xf0)
{
switch(keytemp)
{
case 0xe0:keynum=13;//第一列按键
break;
case 0xd0:keynum=14;//第二列按键
break;
case 0xb0:keynum=15;//第三列按键
break;
case 0x70:keynum=16;//第四列按键
break;
}
keytemp=P2;
keytemp=keytemp&0xf0;
while(keytemp!=0xf0)//松手检测
{
keytemp=P2;
keytemp=keytemp&0xf0;
}
}
}
}
void main()
{
P0=0x00;
wei=1;
delay(2);
wei=0;
duan=1;
P0=0;
init();
while(1)
{
key();
P0=tableduan[keynum];
}
}

//电路说明如下。
//单片机:使用51系列兼容的即可;
//4×4矩阵键盘:接在P1口;
//两位数码显示器: P0口输出七段码,P2口输出位选码。
//==============================================================
//C语言程序如下。
/
文件名: KEY_LEDc
功能 : 对4×4矩阵键盘进行输出,在数码管后两位显示按键值。
/
#include <reg51h>
#include <intrinsh>
#define uint unsigned int
#define uchar unsigned char
//uchar code table[10] = {0x03, 0x9f, 0x25, 0x0d, 0x99, 0x49, 0x41, 0x1f, 0x01, 0x09};
uchar code table[10] = {0xC0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90};
/
名称 : Delay_1ms()
功能 : 延时子程序,延时时间为 1ms x
输入 : x (延时一毫秒的个数)
输出 : 无
/
void Delay_1ms(uint x)
{
uint i;
uchar j;
for(i = 0; i < x; i++) for(j = 0; j <= 148; j++);
}
/
名称: Keyscan()
功能: P1外接4×4按键, 按照扫描法读出键值
输出: 按键值0~15/如无键按下, 返回16
/
uchar Keyscan(void)
{
uchar i, j, temp, Buffer[4] = {0xef, 0xdf, 0xbf, 0x7f};
for(j = 0; j < 4; j++) { //循环四次
P1 = Buffer[j]; //在P1高四位分别输出一个低电平
temp = 0x01; //计划先判断P10位
for(i = 0; i < 4; i++) { //循环四次
if(!(P1 & temp)) //从P1低四位,截取1位
return (i + j 4); //返回取得的按键值
temp <<= 1; //判断的位,左移一位
} }
return 16; //判断结束,没有键按下,返回16
} //呵呵,实质性的语句不过8行,就是这么简练!
/
名称: Display(uchar k)
功能: 将参数分成十位、个位分别显示
输入: k (键盘数值)
输出: P0口输出七段码,P2口输出位选码
/
void Display(uchar k)
{
P2 = 0; //消隐
P0 = table[k / 10];
P2 = 0x02; Delay_1ms(5); //显示5ms十位
P2 = 0; //消隐
P0 = table[k % 10];
P2 = 0x01; Delay_1ms(5); //显示5ms个位
}
/
名称 : Main()
功能 : 主函数
/
void Main(void)
{
uchar Key_Value = 16, Key_Temp1, Key_Temp2; //两次读出的键值
while(1) {
//---------以下读入按键、消掉、等待按键释放
P1 = 0xff;
Key_Temp1 = Keyscan(); //先读入按键
if(Key_Temp1 != 16) { //如果有键按下
//Delay_1ms(10); //延时一下
Display(Key_Value); //可用显示代替延时
Key_Temp2 = Keyscan(); //再读一次按键
if (Key_Temp1 == Key_Temp2)//必须是两次相等
Key_Value = Key_Temp1; //才保存下来,这就是消除抖动
while(Keyscan() <= 16); //等待按键释放
}
//---------以下是对按键的处理
Display(Key_Value); //显示键值
}
}

一、引言

本方案是用VHDL语言来实现的基于RS232按位串行通信总线的行列式矩阵键盘接口电路,具有复位和串行数据的接收与发送功能,根据发光二极管led0-led2的显示状态可判断芯片的工作情况;实现所有电路功能的程序均是在美国ALTERA公司生产的具有现场可编程功能的芯片EPM7128SLC84-15上调试通过的。能通过动态扫描来判有键按下、将键值转换成对应的ASCII码值,在时钟脉冲的作用实现串行数据的接收与发送。

二、设计方案

1芯片引脚定义

reset复位输入端;clk时钟输入端;rxd串行数据接收端;retn0-retn7键盘扫描行输入线;txd串行数据发送端;scan0-scan7键盘扫描列输出线;led0-led2显示输出端。

2键盘与芯片的连接图(如图2所示,为8×8的64键键盘)

3动态扫描原理

(1)依次使列线scan0-scan7输出0电平,检查行线retn0-retn7的电平状态。如果行线retn0-retn7的电平全为高电平,表示没键按下。如果retn0-retn7上的电平不全为高电平,表示有键按下。

(2)如果没键按下,就返回扫描。有键按下则进行逐行扫描,找出闭合键的键号。其过程是:先使scan0=0,scan1-scan7=1,检测retn0-retn7上的电平,如果retn=0,则表示第一行第一列的键被按下,如果retn1=0,则表示第二行第二列的键被按下,其它依次类推;如果retn0-retn7均不为0,则表示这一列没键按下;然后再使scan1=0,检测第二列按键,这样一直循环下去,知道把闭合的键找到为止。

当有键按下时,根据该时刻的scan值和retn值就可判断按下的是哪一个键。

4芯片内部模块框图

三、芯片设计

数据接收模块框图如图4所示。

Reset复位输入端;clk时钟输入端;rxd串行数据接收端;led[20]输出按下键对应的ASCII码值的低三位去驱动发光二极管。

该模块实现对串行数据的接收记数和串并变换的控制功能。

1串行数据接收控制单元

Reset 复位输入端;clk 时钟输入端;rxd 串行数据接收端;sh_rx[30]接收计数器高4位;sl_rx[10]接收计数器低2位。

将串行数据接收计数器设置位一个6位计数器,高4位为sh_r,低2位为sl_r,利用该计数器的状态实现串行数据的同步控制和记数控制。

2串并转换电路单元

从RXD端接收的串行数据进经过串并变换后,将其低三位经LED输出端输出,驱动发光二极管LED0,LED1,LED2发光,从而显示接收端RXD的每个数据的低三位。当每个数据的低三位相同时,显示状态就不变化,否则就出现闪烁现象,以此来检查芯片的工作情况。

四、总结

本方案是用VHDL语言来实现的基于RS232按位串行通信总线的行列式矩阵键盘接口电路的设计,具有复位和串行数据的接收与发送功能,根据发光二极管led0-led2的显示状态可判断芯片的工作情况;实现所有电路功能的程序均是在美国ALTERA公司生产的具有现场可编程功能的芯片EPM7128SLC84-15上调试通过的。该电路的设计贴近生活,实用性强,制成芯片后可作为一般的PC机键盘与主机的接口使用。

数组是一组有序数据的集合,数组中每一个数据都是同一数据类型。数组中的元素可以用数组名和下标来唯一确定。
数组的一般格式定义如下:
数据类型 数组名[常量表达式] = {元素表};
例如:
unsigned char tabel[3] = [0x3F, 0x06, 0x5B,];
P0 = tabel[0]; // P0此时的值为0x3F
数码管动态显示数字 123
#include <reg52h>
#include <intrinsh>
#define uint unsigned int
#define uchar unsigned char
sbit DU = P2^6;//数码管段选
sbit WE = P2^7;//数码管段选
// 毫秒级延时函数定义
void delay(uint z){ // 毫秒级延时函数定义
uint x, y;
for (x = z; x > 0; x--){
for (y = 114; y > 0; y--){

}
}
}
void main(){ // main函数自身会循环

while(1){
/第一位显示 数字 1/
P0 = 0XFF; // 清除断码 如果没有为P0 初始化赋值 0XFF,那么 P0的值会是上一个打开段选锁存器过程中赋予的值,执行到这里 会把段选值赋给锁存器中P0,导致数码管显示错误。
WE = 1; // 打开位选锁存器
P0 = 0XFE; // 1111 1110 选通第一位数码管
// P0 = 0X00; // 0000 0000 表示选通所有位数码管
WE = 0; // 锁存位选数据

DU = 1; // 打开段选锁存器
P0 = 0X06; // 0000 0110 显示“1”
DU = 0; // 锁存段选数据
delay(5); // 对每次数码管的切换进行 5毫秒延时 *** 作
/第二位显示 数字 2/
P0 = 0XFF; // 清除断码
WE = 1; // 打开位选锁存器
P0 = 0XFD; // 1111 1101 选通第二位数码管
// P0 = 0X00; // 0000 0000 表示选通所有位数码管
WE = 0; // 锁存位选数据

DU = 1; // 打开段选锁存器
P0 = 0X5B; // 0101 1011 显示“2”
DU = 0; // 锁存段选数据
delay(5);
/第三位显示 数字 3/
P0 = 0XFF; // 清除断码
WE = 1; // 打开位选锁存器
P0 = 0XFB; // 1111 1011 选通第三位数码管
// P0 = 0X00; // 0000 0000 表示选通所有位数码管
WE = 0; // 锁存位选数据

DU = 1; // 打开段选锁存器
P0 = 0X4F; // 0100 1111 显示“3”
DU = 0; // 锁存段选数据
delay(5);
}
}
数码管动态显示数字 123 (代码优化)
#include <reg52h>//包含51头文件
#include <intrinsh>//包含移位标准库函数头文件
#define uint unsigned int
#define uchar unsigned char
sbit DU = P2^6;//数码管段选
sbit WE = P2^7;//数码管段选
//共阴数码管段选表0-9
uchar code tabel[]= {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F,};
/====================================
函数 : delay(uint z)
参数 :z 延时毫秒设定,取值范围0-65535
返回值 :无
描述 :12T/Fosc110592M毫秒级延时
====================================/
void delay(uint z)
{
uint x,y;
for(x = z; x > 0; x--)
for(y = 114; y > 0 ; y--);
}
/====================================
函数 :display(uchar i)
参数 :i 显示数值,取值范围0-255
返回值 :无
描述 :三位共阴数码管动态显示
====================================/
void display(uchar i)
{
uchar bai, shi, ge;
bai = i / 100; //236 / 100 = 2
shi = i % 100 / 10; //236 % 100 / 10 = 3
ge = i % 10;//236 % 10 =6

//第一位数码管
P0 = 0XFF;//清除断码
WE = 1;//打开位选锁存器
P0 = 0XFE; //1111 1110
WE = 0;//锁存位选数据

DU = 1;//打开段选锁存器
P0 = tabel[bai];//
DU = 0;//锁存段选数据
delay(5);
//第二位数码管
P0 = 0XFF;//清除断码
WE = 1;//打开位选锁存器
P0 = 0XFD; //1111 1101
WE = 0;//锁存位选数据

DU = 1;//打开段选锁存器
P0 = tabel[shi];//
DU = 0;//锁存段选数据
delay(5);
//第三位数码管
P0 = 0XFF;//清除断码
WE = 1;//打开位选锁存器
P0 = 0XFB; //1111 1011
WE = 0;//锁存位选数据

DU = 1;//打开段选锁存器
P0 = tabel[ge];//
DU = 0;//锁存段选数据
delay(5);
}
void main()//main函数自身会循环
{
while(1)
{
display(123); //数码管显示函数
}
}
数码管动态显示数字 12345678 (代码优化)
#include <reg52h>//包含51头文件
#include <intrinsh>//包含移位标准库函数头文件
#define uint unsigned int
#define uchar unsigned char
sbit DU = P2^6;//数码管段选
sbit WE = P2^7;//数码管段选
//共阴数码管段选表0-9
uchar code tabel[]= {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F,};
/====================================
函数 : delay(uint z)
参数 :z 延时毫秒设定,取值范围0-65535
返回值 :无
描述 :12T/Fosc110592M毫秒级延时
====================================/
void delay(uint z)
{
uint x,y;
for(x = z; x > 0; x--)
for(y = 114; y > 0 ; y--);
}
/====================================
描述 :八位共阴数码管动态显示
====================================/
void display(uchar num1, uchar num2, uchar num3, uchar num4, uchar num5, uchar num6, uchar num7, uchar num8)
{

/第一位显示/
P0 = 0XFF;//清除断码
WE = 1;//打开位选锁存器
P0 = 0XFE; //1111 1110
WE = 0;//锁存位选数据

DU = 1;//打开段选锁存器
P0 = tabel[num1];//
DU = 0;//锁存段选数据
delay(1);
/第二位显示/
P0 = 0XFF;//清除断码
WE = 1;//打开位选锁存器
P0 = 0XFD; //1111 1101
WE = 0;//锁存位选数据

DU = 1;//打开段选锁存器
P0 = tabel[num2];//
DU = 0;//锁存段选数据
delay(1);
/第三位显示/
P0 = 0XFF;//清除断码
WE = 1;//打开位选锁存器
P0 = 0XFB; //1111 1011
WE = 0;//锁存位选数据

DU = 1;//打开段选锁存器
P0 = tabel[num3];//
DU = 0;//锁存段选数据
delay(1);
/第四位显示/
P0 = 0XFF; // 清除断码
WE = 1; // 打开位选锁存器
P0 = 0XF7; // 1111 0111 选通第四位数码管
WE = 0; // 锁存位选数据

DU = 1; // 打开段选锁存器
P0 = tabel[num4];//
DU = 0; // 锁存段选数据
delay(1);
/第五位显示/
P0 = 0XFF; // 清除断码
WE = 1; // 打开位选锁存器
P0 = 0XEF; // 1110 1111 选通第五位数码管
WE = 0; // 锁存位选数据

DU = 1; // 打开段选锁存器
P0 = tabel[num5];//
DU = 0; // 锁存段选数据
delay(1);
/第六位显示/
P0 = 0XFF; // 清除断码
WE = 1; // 打开位选锁存器
P0 = 0XDF; // 1101 1111 选通第六位数码管
WE = 0; // 锁存位选数据

DU = 1; // 打开段选锁存器
P0 = tabel[num6];//
DU = 0; // 锁存段选数据
delay(1);
/第七位显示/
P0 = 0XFF; // 清除断码
WE = 1; // 打开位选锁存器
P0 = 0XBF; // 1011 1111 选通第七位数码管
WE = 0; // 锁存位选数据

DU = 1; // 打开段选锁存器
P0 = tabel[num7];//
DU = 0; // 锁存段选数据
delay(1);

/第八位显示/
P0 = 0XFF; // 清除断码
WE = 1; // 打开位选锁存器
P0 = 0X7F; // 0111 1111 选通第八位数码管
WE = 0; // 锁存位选数据

DU = 1; // 打开段选锁存器
P0 = tabel[num8];
DU = 0; // 锁存段选数据
delay(1);
}
void main()//main函数自身会循环
{
while(1)
{
display(1, 2, 3, 4, 5, 6, 7, 8); //数码管显示函数
}
}
更多相关内容
0832+STC89C52RC数码管电压表
采用ADC0832、STC89C52RC制作了数码管显示的数字电压表,电路简洁,初学者容易制作成功。
stc89c52单片机数码管动态显示
在单片机开发板上,通过单片机控制数码管动态显示5201314,并闪烁显示
单片机学习
STC89C52驱动数码管
1硬件设计数码管实验硬件设计中使用到的数码管是共阳极类型的。因为数码管的片选引脚“1/2/3/4”都通过PNP 三极管来提供高电平,为什么要选用PNP 三极管和共阳极数码管的组合因为共阳极数码管共阳端直接接电源, 展开全文
c语言c52数码管
STC89C52单片机数码管介绍以及代码示例
LED数码管:数码管是一种简单、廉价的显示器,是由多个发光二极管封装在一起组成“8”字型的器件数码管分为共阳极连接和共阴极连接两种:1,共阴极连接就是说3,8这一头连得是负极,所以在下面的那头给上高电平(即置 展开全文
STC89C52单片机 数码管静态显示
数码管显示原理 数码管根据内部连接不同分为共阴极和共阳极。八段数码管内部有8颗LED组成,如果想要显示特定字形只需控制相应的LED亮起,其他LED熄灭即可。 静态与动态显示 静态显示: LED显示器工作方式有两种:
STC89C52RC - 12 - 静、动数码管显示
这里的 静态 动态 指的是 数码管 发光的时候 控制它的io口 状态 或者 数码管 发光段的状态 1、硬件介绍 1数码管 分为 共阴或者共阳 数码管里面封装的都是 LED小灯珠 共阳 阳极都连在一起 阳极接正 负极都是分开
8051单片机实战分析(以STC89C52RC为例) | 06 - 动态数码管驱动
#include "reg52h" //此文件中定义了单片机的一些特殊功能寄存器 typedef unsigned int u16; //对数据类型进行声明定义 typedef unsigned char u8; sbit LSA=P2^2; sbit LSB=P2^3; sbit LSC=P2^4; u8 code
动态扫描
延时函数液晶时钟_数码管_时钟_STC89C52_
基于stc89c52的数码管时钟按键修改时间晶振频率110592
STC89C52与数码管的详细接线图
适合静态显示,共阳数码管或共阴数码管都可以
stc89c52单片机开发板电路原理图
stc89c52单片机开发板电路原理图。主要包括模拟量采集ADC,AD/DA转换。485传输,点阵模块接口,红外发送,温湿度传感器,蜂鸣器,超声波模块,按键,指示灯,最小系统,外扩接口,USB供电以及串口传输,4位七段
Dan_数码管_STC89C52_
基于stc89c52单片机,在数码管上左右移动显示字符
STC89C52单片机 数码管动态显示_ʚVVcatɞ的博客_单片机数
WE = 1; // 打开位选锁存器 P0 = 0XFE; // 1111 1110 选通第一位数码管 // P0 = 0X00; // 0000 0000 表示选通所有位数码管 WE = 0; // 锁存位选数据 DU = 1; // 打开段选锁存器 P0 = 0X06; // 0000
Keil5 C51AT89C52 数码管的动态显示_Lisiluan的博客_keil
数码管的动态显示原理第一个数码管显示0,1s后第二个数码管显示1,直到第六个数码管显示5后又重新开始#include <reg52h>#define uint unsigned int#define uchar unsigned char sbit LE_D = P2^6;sbit LE_W = P2^7;u
(单片机作业一)STC89C52动态数码管显示520
设计背景 单片机老师要求在520当天,利用手上的单片机,实现一个专属计算机专业的浪漫。 设计基础目的 stc89c52做个基础表白 #include<reg51h> #include<intrinsh> typedef unsign
STC89C52RC单片机学习板PDF原理图+配套试验例程KEIL源码程序(105例)
STC89C52RC单片机学习板PDF原理图+配套试验例程KEIL源码程序(105例): 10 LED循环左移 10012864液晶基础显示 1011602动态显示 102红外解码1602液晶显示 103红外解码数码管显示 105 NRF24L01开发板一 11 LED循环
51单片机STC89C52 数码管动态_昵称90天可改的博客
DELAY3 DJNZ R1,DELAY4 CLR RS1 RET TABLEK: ;共阴数码管 DB 3FH,06H,5BH,4FH DB 66H,6DH,7DH,07H DB 7FH,6FH,77H,7CH DB 39H,5EH,79H,71H TABLEW: ;位选控制 DB 0FEH,0FDH,0FBH,0F7H DB 0EFH,0DFH
单片机STC89C52实验 DAY 2 数码管_马踏飞燕&lin_li的博客
动态数码管显示 #include<reg51h>#include<intrinsh>typedefunsignedcharu8;typedefunsignedintu16;sbit LSA=P2^2;sbit LSB=P2^3;sbit LSC=P2^4;voiddelay(inti){while(i--);}//段选u8 code smgduan[]={0x3f,0x06,0x5b,
基于stc89c52的44矩阵键盘输入数码管
本系统以STC89C52单片机为核心,使用4×4矩阵键盘作为数据输入方式,完成独立按键的测试,含有电路图及语言程序设计。
小白上路之51单片机(STC89C52)--数码管
目录数码管介绍显示器及其接口(本文主要针对LED显示器来介绍)开发板原理图数码管是如何显示出字符的静态数码管工作原理数码管静态显示原理74HC573芯片的使用源程序--静态数码管动态数码管工作原理数码管动态显示
8051单片机(STC89C52)八段数码管轮流显示0~7_好梦成真Kevin的博客-CS
在8个数码管上自右开始, 轮流显示 0 ~ 7 #include<STC89C5xRCH> voiddelay()//提供时延 { inti, j; for(i =0; i <300; i++) for(j =0; j <300; j++) ; }
51单片机STC89C52 数码管静态_昵称90天可改的博客
51单片机STC89C52数码管静态显示实验,含c代码(5) 1参考教程:清翔51单片机教程2基本原理 : 1)数码管位数:几个数码管连在一起,就是几位。 2)数码管共级:共阴极-数码管中间的线是GND。共阳极-数码管中间的线是VCC。用万用
基于 STC89C52 单片机 DS1302 时钟芯片定时开关的设计
绍一种以STC89C52单片机、DS1302,1602液晶显示为核心,具备调节时间,设置开启时间与关闭时间的定时开关的实现过程。采用C语言编写,与汇编语言相比具有更好的移植性和可读性,便于修改和增减功能,并通过Protues
基于STC89C52单片机跆拳道比赛计时计分系统设计与实现
采用STC89C52单片机进行控制,设计并实现了一套跆拳道比赛计时计分系统。在进行跆拳道比赛时,可以在计分器上同步显示参赛队伍双方实时得分。该计时计分系统的特点是在比赛进行到一半需要交换场地停止计时,以及在每
8051单片机实战分析(以STC89C52RC为例) | 05 - 静态数码管驱动
我们看一下数码管内部结构的示意图: 数码管分为共阳和共阴两种: 共阴数码管就是 8 只 LED 小灯的阴极是连接在一起的,阴极是公共端,由阳极来控制单个小灯的亮灭。 同理共阳数码管就是阳极接在一起。 看到这里我们就不难猜出,
STC 89C52 单片机引脚对应的功能以及实例讲解_Gorit的博客_s
二、数码管的使用 三、矩阵键盘的使用 四、液晶显示补充 先附上一张stc89C52引脚图 光看引脚是不够的,下面我们看看实物图是什么样子的 一、P1^0~7 对应八个二极管 二级管的实物图如下 从上往下 分别对应引脚中的 P1^0 ~ P1^7
单片机课设stc89c52zip
由stc89c52控制的四位倒计时秒表,里边有c语言代码和仿真, 实现的功能如下: 1通过按键设定倒计时时间; 2逐秒倒计时; 3使用4位一体数码管显示时间; 4时间到数码管闪烁显示0000
基于单片机STC89C52的LED数码管温度显示及报警器的实现
基于单片机STC89C52的LED数码管温度显示及报警器的实现,资源不错,希望对您有用。

#include<reg51h>
unsigned char code LED[13]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xa7};

void delay(unsigned char i)
{
unsigned char j=255;
while(i--);
while(j--)
;
}

int Keyscan()
{

char key,temp; //改动了
P2=0x0f;
delay(1);
temp=P2;
temp=temp&0x0f;
temp=~(temp|0xf0); //int型是两个字节的,所以用charg型的,要不就改成
if(temp==1) //temp=~(temp|0xfff0);
key=4; //同理,下面的也是一样的,,
else if(temp==2)
key=3;

else if(temp==4)
key=2;

else if(temp==8)
key=1;
P2=0x0f;
delay(1);
temp=P2;
temp=temp<<4; //改动了
temp>>=4; //改动了
temp=~(temp|0xf0);
if(temp==0x01)
key=key+8;
else if(temp==0x02)
key=key+4;
else if(temp==0x04)
key=key+0;
return key;

}
main()
{
int i;
while(1)
{
i=Keyscan();
P0=LED[i];

//i=0;

}

}
你这个程序里,按键没有去抖,若按一个键后,手还须多按一会儿,要不就不显示,所以你还要好好改改这个程序,你那个扫描按键的函数想的很好,


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/12953786.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-29
下一篇 2023-05-29

发表评论

登录后才能评论

评论列表(0条)

保存