请问您在程序运行到哪您松开的按键? 看下面的片段
if((P1 & 0XF0) != 0XF0) /*如果有p1的电平发生变化,就扫描出是哪个键*/
{
keycode = key_scan();
P0 = disp_code[keycode];
}
程序一旦进入此 if 语句就必然执行显示程序,P0口就必然被刷新,如果不巧您在此段程序中松开的按键,那显示的是啥?
② 单片机行列式键盘程序问题
从代码可知,p2高4位被设置为输出,低4位被设置为输入;
所以,要读入数据时得先向低4位写入数据 1,也就是
P2=key_scen[] 中的 xxxx 1111;
如果有键入(其实就是把对应引脚电平拉低为 0),那么P2的低4位会有变化,即不再是 1111 了,其中的位会有0值出现;
在有键入的同时,此刻读取P2的值就与给P2的输出值是有不同的;
P2&0xf,就是先读取P2值,然后去掉高4位,保留低4位,注意了,此处的运算结果并不是保存回 P2,而是暂时存在内部隐含寄存器中;
③ C语言编程:从键盘上给一个四行四列的行列式赋值,赋值后按四行四列形式输出这个行列式。
#include <stdio.h>
int main() {
int i, j, max,min ;
int a[4][4];
for(i=0; i<4; i++) {
for(j=0; j<4; j++) {
scanf("%d", &a[i][j]);
if(i==0 && j==0) {
max = a[0][0];
min = a[0][0];
} else {
if (max < a[i][j]) max = a[i][j];
if (min > a[i][j]) min = a[i][j];
}
}
}
//Print
for(i=0; i<4; i++) {
for(j=0; j<4; j++) {
printf("%d ", a[i][j]);
}
printf("\n");
}
printf("The Max value is : %d\n", max);
printf("The Min value is : %d\n", min);
return 0;
}
④ 单片机的行列式键盘的工作原理是怎样的
原理:
当键盘上没有键闭合时,所有的行线和列线断开,列线都呈高电平。当行列式键盘上某一个键闭合时,则该键所对应的列线与行线短路。此时列线的电平由相应的行线的电位所决定。
⑤ 如何用c++编程设计求行列式的值
设计一个类,计算行列式的值,行列式的阶数由键盘输入。要求该类可以作为其他类的基类(可继承,用常数列可以替换某列)。
显示信息为:请输入行列式的阶数(1-20):3
请选择输入行列式个元素的方式
1.键盘输入
2.随机函数自动产生请选择:2随机数的位数(1-5):2
行列式:x
x
xx
x
xx
x
x行列式:abc行列式的值:abc=
⑥ 求51单片机行列式键盘源程序
#include <AT89X52.H>
#include<stdio.h>
unsigned char code table[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//共阳数码管显示0~F
void delay() //延时子程序
{
unsigned char n, m;
for (n = 100; n > 0; n--)
for (m = 300; m > 0; m--);
}
void display(unsigned char S) //显示子程序
{
P0 = table[S]; //数码管是P0口驱动的
delay();
P2 = 0x7f; //数码管选通开关(P2.7选通 也就是数码管的第八位 (从左到右顺序))
}
unsigned char Keycan(void) //按键扫描程序 P1.0--P1.3为行线 P1.4--P1.7为列线
{
unsigned char rcode, ccode;
P1 = 0xF0; // 发全0行扫描码,列线输入
if((P1&0xF0) != 0xF0) // 若有键按下
{
delay();// 延时去抖动
if((P1&0xF0) != 0xF0)
{ rcode = 0xFE; // 逐行扫描初值
while((rcode&0x10) != 0)
{
P1 = rcode; // 输出行扫描码
if((P1&0xF0) != 0xF0) // 本行有键按下
{
ccode = (P1&0xF0)|0x0F;
do{;}while((P1&0xF0) != 0xF0); //等待键释放
return ((~rcode) + (~ccode)); // 返回键编码
}
else
rcode = (rcode<<1)|0x01; // 行扫描码左移一位
}
}
}
return 0; // 无键按下,返回值为0
}
void KeyDispaly(unsigned char key)
{
switch(key)
{
case 0x11: display(0); break;
case 0x21: display(1); break;
case 0x41: display(2); break;
case 0x81: display(3); break;
case 0x12: display(4); break;
case 0x22: display(5); break;
case 0x42: display(6); break;
case 0x82: display(7); break;
case 0x14: display(8); break;
case 0x24: display(9); break;
case 0x44: display(10); break;
case 0x84: display(11); break;
case 0x18: display(12); break;
case 0x28: display(13); break;
case 0x48: display(14); break;
case 0x88: display(15); break;
default: break;
}
}
int main(void)
{
unsigned char Key;
while(1)
{
Key = Keycan();
KeyDispaly(Key);
}
return 0;
}
⑦ 单片机行列式按键
现在的笔记本键盘一般都是16+8的方式,即16个pin输出,对应列;8个输入pin脚,对应行。
键盘输入与输出的结构如下:
普通键盘结构及工作原理
键盘一般有独立式和行列式(矩阵式)两种。当然还有其它的结构,比如交 互式结构等等,不过其它的结构比较少用,在这里就不介绍了。在中颖的单片机 中,有些单片机的LCD 驱动引脚的SEGMENT 口可以共享按键扫描口,当选择为按 键扫描口时,可以使用这些口来扫描按键,所以在外部电路可以连接LCD 和按键 矩阵,采用分时扫描进行处理。
⑧ 单片机中的4×4矩阵键盘的键值怎么求
单片机书上应该有讲的哦,多查资料。
既然是4x4,即4行4列了,共需要8个I/O口,有8bit数据(如高四位为行4bit,低四位为列4bit)位:xxxx xxxx。还要结合你的程序来编码键值,如果有键按下了,查询所有按键的所连接的I/O口电平状态,每个按键需要两个I/O口,一端连接行(行4bit之一),一端连接列(列4bit之一);若此时按键的电平状态为0010 0001,即十六进制数据0x21,按下的按键所对应的键值编码即为0x21。当然为了使用方便,在确定了按下按键的编码后,可对其赋值,我要将它赋值为数字键8,方便后续编程使用。例:
//获取键值编码,由于确定哪个按键按下
uchar keyscan(void)//键盘扫描函数,使用行列反转扫描法
{
uchar cord_h,cord_l;//行列值
P3=0x0f; //行线输出全为0
cord_h=P3&0x0f; //读入列线值
if(cord_h!=0x0f) //先检测有无按键按下
{
delay(100); //去抖
if(cord_h!=0x0f)
{
cord_h=P3&0x0f; //读入列线值
P3=cord_h|0xf0; //输出当前列线值
cord_l=P3&0xf0; //读入行线值
return(cord_h+cord_l);//键盘最后组合码值
}
}return(0xff); //返回该值
}
while(1)
{
key=keyscan();//调用键盘扫描,
//keyVal=0~15表示按键对应的功能
switch(key)
{
case 0x7e:keyVal=0;break;//0 按下相应的键显示相对应的码值
case 0x7d:keyVal=1;break;//1
case 0x7b:keyVal=2;break;//2
case 0x77:keyVal=3;break;//3
case 0xbe:keyVal=4;break;//4
case 0xbd:keyVal=5;break;//5
case 0xbb:keyVal=6;break;//6
case 0xb7:keyVal=7;break;//7
case 0xde:keyVal=8;break;//8
case 0xdd:keyVal=9;break;//9
case 0xdb:keyVal=10;break;//a
case 0xd7:keyVal=11;break;//b
case 0xee:keyVal=12;break;//c
case 0xed:keyVal=13;break;//d
case 0xeb:keyVal=14;break;//e
case 0xe7:keyVal=15;break;//f
}
⑨ 单片机4*4行列式键盘程序! 动态显示,开始时,显示“——”,按键后显示相应键值(00—15)
/*行线接P1.0-P1.3,列线接P1.4-P1.7。
根据扫描键盘返回的键值编码查键值编码表,从而得到键值并送数码管显示。
开机时,数码管显示“-”。
当键按下时,数码管显示按下键的键值,蜂鸣器响一声。*/
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit BEEP = P3^6; //蜂鸣器驱动线
uchar key;
unsigned char code disp_code[]={
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf};
unsigned char code key_code[]={
0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d,
0xeb,0xdb,0xbb,0x7b,0xe7,0xd7,0xb7,0x77 };
/**********************************************************
延时子函数
**********************************************************/
void delayms(uint ms)
{
uchar t;
while(ms--)
{
for(t = 0; t < 120; t++);
}
}
/**********************************************************
x*0.14MS 延时子函数
**********************************************************/
void delay0(uchar x)
{
uchar i;
while(x--)
{
for (i = 0; i<13; i++) {;}
}
}
/**********************************************************
蜂鸣器驱动子函数
**********************************************************/
void beep()
{
uchar i;
for (i=0;i<180;i++)
{
delay0(5);
BEEP=!BEEP; //BEEP取反
}
BEEP=1; //关闭蜂鸣器
delayms(250); //延时
}
/**********************************************************
键盘扫描子函数
**********************************************************/
uchar keyscan()
{
uchar scan1,scan2,keycode,j;
P1=0xf0;
scan1=P1;
if((scan1&0xf0)!=0xf0) //判键是否按下
{
delayms(30); //延时30ms
scan1=P1;
if((scan1&0xf0)!=0xf0) //二次判键是否按下
{
P1=0x0f;
scan2=P1;
keycode=scan1|scan2; //组合成键编码
for(j=0;j<=15;j++)
{
if(keycode== key_code[j]) //查表得键值
{
key=j;
return(key);
}
}
}
}
else P1=0xff;
return (16);
}
/**********************************************************
判键是否按下子函数
**********************************************************/
void keydown()
{
P1=0xf0;
if((P1&0xf0)!=0xf0)
{
keyscan();
P0=disp_code[key];
beep();
}
}
/**********************************************************
主函数
**********************************************************/
main()
{
P0 = 0xbf;
P2 = 0x7f; //数码管显示"-"
P1 = 0xff;
while(1)
{
keydown();
}
}
/*********************************************************/