关于一个c51单片机的4*4矩阵键盘扫描程序,我用keil运行,总是有错误,请各位帮帮忙,把错误给修改下。谢

关于一个c51单片机的4*4矩阵键盘扫描程序,我用keil运行,总是有错误,请各位帮帮忙,把错误给修改下。谢,第1张

//电路说明如下。

//单片机:使用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); //显示键值

}

}

第一次认真回答,不采纳没有小鸡鸡。。。。。。。。。。

#include <reg52H>

#include<intrinsh>

#define uint unsigned int

#define uchar unsigned char

//心形显示

//unsigned char code tabP0[]={0x30,0x48,0x44,0x22,0x44,0x48,0x30,0x00};

//unsigned char code tabP2[]={0x7F,0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0xFE};

//圆形显示

unsigned char code tabP0[]={0x00,0x3c,0x42,0x42,0x42,0x42,0x3c,0x00};

unsigned char code tabP2[]={0x7F,0xBF,0x0DF,0x0EF,0x0F7,0x0FB,0x0FD,0x0FE};

//菱形显示

//unsigned char code tabP0[]={0x00,0x08,0x14,0x22,0x41,0x22,0x14,0x08};

//unsigned char code tabP2[]={0x7F,0xBF,0x0DF,0x0EF,0x0F7,0x0FB,0x0FD,0x0FE};

//叉形显示

//unsigned char code tabP0[]={0x00,0x41,0x22,0x14,0x08,0x14,0x22,0x41};

//unsigned char code tabP2[]={0x7F,0xBF,0x0DF,0x0EF,0x0F7,0x0FB,0x0FD,0x0FE};

//中字显示

//unsigned char code tabP0[]={0x00,0x1e,0x12,0x12,0x7f,0x12,0x12,0x1e};

//unsigned char code tabP2[]={0x7F,0xBF,0x0DF,0x0EF,0x0F7,0x0FB,0x0FD,0x0FE};

/

名称 : Delay_1ms()

功能 : 延时子程序,延时时间为 1ms x

输入 : x (延时一毫秒的个数)

输出 : 无

/

void Delay_1ms(uchar i)//1ms延时

{

uchar x,j;

for(j=0;j<i;j++)

for(x=0;x<=148;x++);

}

/

名称 : Main()

功能 : 主函数

输入 : 无

输出 : 无

/

void main()

{

int i;

while(1)

{

for(i=0;i<8;i++)

{

P0=0;

P2=tabP2[i];

P0=tabP0[i];

Delay_1ms(2);

}

}

}

键盘为44矩阵式连接,一共有16个按键。 工作原理为。P1端的低四位为列,高四位行。所先置低四位为低,高四位为高,当有按键按下时高四位就会有某位被拉低。只要判断高四位不为全高就说明有按键按下。判断有按键按下后就要判断是某位按下的,方法为,选将高四位的某一位置低。判断低四位是否有低电平出现。依次对高四位的每位置低并判断低四位出现的低电平。如高四位某位置低后低四某也有出现低电平。这样就能判断出低四位与高四位相连的位某位按键被按下了。通过定义好的编码就可以查出是某个按键被按下了,程序将按键值通过查表并发送到LED上显示。 6位LED为动态扫描方式 。先显示第一位,延时一定时间后在显示第二位依次类推。。。 共有17个按键。按下按键后数码管显示相应的数字,并左移一位。uchar kbscan(void) /键扫描函数/{uchar j; uchar sccode,recode; P2=0x0f; /发0行扫描码/ if((P2 & 0x0f)!= 0x0f) /若有键按下/ { dlms(); if((P2&0x0f)!= 0x0f) /逐行扫描初值/ { sccode=0xfe; for(j=4;j>0;j--) { while((sccode&0x10)!=0) { P2=sccode; /输出行扫描码/ if((P2&0xf0)!=0xf0) /本行有键按下/ { recode=(P2&0xf0)|0x0f; return((~sccode)+(~recode)); /返回特征字节码/ } else sccode=(sccode<<1)|0x01; /行扫描码做移一位/ } } } } return(0); /无键按下,返回0值/}参考链接: >

