书山有路勤为径,学海无涯苦作舟。开始新的学习吧,让你感到快乐的学习不叫学习!
先给大家上个图,
今天的视频录制完毕,我会把程序贴在文章里面,需要看视频的同学,请前往我个人的视频区。
电路图怎么连线,大家可以看得出来。我现在把程序代码贴一下:/*矩阵按键通过读取按键值表来分析出按键值并送去显示*/
#include <reg52.h> //头文件
#define uchar unsigned char //定义两个无符号字符
#define uint unsigned int //定义两个无符号字符
sbit dula=P2^0; //把p2.0-2.1 分别赋值为 段选位 和位选
sbit wela=P2^1; //把p2.0-2.1 分别赋值为 段选位 和位选
uchar code KEY_table[]={0xee,0xde,0xbe,0x7e, // 按键键值表
0xed,0xdd,0xbd,0x7d,
0xeb,0xdb,0xbb,0x7b,
0xe7,0xd7,0xb7,0x77};
uchar code table[]={0x3f,0x06,0x5b,0x4f, //定义一个阴极数码管的编码表。
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void delayms(uint xms) //延时子程序
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void display(uchar y) //显示子程序 定义一个无符号字符
{
P0=table[y]; // 形式参数
dula=1; //开断选位
dula=0 ;//关闭断选 ,锁存器就把数据存住了,
}
main() //主函数
{
uchar temp,key,num,x; //顶一个4个无符号字符
P0=0x00; //让八个位选全部低电平有效
wela=1; //位选开启,自动把数据送到P0
wela=0; //位选关闭,数据在锁存器保持
while(1) //判断为真
{
P3=0xf0; //把列全部输出高电平,行全部输出低电平
if(P3!=0xf0)// 测试不等于 ,
{
delayms(10); 延时去抖动
if(P3!=0xf0) 再次判断是否有按键按下
{
temp=P3; 把目前P3口的真实状态 送给temp /这个时候,行全是低电平,但是列也会存在一个低电平。
P3=0x0f; 然后再让列全部变成低电平,行全部点成高电平。//
实际上 因为有按键按下,这是就对行来看,里面会有低电平。
//此时列全是低电平,行也会存在一个低电平。
key=temp|P3; 将 行列状态综合赋值给temp ,把上面的值进行一个运算,举个例子:
Temp:1110 0000, P3:0000 1110 temp|p3=1110 1110
for(x=0;x<16;x ) //一开始如果没有给定义的数值 赋值,那么默认为0,所以X=0.
if(key==key_table[x]) 进行查表 对比如果第X个数的值等于KEY,则
{
num=x; //就会吧X的值 赋值给num
break; //退出这个循环
}
display(num); 把值送到显示子函数,
delayms(50);/*这个延时可以加,也可以不加,加上仿真,
用肉眼可以看出程序在不断扫描,不加就看不出来,
但是实际还是在扫描 */
}
}
}
}
Copyright © 2024 妖气游戏网 www.17u1u.com All Rights Reserved