这个很好处理呀,比如以下举例,独立+矩阵,实现独立按键相当于类似SHIFT作用的效果。

#include<reg51h>

#define uchar unsigned char

uchar tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //0到f

uchar keyval,num;

sbit skey=P1^0; //独立键P10

void delay(uchar a)

{

uchar i,j;

for(i=0;i<a;i++)

for(j=0;j<125;j++);

}

uchar kbscan(void) //矩阵键扫描程序

{

unsigned char sccode,recode;

P3=0x0f; //发0扫描,列线输入

if ((P3 & 0x0f) != 0x0f) //有键按下

{

delay(20); //延时去抖动

if ((P3&0x0f)!= 0x0f)

{

sccode = 0xef; //逐行扫描初值

while((sccode&0x01)!=0)

{

P3=sccode;

if((P3&0x0f)!=0x0f)

{

recode=(P3&0x0f)|0xf0;

while((P3&0x0f)!=0x0f);//等待键抬起

return((~sccode)+(~recode));

}

else

sccode=(sccode<<1)|0x01;

}

}

}

return 0; //无键按下,返回0

}

void getkey(void)

{

unsigned char key;

key=kbscan();

if(key==0)

{

return;

}

switch(key)

{

case 0x11:keyval=7;break;

case 0x12:keyval=4;break;

case 0x14:keyval=1;break;

case 0x18:keyval=10;break;

case 0x21:keyval=8;break;

case 0x22:keyval=5;break;

case 0x24:keyval=2;break;

case 0x28:keyval=0;break;

case 0x41:keyval=9;break;

case 0x42:keyval=6;break;

case 0x44:keyval=3;break;

case 0x48:keyval=11;break;

case 0x81:keyval=12;break;

case 0x82:keyval=13;break;

case 0x84:keyval=14;break;

case 0x88:keyval=15;break;

default:keyval=0xff;break;

}

//以下处理独立按键

if(skey==0)

{

if(keyval!=0xff)keyval+=16; //如果独立键按下,键值加16

while(skey==0); //等待独立键释放

}

}

void t0isr() interrupt 1

{

TH0=(65536-10000)/256;

TL0=(65536-10000)%256;

switch(num)

{

case 0:P2=0x01;break;

case 1:P2=0x02;break;

case 2:P2=0x04;break;

case 3:P2=0x08;break;

default:break;

}

if(keyval<16) P0=~tab[keyval]; //独立键未按正常显示

else P0=~(tab[keyval]|0x80); //独立键按下显示+DP

num++;

num&=0x03;

}

main()

{

TMOD=0x01;

TH0=(65536-10000)/256;

TL0=(65536-10000)%256;

TR0=1;

ET0=1;

EA=1;

while(1)

{

getkey();

}

}

下面是在P1口接4X3矩阵键盘的驱动程序,供你参考。上拉电阻也可以不用

code U8 kcode[]={0xb7,0xbe,0xde,0xee,0xbd,0xdd,0xed,0xbb,0xdb,0xeb,0xd7,0xe7};

//反转码对应键值  0    1    2    3    4    5    6    7    8    9    A    B

U8 key(void)

{ U8 a,r = 0xff;

 delay_ms(20); // 延时20毫秒,消除按键抖动

 if(P1 == 0xf0) goto rn;

 a = P1;

 P1 = a | 0x0f;

 delay_ms(20);

 a = P1;

 for (r = 0;r <= 11;r++)

 {    if(a == kcode[r]) break;

 };

rn: P1 = 0xf0;

 return r;

}

以上就是关于关于一个c51单片机的4*4矩阵键盘扫描程序,我用keil运行,总是有错误,请各位帮帮忙,把错误给修改下。谢全部的内容,包括:关于一个c51单片机的4*4矩阵键盘扫描程序,我用keil运行,总是有错误,请各位帮帮忙,把错误给修改下。谢、求 51单片机 4*4矩阵键盘 控制8*8点阵 显示 的语音 程序。、C51 4*4键盘扫描程序(c语言)等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址: http://outofmemory.cn/zz/9435356.html

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

发表评论

登录后才能评论

评论列表(0条)

保存