百燕之家 / 问答 / 详情

单片机行列式按键

2023-10-07 18:11:12
寻云

  现在的笔记本键盘一般都是16+8的方式,即16个pin输出,对应列;8个输入pin脚,对应行。

  键盘输入与输出的结构如下:

  在Idel状态下,EC把16条输出线全部拉低,使能键盘扫描中断,这样当任意一个按键按下时,就会触发中断(ICU的INT11h),然后EC就开始逐列扫面,比如OUT(0,1,……,15)输出(1,1,……,1,0),(1,1,……,0,1)……(0,1,……,1,1),当数一个列扫描码,得到的行如输入信号为有一个为0的时候,这是得到的列扫描码与行扫描码就是这个键的扫面码。比如上图按下S6的时候,列与行扫描码就分别为1101,1011。然后通过扫描码在Scan table里面找对应的键码,传给OS,确定是哪个键。

  在上面的图中,我们看到,在输入信号每个上面都有上拉电阻,这个电阻必须有除非EC的输入pin脚上面的有足够的上拉能力,否则扫描就会出现错误。

  下图中,是一个正常的键盘矩阵图。键盘上面的数字就与下面矩阵里面相同的数字对应。

  普通键盘结构及工作原理

  键盘一般有独立式和行列式(矩阵式)两种。当然还有其它的结构,比如交 互式结构等等,不过其它的结构比较少用,在这里就不介绍了。在中颖的单片机 中,有些单片机的LCD 驱动引脚的SEGMENT 口可以共享按键扫描口,当选择为按 键扫描口时,可以使用这些口来扫描按键,所以在外部电路可以连接LCD 和按键 矩阵,采用分时扫描进行处理。

meira

为什么 指定用 switch 语句??

/***4×4矩阵按键构架——火柴天堂作品-20110921***/

/***源程序默认硬件环境:52单片机,12MHz晶振,P1口 4×4矩阵键盘,详细布局如下***/

/* 默认矩阵布局,按键扫描方式1使用

P0 P1 P2 P3

│ │ │ │

P4─┼──┼──┼──┤ S1 S2 S3 S4

│ │ │ │

P5─┼──┼──┼──┤ S5 S6 S7 S8

│ │ │ │

P6─┼──┼──┼──┤ S9 S10 S11 S12

│ │ │ │

P7─┴──┴──┴──┘ S13 S14 S15 S16

*/

#include"reg52.h" //包含52头文件

#define TRUE 1 //定义布尔量"1":真

#define FALSE 0 //定义布尔量"0":假

#define uchar unsigned char //定义 无符号字符型数据 简称

#define uint unsigned int //定义 无符号整型数据 简称

#define KeyPort P1

#define Key1Value 1

#define Key2Value 2

//uchar code KeyCodeList[16]={0xee,0xed,0xeb,0xe7,0xde,0xdd,0xeb,0xe7,0xbe,0xbd,0xbb,0xb7,0x7e,0x7d,0x7b,0x77};//按键代码列表,按键扫描方式2使用,可按需要随意修改顺序

uchar KeyScan() //按键扫描函数(方式1,需配合源程序矩阵布局,返回值0表示无按键,1-16为对应按键),缺点:无法扫描组合键(同时按2个按键以上)

{

uchar temp_h,temp_l,scan_value,i;

KeyPort=0xf0; //设置低4位为0(扫描线),准备读取高4位(返回线)状态

if(KeyPort==0xf0) return 0; //若高4位状态不变,表示无按键,返回无按键 键值0

temp_h=~KeyPort>>4; //若高4位状态改变,表示有按键,读取高4位,并将结果转成正逻辑(按键对应 行线 为 1 )存在temp_h低位上

KeyPort=0x0f; //设置高4位为0(扫描线),准备读取低4位(返回线)状态

temp_l=~(KeyPort|0xf0); //读取低4位,并将结果转成正逻辑(按键对应 列线 为 1 )存在temp_l低位上

while(i<4) //将 按键行线号 转成数值

{

if((temp_h>>i)==0x01) break; //读取按键行线号

i++;

}

if(i==4) return 0; //若读取出错,返回无按键

temp_h=i; //将 按键行线数值 结果存于 temp_h

i=0;

while(i<4) //将 按键列线号 转成数值

{

if((temp_l>>i)==0x01) break; //读取按键列线号

i++;

}

if(i==4) return 0; //若读取出错,返回无按键

temp_l=i; //将 按键列线号 结果存于 temp_l

scan_value=(temp_h<<2)+temp_l+1; //合并行列线数值,并转成按键值,每条行线键值差为 4(temp_h<<2),按键值从1开始(+1,0为无按键 键值)

return scan_value; //返回 按键值

}

/*

uchar KeyScan() //按键扫描函数(方式2,需配合 按键代码列表 数组 进行 键值 查询,返回值0表示无按键,1-16为代码表顺序对应按键),缺点:无法扫描组合键

{

uchar temp,i;

KeyPort=0xf0; //设置低4位为0(扫描线),准备读取高4位(返回线)状态

if(KeyPort==0xf0) return 0; //若高4位状态不变,表示无按键,返回无按键 键值0

temp=KeyPort|0x0f; //若高4位状态改变,表示有按键,读取高4位,并将结果存于 temp 的高4位

KeyPort=0x0f; //设置高4位为0(扫描线),准备读取低4位(返回线)状态

temp&=(KeyPort|0xf0); //读取低4位,并将结果存于 temp 的低4位

while(i<16) //将按键行列线代码转换成键值

{

if(temp==KeyCodeList[i]) break; //将 行列线 代码与 按键代码表 进行对比,若一致则结束对比

i++; //进行下一个对比

}

if(i==16) return 0; //若查询出错,或 行列线代码 不在 按键代码表中,返回无按键 键值0

return i+1; //返回按键值1~16(按键代码列表中元素下标+1,0为无按键 键值)

}

*/

void KeyResp() //按键响应函数

{

static uchar KeyValue; //定义静态变量-按键值,

static bit KeyDownFlag,KeyReadyFlag; //定义静态标志位-按键按下标志,按键准备(响应)标志

uchar key_value=KeyScan(); //调用扫描函数,并将结果临时存放于key_value 中

if(key_value) //若扫描结果为真(即有按键)

{

KeyValue=key_value; //保存扫描结果

KeyDownFlag=TRUE; //按键按下标志 置位

KeyReadyFlag=TRUE; //按键准备(响应)标志 置位

}

else KeyDownFlag=FALSE; //若扫描结果为假(即无按键),则清空按键按下标志

if(KeyReadyFlag && !KeyDownFlag) //若 按键已准备(响应),且无按键按下,(可知为 按下后又松手情况)

{

switch(KeyValue) //查找 按键值 对应的 按键处理

{

case Key1Value:break; //按键1处理

case Key2Value:break; //按键2处理

//case Key3Value:break;//......... //按键N处理

default:break; //无对应按键,或其它按键值处理

}

KeyValue=0; //清除按键值

KeyReadyFlag=FALSE; //清空 按键准备(响应)标志

}

}

void main() //主函数

{

while(1) //循环系统

{

KeyResp(); //调用 按键响应函数

}

}

说明行列式键盘的意义和生活中产品的运用?

行列式键盘(Matrix Keyboard)是一种键盘布局方式,它的每一行和每一列都连通,通过对每个按键进行编址来实现输入。与传统键盘不同,它可以自定义布局,具有更高的效率和更好的人体工程学设计。生活中,行列式键盘的应用比较广泛,例如:游戏玩家:许多游戏玩家喜欢使用行列式键盘,因为它们可以自定义按键布局,更符合他们的游戏习惯和需要。程序员:程序员常常需要频繁地使用各种快捷键和组合键,使用行列式键盘可以提高他们的效率和舒适度。办公人员:办公人员在日常工作中也需要经常使用键盘,使用行列式键盘可以减少他们的手指疲劳和打字错误。总之,行列式键盘在生活中的应用领域非常广泛,对于那些需要长时间使用键盘的人来说,它们是一个非常好的选择。
2023-10-02 12:47:311

行列式矩阵式键盘的工作方式主要有

行列式矩阵式键盘的工作方式主要有:它的行线与按键的一个引脚相连,列线与按键的另一个引脚相连。平时列线被置成低电平,没有按键被按下时,行线保持高电平,而有按键被按下时,行线被拉成低电平。这时候控制器知道有按键被按下,但只能判断出在哪一行,不能判断出在哪一列,因此接下来就要进行键盘扫描,以确定具体是哪个按键被按下。键盘一般有独立式和行列式(矩阵式)两种。
2023-10-02 12:47:391

独立式键盘与行列式键盘的特点和不足是什么?

独立按键优点:可以直接读取,检测占用时间较少,不受其他因素影响 缺点:占用IO口资源较多,每一个按键都独占一个IO口。 矩阵键盘优点:占用IO口资源较少。 缺点:必须扫描检测按键情况,程序复杂,占用时间较多。
2023-10-02 12:47:471

试述矩阵式键盘判别键闭合的方法。

【答案】:矩阵式键盘又称行列式键盘,I/O端线分为行线和列线,按键跨接在行线和列线上。按键按下时,行线与列线发生短路。根据这一特点,可按下列步骤操作:①置列线为输入态,从行线输出低电平,读入列线数据,若某一列线为低电平,则该列线上有键闭合;②置行线为输入态,从列线输出低电平,读入行线数据,若某一行线为低电平,则该行线上有键闭合;③综合①、②两步的结果,可确定按键编号。
2023-10-02 12:47:551

行列式键盘的工作方式主要有

编程扫描方式和中断扫描方式。根据查询知到题库,行列式键盘的工作方式主要有编程扫描方式和中断扫描方式。
2023-10-02 12:48:031

完成一个4×4的行列式键盘至少需要几个单片机口线

完成一个4×4的行列式键盘至少需要8个单片机口线。根据查询相关资料信息显示,4x4,即4行4列了,共需要8个I/O口,只需要占用8个端口就可以控制16个按键。
2023-10-02 12:48:141

独立式按键与行列式键盘各有什么特点

独立式按键是直接用I/O口线构成的单个按键电路,其特点是每个按键单独占用一根I/O口线,每个按键的工作不会影响其他I/O口线的状态。适合于八键以下使用。行列式键盘由行线和列线组成。其特点是在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接。在按键数量较多时,行列式键盘较之独立式按键键盘要节省很多I/O口,适合于八个键以上使用。扩展资料:独立式按键电路配置灵活,软件结构简单,但每个按键必须占用一个I/O口线,因此,在按键较多时,I/O口线浪费较大,不宜采用。单片机控制系统中,如果只需要几个功能键,此时,可采用独立式按键结构。独立按键的软件常采用查询式结构。先逐位查询与I/O口线的输入状态,如某一根I/O口线输入为低电平,则可确认该I/O口线所对应的按键已按下,然后,再转向该键的功能处理程序。行列式键盘的原理是当按键没有按下时,所有的输入端都是高电平,代表无键按下。行线输出是低电平,一旦有键按下,则输入线就会被拉低,这样,通过读入输入线的状态就可得知是否有键按下了。
2023-10-02 12:48:261

单片机扩展键盘是由若干个什么组成的开关矩阵,用于向单片机输入数字、字符等?

单片机扩展键盘是由若干个什么组成的开关矩阵,用于向单片机输入数字、字符等?单片机扩展键盘?  开关矩阵?  输入数字、字符?乱讲些什么呀!-------------------单片机外接的,只能是:开关。多个开关,当然可以排列成几行几列的形式。这种电路结构,可称为“行列式键盘”或“开关阵列”。不能叫做“矩阵”。矩阵,这个词,是有特定含义的,不可滥用。-------------------另外,开关,只能向单片机送去“高、低电平”信号。任何开关,也不能向单片机输入“数字、字符”。-------------------出这题目的老师,基本概念,不清。
2023-10-02 12:49:221

求助请问一个关于行列式键盘的问题

∵一个36键的行列式键盘,可以设计成√36×√36=6*6的形式,需要占用6+6=12根引脚线,而如果从这12根引脚线中任意《偷工减料》一根,则只能最多设计成5×6=30键的键盘,不敷使用。∴32键的行列式键盘,最少需要占用12根引脚线。可以设计成6×6(4个键位不用)、5×7(3个键位废弃)、4×8的形式。
2023-10-02 12:49:371

行列式键盘的扫描方式有哪两种各自优缺点?

现场的扫描方式有哪些两种各自的缺点 它的话在于
2023-10-02 12:49:5015

对于矩阵式非编码键盘,是如何理解的?

先得搞清楚:由独立按键构成的键盘。
2023-10-02 12:51:042

单片机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 intsbit 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(); }}/*********************************************************/
2023-10-02 12:51:131

数学行列式和矩阵在电脑里面怎么打出来?

用哪个软件排?
2023-10-02 12:51:323

4x4按键矩阵原理是什么?为什么要移位?他是怎么样确认按键位置的,求教大神

已经不错了,用一两年。正常情况下就是一年半左右。
2023-10-02 12:51:425

老师要求用单片机来做4×8行列式的键盘扫描实物,要用到以下两个软件,要求也在下面

有300RMB就可以完成,包括元器件。
2023-10-02 12:52:093

写一个2*4的矩阵式按键的检测程序,方便移植

电脑面51行明877A现台电脑面没源代码4×4矩阵式键盘识别技术实验任务图4.14.2所示用AT89S51并行口P1接4×4矩阵键盘P1.0-P1.3作输入线P1.4-P1.7作输线;数码管显示每按键0-F序号应按键序号排列图4.14.1所示图4.14.1硬件电路原理图图4.14.2系统板硬件连线单片机系统区域P3.0-P3.7端口用8芯排线连接4X4行列式键盘区域C1-C4 R1-R4端口;单片机系统区域P0.0/AD0-P0.7/AD7端口用8芯排线连接四路静态数码显示模块区域任a-h端口;要求:P0.0/AD0应着aP0.1/AD1应着b……P0.7/AD7应着h程序设计内容4×4矩阵键盘识别处理每按键行值列值 行值列值组合识别按键编码矩阵行线列线别通两并行接口CPU通信每按键状态同需变数字量01关端(列线)通电阻接VCC接通程序输数字0实现键盘处理程序任务:确定键按判断哪键按键功能;要消除按键闭合或断抖两并行口输扫描码使按键逐行态接另并行口输入按键状态由行扫描值馈信号共同形键编码识别按键通软件查表查该键功能程序框图图4.14.3汇编源程序KEYBUF EQU 30HORG 00HSTART: MOV KEYBUF,#2WAIT: MOV P3,#0FFHCLR P3.4MOV A,P3ANL A,#0FH XRL A,#0FHJZ NOKEY1LCALL DELY10MSMOV A,P3ANL A,#0FHXRL A,#0FHJZ NOKEY1MOV A,P3ANL A,#0FHCJNE A,#0EH,NK1MOV KEYBUF,#0LJMP DK1NK1: CJNE A,#0DH,NK2MOV KEYBUF,#1LJMP DK1NK2: CJNE A,#0BH,NK3MOV KEYBUF,#2LJMP DK1NK3: CJNE A,#07H,NK4MOV KEYBUF,#3LJMP DK1NK4: NOPDK1: MOV A,KEYBUFMOV DPTR,#TABLEMOVC A,@A+DPTRMOV P0,ADK1A: MOV A,P3ANL A,#0FHXRL A,#0FHJNZ DK1ANOKEY1:MOV P3,#0FFHCLR P3.5MOV A,P3ANL A,#0FHXRL A,#0FHJZ NOKEY2LCALL DELY10MSMOV A,P3ANL A,#0FHXRL A,#0FHJZ NOKEY2MOV A,P3ANL A,#0FHCJNE A,#0EH,NK5MOV KEYBUF,#4LJMP DK2NK5: CJNE A,#0DH,NK6MOV KEYBUF,#5LJMP DK2NK6: CJNE A,#0BH,NK7MOV KEYBUF,#6LJMP DK2NK7: CJNE A,#07H,NK8MOV KEYBUF,#7LJMP DK2NK8: NOPDK2: MOV A,KEYBUFMOV DPTR,#TABLEMOVC A,@A+DPTRMOV P0,ADK2A: MOV A,P3ANL A,#0FHXRL A,#0FHJNZ DK2ANOKEY2:MOV P3,#0FFHCLR P3.6MOV A,P3ANL A,#0FHXRL A,#0FHJZ NOKEY3LCALL DELY10MSMOV A,P3ANL A,#0FHXRL A,#0FHJZ NOKEY3MOV A,P3ANL A,#0FHCJNE A,#0EH,NK9MOV KEYBUF,#8LJMP DK3NK9: CJNE A,#0DH,NK10MOV KEYBUF,#9LJMP DK3NK10: CJNE A,#0BH,NK11MOV KEYBUF,#10LJMP DK3NK11: CJNE A,#07H,NK12MOV KEYBUF,#11LJMP DK3NK12: NOPDK3:MOV A,KEYBUFMOV DPTR,#TABLEMOVC A,@A+DPTRMOV P0,ADK3A: MOV A,P3ANL A,#0FHXRL A,#0FHJNZ DK3ANOKEY3:MOV P3,#0FFHCLR P3.7MOV A,P3ANL A,#0FHXRL A,#0FHJZ NOKEY4LCALL DELY10MSMOV A,P3ANL A,#0FHXRL A,#0FHJZ NOKEY4MOV A,P3ANL A,#0FHCJNE A,#0EH,NK13MOV KEYBUF,#12LJMP DK4NK13: CJNE A,#0DH,NK14MOV KEYBUF,#13LJMP DK4NK14: CJNE A,#0BH,NK15MOV KEYBUF,#14LJMP DK4NK15: CJNE A,#07H,NK16MOV KEYBUF,#15LJMP DK4NK16: NOPDK4: MOV A,KEYBUFMOV DPTR,#TABLEMOVC A,@A+DPTRMOV P0,ADK4A: MOV A,P3ANL A,#0FHXRL A,#0FHJNZ DK4ANOKEY4:LJMP WAITDELY10MS:MOV R6,#10D1: MOV R7,#248DJNZ R7,$DJNZ R6,D1RETTABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07HDB 7FH,6FH,77H,7CH,39H,5EH,79H,71HENDC语言源程序#include unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};unsigned char temp;unsigned char key;unsigned char i,j;void main(void){while(1){P3=0xff;P3_4=0;temp=P3;temp=temp & 0x0f;if (temp!=0x0f){for(i=50;i>0;i--)for(j=200;j>0;j--);temp=P3;temp=temp & 0x0f;if (temp!=0x0f){temp=P3;temp=temp & 0x0f; switch(temp){case 0x0e:key=7;break;case 0x0d:key=8;break;case 0x0b:key=9;break;case 0x07:key=10;break;}temp=P3;P1_0=~P1_0;P0=table[key];temp=temp & 0x0f; while(temp!=0x0f){temp=P3;temp=temp & 0x0f; }}}P3=0xff;P3_5=0;temp=P3;temp=temp & 0x0f;if (temp!=0x0f){for(i=50;i>0;i--)for(j=200;j>0;j--);temp=P3;temp=temp & 0x0f;if (temp!=0x0f){temp=P3;temp=temp & 0x0f; switch(temp){case 0x0e:key=4;break;case 0x0d:key=5;break;case 0x0b:key=6;break;case 0x07:key=11;break;}temp=P3;P1_0=~P1_0;P0=table[key];temp=temp & 0x0f; while(temp!=0x0f){temp=P3;temp=temp & 0x0f; }}}P3=0xff;P3_6=0;temp=P3;temp=temp & 0x0f;if (temp!=0x0f){for(i=50;i>0;i--)for(j=200;j>0;j--);temp=P3;temp=temp & 0x0f;if (temp!=0x0f){temp=P3;temp=temp & 0x0f; switch(temp){case 0x0e:key=1;break;case 0x0d:key=2;break;case 0x0b:key=3;break;case 0x07:key=12;break;}temp=P3;P1_0=~P1_0;P0=table[key];temp=temp & 0x0f; while(temp!=0x0f){temp=P3;temp=temp & 0x0f; }}}P3=0xff;P3_7=0;temp=P3;temp=temp & 0x0f;if (temp!=0x0f){for(i=50;i>0;i--)for(j=200;j>0;j--);temp=P3;temp=temp & 0x0f;if (temp!=0x0f){temp=P3;temp=temp & 0x0f; switch(temp){case 0x0e:key=0;break;case 0x0d:key=13;break;case 0x0b:key=14;break;case 0x07:key=15;break;}temp=P3;P1_0=~P1_0;P0=table[key];temp=temp & 0x0f; while(temp!=0x0f){temp=P3;temp=temp & 0x0f; }}}}}
2023-10-02 12:52:191

单片机键盘扫描程序

郭天祥视频
2023-10-02 12:52:306

一个RS232接口的矩阵键盘,需要每个按键按下后发送一个数据,请问怎么改在线等

怎么做才是对的
2023-10-02 12:52:582

如何利用89C51单片机与8279实现键盘接口电路显示

第六章 单片机接口技术应用在设计各种单片机应用系统中,还需扩展很多外部接口器件才能充分发挥单片机的智能控制功能。如扩展键盘与显示器件接口,可实现人机对话功能;扩展A/D转换接口,可实现对外部各种模拟信号的检测与转换;扩展D/A转换接口可将数字信号转换为模拟信号,从而完成对控制对象的驱动。本章将主要介绍常见的键盘、显示(LED、LCD)、A/D和D/A转换接口电路。第一节 键盘接口电路键盘是计算机最常用的输入设备,是实现人机对话的纽带。按其结构形式可分为非编码键盘和编码键盘。编码键盘采用硬件方法产生键码。每按下一个键,键盘能自动生成键盘代码,键数较多,且具有去抖动功能。这种键盘使用方便,但硬件较复杂,PC机所用键盘即为编码键盘。非编码键盘仅提供按键开关工作状态,其键码由软件确定,这种键盘键数较少,硬件简单,广泛应用于各种单片机应用系统,本书主要介绍非编码键盘的设计与应用。一、 独立式键盘按照键盘与单片机的连接方式可分为独立式键盘与矩阵式键盘。独立式键盘相互独立,每个按键占用一根I/O口线,每根I/O口线上的按键工作状态不会影响其他按键的工作状态。这种按键软件程序简单,但占用I/O口线较多(一根口线只能接一个键),适用于键盘应用数量较少的系统中。图6-1为4个独立式按键的应用电路。其键盘程序如下: 1.键闭合测试,检查是否有键闭合KCS:MOV P1,#0FFHMOV A,P1CPL AANL A,#0FHRET若有键闭合,则(A≠0), 若无键闭合,则(A=0)。2.去抖动当测试到有键闭合后,需进行去抖动处理。由于按键闭合时的机械弹性作用,按键闭合时不会马上稳定接通,按键断开时也不会马上断开,由此在按键闭合与断开的瞬间 会出现电压抖动,如图6-2所示。键盘抖动的时间一般为5~10ms,抖动现象会引起CPU对一次键操作进行多次处理,从而可能产生错误,因而必须设法消除抖动的不良后果。通过去抖动处理,可以得到按键闭合与断开的稳定状态。去抖动的方法有硬件与软件两种:硬件方法是加去抖动电路,如可通过RS触发器实现硬件去抖动;软件方法是在第一次检测到键盘按下后,执行一段10ms的延迟子程序后再确认该键是否确实按下,躲过抖动,待信号稳定之后,再进行键扫描。通常多采用软件方法。 3.采用查询方式确定键位如图可见,若某键闭合则相应单片机引脚输入低电平。4.键释放测试键盘闭合一次只能进行一次键功能操作,因此必须等待按键释放后再进行键功能操作,否则按键闭合一次系统会连续多次重复相同的键操作。(对于开关式按键,可不必等待键释放)。程序如下:KEY:ACALL KCS ;检查有键闭合否 JZ RETURN ;无键闭合则返回 ACALL DELAY ;有键闭合,延时12ms消抖动KEY0:JNB ACC.0,KEY1 ;不是0号键,查下一键KSF0: ACALL DELAY ;是0号键,调延时等待键释放 ACALL KCS ;检查键释放否 JNZ KSF0 ;没释放等待 ACALL FUN0 ;若键已释放,执行0号键功能 JMP RETURN ;返回KEY1: JNB ACC.1,KEY2 ;检测1号键KSF1: ACALL DELAY ACALL KCS JNZ KSF1 ACALL FUN1…KEY3:JNB ACC.3,RETURN ;检测3号键KSF3:ACALL DELAY ACALL KCS JNZ KSF3ACALL FUN3RETURN: RET ;子程序返回二、矩阵式键盘矩阵式键盘又称行列式键盘,见图6-3。图中,P1口的8根口线分别作为4根行线与4根列线,在其行、列交汇点接有16个键盘。与独立式键盘相比,单片机口线资源利用率提高了一倍。但若需要更多的键盘,需采用接口扩展的方式,见图6-4。图中利用8155芯片进行键盘扩展,利用PA口作为输出口,8根口线作为列线,利用PC口作为输入口,4根口线作为行线,由此产生32键的矩阵式键盘。这种键盘采用扫描方式检测按键闭合情况及识别确定键码,因此称扫描方式键盘。(一)扫描方式键盘工作原理图6-4 32键矩阵式键盘应用电路1.键闭合测试图6-4中,键盘的行线一端经电阻接+5V电源,另一端通过8155 PC口送单片机。各列线的一端通过8155PA口连至单片机,另一端悬空。首先由PA口向所有列线输出低电平,然后再由PC口输入各行线状态。若行线状态皆为高电平,则表示无键闭合;若行线状态中有低电平则表明有键闭合。设8155A口地址为0101H,C口地址为0103H,键闭合测试子程序KCS如下:KCS:MOV DPTR,#0101H ;送A口地址 MOV A,#00H ;A口送00H MOVX @DPTR,A INC DPTR INC DPTR ;建立C口地址 MOV A,@DPTR ;读C口 CPL A ;A取反,无键闭合则全为0 ANL A,#0FH ;屏蔽A高半字节 RET该程序功能是检查是否有键闭合,若有键闭合则(A)≠0,否则(A)=0。2.去抖动仍采用软件延时的方法。3.键位识别为了准确判断闭合键的位置,要对每个按键进行编码。根据矩阵式键盘的结构,采用行扫描的键位识别方法。使某条列线为低电平,如果这条列线上没有闭合键,则各行线的状态都为高电平;如果列线上有键闭合,则相应的那条行线即变为低电平。于是就可以根据行线号与列线号计算出闭合键的键码。扫描时由第一列开始,即由PA口先输出0FEH,然后由PC口输入行线状态,判断哪一行有键闭合,若无键闭合,再输出0FDH检测下一列各行键闭合状态,由此一直扫描下去。根据图6-4 中各键的编号情况,各键的键码可按如下公式计算: 键码 = 行首键号+列号4.键释放测试(二)键盘扫描程序EKY: ACALL KCS ;检查有键闭合否 JNZ LK1 ;有键按下则转移至消抖动 AJMP KEY ;无键按下则返回LK1: ACALL DELAY ;12ms延时消抖动 ACALL KCS ;再查有键闭合否 JZ KEY ;有键闭合则进行键扫描计算键码 MOV R2,#0FEH ;置第一列扫描值 MOV R4,#00H ;置初始列号XYL: MOV DPTR,#0101H ;建立A口地址 MOV A,R2 MOVX @DPTR,A ;输出扫描初值 INC DPTR INC DPTR ;建立C口地址 MOVX A,@DPTR ;读C口 JB ACC.0,LINE1 ;第一行无键闭合,转查第二行 MOV A,#00H ;第一行有键闭全,置第一行首键值 AJMP KJS ;转到计算键码LINE1: JB ACC.1,LINE2 ;第二行无键闭合,转查第三行 MOV A,#08H ;第二行有键闭全,置第二行首键值 AJMP KJS ;转到计算键码LINE2: JB ACC.2,LINE3 ;第三行无键闭合,转查第四行 MOV A,#10H ;第三行有键闭全,置第三行首键值 AJMP KJS ;转到计算键码LINE3: JB ACC.3,NEXT ;第四行无键闭全,转查下一列 MOV A,#18H ;第四行有键闭全,置第四行首键值KJS: ADD A,R4 ;计算键码 PUSH ACC ;保存键码KSF: ACALL DELAY ACALL KCS ;键释放否,若仍闭合则延时等待 JNZ KSF POP ACC ;若键已释放,则键码送A RETNEXT: INC R4 ;列扫描号加1 MOV A,R2 JNB ACC.7,KEY ;第8列已扫描完则进行下一循环扫描 RL A ;置下一列列扫描值 MOV R2,A AJMP XYL ;扫描下一列 此程序执行后,键码保存在累加器A中。主程序可根据累加器A中的键码执行相应的功能程序。(三)键盘扫描的中断控制方式在单片机系统中,CPU除了对键盘进行处理外,还要进行数据处理、结果输出显示及其它各种控制,因此键盘处理不应占用CPU过多的时间,但又必须保证CPU能够检测到键盘的工作。为提高CPU的工作效率,可采用中断扫描方式。当无键闭合时,CPU处理自已的工作,当有键闭合时,产生中断请求,CPU转去执行键盘扫描子程序并执行相应的功能。图6-5 即为采用中断方式的键盘扫描电路。与图6-3相比,本电路采用4输入与门用于产生键盘中断,其输入端与各行线相连,输出端接至8031的外部中断输入端 。当无键盘闭合时,与门各输入端均为高电平,输出端为高电平;当有键闭合时, 为低电平,于是向CPU申请中断。若CPU开放中断,则会响应该键盘中断,转去执行键盘扫描子程序。第二节 LED显示接口电路一、LED显示器LED(Light Emitting Diode)显示器是由发光二极管作为显示字段的数码型显示器件,具有显示清晰、成本低廉、配置灵活、与单片机接口简单易行的特点,在单片机应用系统中得到了广泛的应用。1.LED显示器结构与分类LED显示器内部由7段发光二极管组成,因此亦称之为七段LED显示器,由于主要用于显示各种数字符号,故又称之为LED数码管。每个显示器还有一个圆点型发光二极管(用符号DP表示),用于显示小数点,图6-6为LED显示器的符号与引脚图。根据其内部结构,LED显示器可分为共阴极与共阳极两种LED显示器,见图6-7所示。(a)共阴极结构 (b)共阳极结构图6-6 LED显示器的符号与引脚图 图6-7 LED显示器内部结构图(1)共阴极LED显示器。图6-7(a)为共阴极LED显示器的内部结构。图中各二极管的阴极连在一起,公共端接低电平时,若某段阳极加上高电平则该段发光二极管就导通发光,而输入低电平的段则不发光。(2)共阳极LED显示器。图6-7(b)为共阳极LED显示器的内部结构。图中各二极管的阳极连在一起,公共端接高电平时,若某段阴极加上低电平则该段发光二极管就导通发光,而输入高电平的段则不发光。LED数码管通常有红色、绿色、黄色三种,以红色应用最多。由于二极管的发光材料不同,数码管有高亮与普亮之分,应用时根据数码管的规格与显示方式等决定是否加驱动电路。2.LED显示器的段码7段LED显示器可采用硬件译码与软件译码两种方式。在数字电路中曾介绍硬件译码显示方法,如利用74LS47等实现译码显示,这里主要介绍软件方式实现译码显示。加在显示器上对应各种显示字符的二进制数据称为段码。数码管中,七段发光二极管加上一个小数点位共计8段,因此段码为8位二进制数,即一个字节。由于点亮方式不同,共阴与共阳两种LED数码管的段码是不同的,详见表6-1。表6-1 LED数码管段码表字型 共阳极段码 共阴极段码 字型 共阳极段码 共阴极段码0 C0H 3FH 9 90H 6FH1 F9H 06H A 88H 77H2 A4H 5BH B 83H 7CH3 B0H 4FH C C6H 39H4 99H 66H D A1H 5EH5 92H 6DH E 86H 79H6 82H 7DH F 8EH 71H7 F8H 07H 灭 FFH 00H8 80H 7FH 二、LED并行显示技术1.利用8155做LED显示器并行接口电路在单片机应用系统中,通常具有多位LED显示器,在编程时采用动态显示方式。所谓动态显示是指利用单片机控制显示器逐位点亮,而不是同时点亮。由于人眼的视觉残留效应,仍然感觉显示器是同时点亮的,但要求显示器动态点亮的速度应足够快,否则会有闪烁感。图6-8 利用8155芯片扩展6位LED显示器在实现动态显示时,除了必须给各位数码管提供段码外还必须对各位显示器进行位的控制,即进行段控与位控。工作时,各位数码管的段控线对应并联在一起,由一个8位的I/O口控制;各位的位控线(公共阳极或阴极)由另一I/O控制。在某一时刻只选通一位数码管,并送出相应的段码。图6-8为利用8155扩展6位LED显示器接口电路。利用8155PC口作为位控输出口。7路达林顿反向驱动输出芯片MC1413作为位控驱动;利用8155PA口作为段控输出口,输出8位段码。为增加显示亮度,采用双向驱动芯片74LS245进行段码输出驱动。2.建立显示缓冲区显示缓冲区是指在内存中开辟的一块存储区域,专门用于存放待显示的数据,存储区域大小至少应与LED数码管位数相同。设显示缓存单元为30H~35H,显示内容自右至左为为1、2、3、4、5、6,则缓存与LED数码管对应关系如下表所示:数 码 管 LED5 LED4 LED3 LED2 LED1 LED0缓存单元 35H 34H 33H 32H 31H 30H显示数据 06H 05H 04H 03H 02H 01H3、显示子程序设计设8155A口地址(即段控口)为0101H,C口地址为0103H。寄存器R0作为地址指针,寄存器R3存放当前位控值,DELAY为延时子程序,延时时间大约为1ms。程序如下:DISPLAY: MOV R0,#30H ;建立显示缓冲区首址 MOV R3,#01H ;从右边第一位数码管开始显示 MOV A,R3 ;置位控码初值 LD0: MOV DPTR,#0103H ;置位控口地址 MOVX @DPTR,A ;输出位控码MOV DPTR,#0101H ;置段控口地址MOV A,@R0 ;取待显示数据DIS0: ADD A,#0DH ;计算查表偏移量 MOVC A,@R0 ;查表法得到对应段码DIS1: MOVX @DPTR,A ;输出段码 ACALL DELAY ;延时以使显示器作显示停留 INC R0 ;指向下一缓冲单元 MOV A,R3 JB ACC.5,DIS1 ;最后位显示完了吗,完则返回 RL A ;修改位控码,指向高位 MOV R3,A ;位控码送R3保存 AJMP DIS0 ;继续显示下一位 LD1: RETTAB: DB 3FH,06H,5BH,4FH … 00H ;段码表三、串行LED显示技术在单片机系统设计中,LED显示方式由于具有使用方便、价格低廉等优点而得到广泛应用。在采用并行显示方式时,显示电路的段码与位控码要占用单片机的较多口线,尽管可采用8155等接口芯片进行扩展,但口线利用率仍较低,不能满足大型控制系统的要求。采用串行显示方式则只需占用2至3根口线,节约单片机大量的I/O线,且使用效果很好。下面介绍一种基于74HC595A的LED串行显示技术。1.74HC595A工作原理74HC595A内部含有8位移位寄存器和8位D锁存器,内部结构见图6-9所示。串行移位寄存器接收外部输入串行数据,一方面可进行串行数据输出,同时向锁存器提供8位并行输入数据,并具有异步复位功能;8位锁存器可三态输出并行数据。该芯片具有串行输入、并行输出两个独立的时钟信号。表6-2为该芯片的逻辑功能表。表6-2 74HC595A逻辑功能表工作状态 输 入 输 出SER SRCLK RCLK SQH Q0-Q7复 位 L × × L H ↓ L L U串行输入 H D ↑ L H ↓ L SRG SRH U锁存输出 H × L H↓ ↑ L U N高 阻 × × × × H Z注:U:不变;N:数据刷新;Z:高阻。 输入数据在串行移位时钟SCLK上升沿由串行输入端SER输入到芯片内部串行移位寄存器中,同时SQH端串行输出;在锁存时钟信号LCLK上升沿到来时,芯片将内部串行移位寄存器8位数据并行输出。正常工作时,应将复位端 与使能端 分别接高电平、低电平。2.应用电路设计图6-10为12位LED显示器应用电路。若采用普通的LED并行显示方式需扩展单片机接口,电路复杂、成本高。本系统利用三片74HC595A芯片实现12位串行LED显示控制。使用时,在串行时钟的控制下,可将显示器位控码与段控码逐位串行输入至三个芯片中,然后利用锁存信号实现并行输出,完成12数数码显示更新。利用此显示方式仅占用单片机三根口线,极大节约单片机口线资源。采用串行数据输入,显示速度相对较慢,实际使用时显示效果稳定、可靠,完全满足设计要求。
2023-10-02 12:53:341

MATLAB中矩阵的行列式怎么表达?

B = 41 37 0 81 42 33 31 21 64 47 24 33 31 56 24 22 24 0 64 29 22 27 16 53 35>> det(B) %求B阵的行列式ans = -1578270
2023-10-02 12:54:044

【急】!C语言C++编程题,帮忙编一下源程序

哎哟,这么多题啊,才50分呢,楼主大方点才有人来做啊 ,O(∩_∩)O哈哈~
2023-10-02 12:54:254

如何用C语言编写程序求矩阵的值

矩阵是数表...没有值...行列式才是一个值....
2023-10-02 12:54:353

matlab求矩阵的零空间的一组整数基,该怎样操作?

第一部分:矩阵基本知识一、矩阵的创建直接输入法利用Matlab函数创建矩阵利用文件创建矩阵二、矩阵的拆分矩阵元素矩阵拆分特殊矩阵三、矩阵的运算算术运算关系运算逻辑运算四、矩阵分析对角阵三角阵矩阵的转置与旋转矩阵的翻转矩阵的逆与伪逆方阵的行列式矩阵的秩与迹向量和矩阵的范数矩阵的特征值与特征向量五、字符串六、其他第二部分 矩阵的应用一、稀疏矩阵稀疏矩阵的创建稀疏矩阵的运算其他二、有限域中的矩阵内容第一部分:矩阵基本知识(只作基本介绍,详细说明请参考Matlab帮助文档)矩阵是进行数据处理和运算的基本元素。在MATLAB中a、通常意义上的数量(标量)可看成是”1*1″的矩阵;b、n维矢量可看成是”n*1″的矩阵;c、多项式可由它的系数矩阵完全确定。一、矩阵的创建在MATLAB中创建矩阵有以下规则:a、矩阵元素必须在”[ ]”内;b、矩阵的同行元素之间用空格(或”,”)隔开;c、矩阵的行与行之间用”;”(或回车符)隔开;d、矩阵的元素可以是数值、变量、表达式或函数;e、矩阵的尺寸不必预先定义。下面介绍四种矩阵的创建方法:1、直接输入法最简单的建立矩阵的方法是从键盘直接输入矩阵的元素,输入的方法按照上面的规则。建立向量的时候可以利用冒号表达式,冒号表达式可以产生一个行向量,一般格式是: e1:e2:e3,其中e1为初始值,e2为步长,e3为终止值。还可以用linspace函数产生行向量,其调用格式为:linspace(a,b,n) ,其中a和b是生成向量的第一个和最后一个元素,n是元素总数。可以看出来linspace(a,b,n)与a:(b-a)/(n-1):b等价。2、利用MATLAB函数创建矩阵基本矩阵函数如下:(1) ones()函数:产生全为1的矩阵,ones(n):产生n*n维的全1矩阵,ones(m,n):产生m*n维的全1矩阵;(2) zeros()函数:产生全为0的矩阵;(3) rand()函数:产生在(0,1)区间均匀分布的随机阵;(4) eye()函数:产生单位阵;(5) randn()函数:产生均值为0,方差为1的标准正态分布随机矩阵。3、利用文件建立矩阵当矩阵尺寸较大或为经常使用的数据矩阵,则可以将此矩阵保存为文件,在需要时直接将文件利用load命令调入工作环境中使用即可。同时可以利用命令reshape对调入的矩阵进行重排。reshape(A,m,n),它在矩阵总元素保持不变的前提下,将矩阵A重新排成m*n的二维矩阵。
2023-10-02 12:54:453

R语言数据对象与运算

R语言数据对象与运算R语言数据对象与运算 笔记整理2.1 数据对象及类型R语言创建和控制的实体被称为对象(object)ls()命令来查看当前系统里的数据对象R对象的名称必须以一个英文字母打头,并由一串大小写字母、数字或钟点组成注意:R区分大小写不要用R的内置函数名称作为数据对象的名称,如c、length等2.2 数据对象类型R语言的对象包括数值型(numeric):实数, 可写成整数(integers)、小数(decimal fractions)、科学记数(scientific notation)逻辑型(logical):T(true)或F(FALSE)字符型(character):夹在" "或之间复数型(complex):形如a+bi原味型(raw):以二进制形式保存数据缺省型(missing value):有些统计资料是不完整的,当一个元素或值在统计的时候是“不可得到(not available)”或“缺失值(missing value)”的时候,相关位置可能会被保留并赋予一个特定的NA(not available)值,任何NA的运算结果都是NA。辨别和转换数据对象类型的函数:辨别 转换character is.character() as,character()complexdoubleintegerlogicalNAnumeric2.3 数据对象构造R语言里的数据对象主要有六种构造:向量(vector)、矩阵(matrix)、数组(array)、列表(list)、数据框(data frames)、因子(factor)2.3.1 向量(vector)是由有相同基本类型元素组成的序列,相当于一维数组 5个数值组成的向量x,这是一个用函数c()完成的赋值语句,这里c()可以有任意多个参数,而它输出的值则是一个把这些参数首尾相连形成的一个向量R的赋值符号除了“<-”外,还有"->""="例如:> c(1,3,5,7,9) -> y > y [1] 2 5 8 3 > z = c(1,3,5,7,9) > z [1] 1 3 5 7 9 assign()函数对向量进行赋值 length():可返回向量的长度 mode()可返回向量的数据类型 正则序列 用 “:”符号,可产生有规律的正则序列(: 的运算级别最高) 函数seq()产生有规律的各种序列seq(from,to ,by) from 给序列的起始值,to表示序列的终止值,by表示步长(by 省略时,表示步长值为1)> seq(1,10,2) [1] 1 3 5 7 9 > seq(1,10) [1] 1 2 3 4 5 6 7 8 9 10 有时关注的是数列的长度,利用句法:seq(下界,by=,length=)> seq(1,by=2,length=10) [1] 1 3 5 7 9 11 13 15 17 19 rep(x,times,……)x表示要重复的对象,times表示重复的次数> rep(c(1,3),4) [1] 1 3 1 3 1 3 1 3 > rep(c(1,3),each=4) [1] 1 1 1 1 3 3 3 3 对每个元素进行重复;R中的内置函数:mean()来示向量的均值median()求是位数var()求方差sd()求标准差sort()对向量排序rev()将向量按原方向的反方向排列rank()给求出向量的秩prod()求向量连乘积append()为向量添加元素对向量运算常见函数表 函数 用途sum() 求和max() 求最大值min() 求最小值range() 求极差(全矩)mean() 求均值median 求中位数var() 求方差sd() 求标准差sort() 排序rev() 反排序rank() 求秩append() 添加replace() 替换match() 匹配pmatch() 部分匹配all() 判断所有any() 判断部分prod() 积 2.3.2 矩阵矩阵(matrix)是将数据用行和列排列的长方形表格,它是二维的数组,其单元必须是相同的数据类型,通常用列来表示不同的变量,用行表示各个对象。其句法是:matrix(data=NA,ncol=1,byrow-=FALSE,dimnames=NULL)data是必须的,其它几个选择参数。nrow表示矩阵的行数ncol表示矩阵的列数byrow默认为FALSE,表示矩阵按列排列,如设置为T,表示按行排列;dimnames可更改矩阵行列名字diag()函数生成对角矩阵diag()这个函数比较特别,当数据是向量时则生成对角矩阵,但当数据是矩阵时,则返回对角元素也可用函数diag()生成单位矩阵 当我们生成了某个矩阵后,若要访问矩阵的某个元素或某行(列),可以利用形如A[i,j]的形式得到相应的索引矩阵矩阵可进行相应的加减乘除运算,但运算过程中要注意行数和列数的限制条件R里A*B并不是表示矩阵相乘,只表示矩阵对应的元素相乘矩阵相乘应用A%*%Bdim()返回矩阵的行数和列数nrow()返回矩阵的行数ncol()返回矩阵的列数solve()返回矩阵的逆矩阵对矩阵运算的常见函数 函数 用途as.matrix() 把非矩阵的转换成矩阵is.matrix() 辨别是否矩阵diag() 返回对角元素或生成对角矩阵eigen() 求特征值和特征向量solve() 求逆矩阵chol() Choleski分解svd() 奇异值分解qr() QR分解det() 求行列式dim() 返回行列数t() 矩阵转置apply() 对矩阵应用函数R语言还提供了专门针对矩阵的行或列计算的函数如 colSUms()对矩阵各列求和 colMeans()求矩阵各列的均值类似的有 rowSums()rowMeans()更一般的方法:apply()函数来对各行各列进行运算句法是:apply(X,MARGIN,FUN,……)X表示要处理的数据MARGIN表示函数作用的范围取1表示对行运用函数取2表示对列运用函数FUN表示要运用的函数rbind()、cbind()将两个或两个以上的矩阵合并起来rbind()表示按行合并,cbind()则表示按列合并2.3.3 数组数组(array)可以看作是带有多个下标的类型相同的元素的集合。数组的生成函数是array(),其句法是array(data=NA,dim=length(data),dimnames-NULL)data表示数据,可以为空dim 表示维数dimnames可以更改数组难度的名称2.3.4 列表向量、矩阵和的单元必须是同一类型的数据,若一个数据对象需要含有不同的数据类型,可采用列表(list)这种数据对象的形式。列表是一个对象的有序集合构成的对象,列表中包含的对象又称为它的分量(components),分量可以是不同的模式或(和)类型语法式为:list (变量1=分量1,变量2=分量2,……)若要访问列表的某一成分,可以用LST[[1]],LST[[2]]的形式访问因分量可以被命名,故可以在列表名称后加$符号,再写上成分名称来访问列表分量函数length()、mode()、names()可以分别返回列表的长度(分量的数目)、数据类型、列表里成分的名字2.3.5 数据框数据框(data frame)是一种矩阵形式的数据,但数据框中各列可以是不同类型的数据。数据框每列是一个变量,每行是一个观测 。对可能列入数据框中的列表有如下的一些限制:1.分量必须是向量(数值,字符,逻辑),因子,数值矩阵,列表或者其他数据框。2.矩阵,列表和数据框为新的数据框提供了尽可能多的变量,因为它们各自拥有列、元素或者变量。3.数值向量、逻辑值、因子保持原有格式,而字符向量会被强制转换成因子并且它的水平就是向量中出现的独立值。4.在数据框中以变量形式出现的向量结构必须长度一致,矩阵结构必须有一样的行数。R中用函数data.frame()生成数据框,其句法是:data.frame(data1,data2,……)数据框的列名默认为变量名,也可对列名进行重新命名也可以对数据框的行名进行修改2.3.6 因子和有序因子分类型数据经常要把数据分成不同的水平或因子(factor)生成因子的命令是factor(),其句法是:factor(data,levels,labels,……)其中data表示数据levels是因子水平向量labels是因子的标签向量levels,labels是备选项,可以不选若上面的每个因子并不表示因子的大小,要表达因子之间有大小顺序(考虑因子之间的顺序),则可以用 ordered()函数产生2.4 数据的录入及编辑c函数:c函数是把各个值联成一个向量或列表,可以形成数值型向量、字符型向量或其它类型向量 scan函数:功能类似于c函数,实际上是一种键盘输入数据函数。当输入scan(),然后按回车键,这时将等待输入数据,数据之间只要空格分开即可(c函数要用逗号分开)。输入完数据,再按回车键,这时数据录入完毕。scan函数还可以读入外部文本文件,若现有一个文本文件,data.txt,读入这个文件的命令是:> x=scan(file="dat.txt")若原文件的数据之间有逗号等分隔符,用scan读入应该去掉这些分隔符,其命令是:> x=scan(file="dat.txt",sep=",") 编辑数据data.entry命令xx原先未被定义,现在赋予其一个空值,这时会出现一个电子表格界面,等待输入数据:> data.entry(xx=c(NA)) 当电子表格关闭后,数据会自动保存edit命令用来编辑函数,也可用来编辑数据,但不会自动保存fix函数与edit类似,但它可以自动保存从外部文件读入数据从文本文件读取:> s1=read.table("student.txt") > s1 V1 V2 V3 1 class sex score 2 1 女 80 3 1 男 85 4 2 男 92 5 2 女 76 6 3 女 61 7 3 女 95 8 3 男 83 读入表格数据的命令是:read.table 忽略掉标签而直接使用默认的行标签> s2=read.table("student.txt",header=T)> s2 class sex score 1 1 女 80 2 1 男 85 3 2 男 92 4 2 女 76 5 3 女 61 6 3 女 95 7 3 男 83 从网络读入数据url可以从网页上读入正确格式的数据,要借助read.table函数> address=http://www.the-data-mine.com/bin/view/Misc/WebHome/sample.txt> read.table(file=url(address)) 读入其他格式的数据库要读入其他格式的数据库,必须先安装"foreign"模块,它不属于R的8个内置模块,需在使用前安装。 library(foreign) SAS:R只能诗篇SAS Transport format(XPORT)文件,需要把普通的SAS数据文件(.ssd和.sas7bdat)转换成Transport format(XPORT)文件,再用命令:read.xport()SPSS数据库:read.spss()可读入SPSS数据文件Epi info数据库:要给数据集一个名字,则是;read.epiinfo("文件名.rec")->名称Stata数据库:R可读入Stata5,6,7的数据库读入数据文件后,使用数据集名$变量名,即可使用各个变量 > read.dta(“文件名.dta”) 读入数据文件后,使用数据集名$变量名,即可使用各个变量。>mean(data$age) 便是计算数据集 data中的变量age的均数。2.5 函数、循环与条件表达式2.5.1 编写函数句法是:函数名 = function (参数1,参数2…) { 函数体 函数返回值} 对于这类只有一个算术式的简单函数,也要不要{}>mean(data$age) 便是计算数据集 data中的变量age的均数。 若不使用圆括号,直接输入函数名,按回车键将显示函数的定义式:单参数:使函数个性化,可使用单参数,函数将会根据参数的不同,返回值不同> welcome.sb = function(names) print(paste("welcome",names,"to use R")) > welcome.sb("Mr fang") [1] "welcome Mr fang to use R" > welcome.sb("Mr Wang") [1] "welcome Mr Wang to use R" 默认参数:即不输入任何参数函数的默认参数> welcome.sb=function(names="Mr fang")print(paste("welcome", names,"to use R")) > welcome.sb() [1] "welcome Mr fang to use R" 当函数体的表达式超过一个时,要用{}封起来2.5.2 for循环for循环的句法是:for (变量 in取值向量) { 表达式… }
2023-10-02 12:54:541

电子表格的应用

一.在电子表格里输入全村人的个人档案,怎么查找年龄段的人。比如:18-50岁间的男性党员等?D:在数据里点分类汇总就可以了~!~!二.我所做的表格中输入了很多数字,我能用什么方法把这些数字用“勾”、“叉”符号来代换?D:用查找替换的方法。编辑,查找替换,在查找中输入你的这些数字,替换里输入复制好的对号或叉。希望能明白三.电子表格应用问题:我想让c列的值自动等于a列和b列的乘积D:在C1里 输入 =A1*B1 就可以了 其它它的结果 进行拖拉就出来了 然后鼠标指向C1单元格右下角的小黑点,当光标变成一个黑色的实心小十字时,按下左键向下拖动至与你的AB两列数据相同的行数。松开左键就完成了。四.如A1是张三,A2也是张三,是否有什么方法把A1、A2的内容合并,只显示一个张三,但其后面的对应内容不变。谢谢问题补充:就是说:如A1是张三,B1是他第1个小孩的姓名,C1是小孩的出生年月日 A2也是张三,B2是他第2个小孩的姓名,C2是小孩的出生年月日 能否只将A1、A2的内容合并,变成只有一个张三,但B1、C1及B2、C2都不变D:你用电子表格内. 单击菜单"数据"------"数据透视表和数据透视图" 就可能满足你的要求了. 不过方法很多.也可以直接用公式.五.在EXCEL电子表格中,利用绝对引用怎样做出乘法表D:1、建立一个工作表Sheet1,并在A3~A11单元格依次输入1~9,B2~J2单元格依次输入1~9。 2、在B3单元格输入公式: =$A3&"×"&B$2&"="&$A3*B$2 3、点B3单元格右下角出现的“+”按住左键往右拉到J3(实现整行拷贝),再直接在刚才涂黑选择的范围B3-J3右下角出现的“+”按住左键往下拉到第11行就出来了。六.A B C 1 123467 2 3 4 5 6 在B1中显示,A1的数基础上在1234跟67之间插入5,用什么函数公式?D:在B1里面输入: =left(A1,4)&"5"&right(A1,2) 其中“5”是你要插入的中间数据. 附: 假设你的原数字在A列。 1、要插入的数字有规律: 则在B1写入公式: =REPLACE(A1,LEN(A1)-1,0,ROW(A1)-1) 2、要插入的数字没有规律 假设要插入的数字都列在B列,则在C列如C1写入公式: =REPLACE(A1,LEN(A1)-1,0,B1) 假如A列是13654那些数,B列是你要插入的数0,1,2,……(有规律可以直接拉下来,没有规律那就得自己一个一个输了。 然后在C列,C1单元格输入: =LEFT(A1,LEN(A1)-2)&B1&RIGHT(A1,2) 然后往下拉复制公式就可以了。 现在要把一列数字中间一个固定位置插入一固定数字,该怎么插入啊? 例如121.21在21前插入0 答:假如121.21在A1单元格,可以在目标单元格输入下面的公式: =(A1-INT(A1))/10+INT(A1) 附加Excel操作技巧 (1)、快速给单元格重新命名 EXCEL给每个单元格都有一个默认的名字,其命名规则是列标加横标,例如D3表示第四列、第三行的单元格。如果要将某单元格重新命名,只要用鼠标单击某单元格,在表的左上角就会看到它当前的名字,再用鼠标选中名字,就可以输入一个新的名字了。 (2)、去掉默认的表格线(网线) 单击“工具”菜单中的“选项”,再单击对话框中的“视图”,找到“网格线”,使之失效(将左边的“×”去掉)。 (3)、增加工作簿的页数 单击“插入”菜单下的“工作表”,即可在底部看到一个新名称的工作表。一个工作簿最多可以有255张工作表。 (4)、快速给工作表命名 双击当前工作表下部的名称,如“Sheet1”,再输入新的名称即可。 (5)、实现条件显示 统计学生成绩时,希望输入60以下的分数时,能显示为“不及格”,输入60以上的分数时,显示为“及格”。这样的效果,不妨称之为“条件显示”,用IF函数可以实现。 假设分数在B3单元格中,要将等级显示在C3单元格中。那么在C3单元格中输入以下公式实现不同的等级: =if(b3<=60,“不及格”,“及格”) 分“不及格”和“及格”两个等级 =if(b3<=60,“不及格”,if(b3<=90,“及格”,“优秀”)) 分三个等级 =if(b3<=60,“不及格”,if(b3<=70,“及格”,if(b3<90,“良好”,“优秀”))) 分为四个等级 注意:符号为半角,IF与括弧之间不能有空格,而且最多嵌套7层。 (6)、跨表操作数据 设有名称为Sheet1、Sheet2和Sheet3的三张工作表,现要用Sheet1的D8单元格的内容乘以40%,再加上Sheet2的B8单元格内容乘以60%作为Sheet3的A8单元格的内容。则应该在Sheet3的A8单元格输入以下算式:=Sheet1!D8*40%+Sheet2!B8*60%。 (7)、两次选定单元格 有时,我们需要在某个单元格内连续输入多个测试值,以查看引用此单元格的其他单元格的效果。但每次输入一个值后按Enter键,活动单元格均默认下移一个单元格,非常不便。此时,你肯定会通过选择“工具”“选项"“编辑",取消“按Enter键移动活动单元格标识框"选项的选定来实现在同一单元格内输入许多测试值,但以后你还得将此选项选定,显得比较麻烦。其实,采用两次选定单元格方法就显得灵活、方便: 单击鼠标选定单元格,然后按住Ctrl键再次单击鼠标选定此单元格(此时,单元格周围将出现实线框)。 (8)、 “Shift+拖放"的妙用 在拖放选定的一个或多个单元格至新的位置时,同时按住Shift键可以快速修改单元格内容的次序。具体方法为:选定单元格,按下Shift键,移动鼠标指针至单元格边缘,直至出现拖放指针箭头“?",然后进行拖放操作。上下拖拉时鼠标在单元格间边界处会变为一个水平“工"状标志,左右拖拉时会变为垂直“工"状标志,释放鼠标按钮完成操作后,单元格间的次序即发生了变化。这种简单的方法节省了几个剪切和粘贴或拖放操作,非常方便。 (9)、超越工作表保护的诀窍 如果你想使用一个保护了的工作表,但又不知道其口令,有办法吗?有。选定工作表,选择“编辑"“复制"、“粘贴",将其拷贝到一个新的工作簿中(注意:一定要新工作簿),即可超越工作表保护。 (10)、数据填充技巧 在Excel97表格中填写数据时,经常会遇到一些在结构上有规律的数据,例如1997、1998、1999;星期一、星期二、星期三等。对这些数据我们可以采用填充技术,让它们自动出现在一系列的单元格中。 填充功能是通过“填充柄”或“填充序列对话框”来实现的。用鼠标单击一个单元格或拖曳鼠标选定一个连续的单元格区域时,框线的右下角会出现一个黑点,这个黑点就是填充柄。打开填充序列对话框的方法是:单击“编辑”菜单下的“填充”中的“序列”即可。 一、数字序列填充 数字的填充有三种填充方式选择:等差序列、等比序列、自动填充。以等差或等比序列方式填充需要输入步长值(步长值可以是负值,也可以是小数,并不一定要为整数)、终止值(如果所选范围还未填充完就已到终止值,那么余下的单元格将不再填充;如果填充完所选范围还未达到终止值,则到此为止)。自动填充功能的作用是,将所选范围内的单元全部用初始单元格的数值填充,也就是用来填充相同的数值。 例如从工作表初始单元格A1开始沿列方向填入20、25、30、35、40这样一组数字序列,这是一个等差序列,初值为20,步长5,可以采用以下几种办法填充: 1利用鼠标拖曳法 拖曳法是利用鼠标按住填充柄向上、下、左、右四个方向的拖曳,来填充数据。 填充方法为:在初始单元格A1中填入20,再在单元格A2中填入25,用鼠标选定单元格A1、A2后按住填充柄向下拖曳至单元格A5时放手即可。 2利用填充序列对话框 在初始单元格A1中填入20,打开填充序列对话框,选择“序列产生在”列、类型是“等差序列”、“步长值”填入5、“终止值”填入40,然后“确定”。 3利用鼠标右键 在初始单元格A1中填入20,用鼠标右键按住填充柄向下拖曳到单元格A5时放手,这时会出现一个菜单,选择菜单的“序列”命令,以下操作同利用填充序列对话框操作方法一样。 二、日期序列填充 日期序列包括日期和时间。当初始单元格中数据格式为日期时,利用填充对话框进行自动填写,“类型”自动设定为“日期”,“日期单位”中有4种单位按步长值(默认为1)进行填充选择:“日”、“工作日”、“月”、“年”。 如果选择“自动填充”功能,无论是日期还是时间填充结果相当于按日步长为1的等差序列填充。利用鼠标拖曳填充结果与“自动填充”相同。 三、文本填充 在涉及到文本填充时,需注意以下三点: 1文本中没有数字 填充操作都是复制初始单元格内容,填充对话框中只有自动填充功能有效,其它方式无效。 2文本中全为数字 当在文本单元格格式中,数字作为文本处理的情况下,填充时将按等差序列进行。 3文本中含有数字 无论用何种方法填充,字符部分不变,数字按等差序列、步长为1(从初始单元格开始向右或向下填充步长为正1,从初始单元格开始向左或向上填充步长为负1)变化。如果文本中仅含有一个数字,数字按等差序列变化与数字所处的位置无关;当文本中有两个或两个以上数字时,只有最后面的数字才能按等差序列变化,其余数字不发生变化。 例如,初始单元格的文本为“第4页”,从初始单元格开始向右或向下填充结果为“第5项”、“第6项”……;从初始单元格开始向左或向上填充结果为“第3项”、“第2项”……再如初始单元格的文本为“(3)2班第4名”,向下填充时它的变化依次为“(3)2班第5名、(3)2班第6名……” (11)、语音字段的使用技巧 在日常的工作表中,常会遇到一些生僻的字(如“邗”),影响了对表中内容的理解。Excel97为我们很好地解决了该问题,它增加了“语音字段”这一功能,你可以为这些生僻的字加上拼音注释。 1插入语音字段 你可以选择“插入”中“语音字段”命令来为“邗”字加语音字段,具体操作为:(1)选中“邗”字所在的单元格,双击该单元格,进入编辑状态;(2)将光标定位在“邗”字之前,选择“插入”中“语音字段”命令,“邗”字变为绿色,在该字上方出现一个小框,在框中输入字的拼音:han2,其中2代表阳平;(3)按两次回车键,以确认拼音的输入。 2显示/隐藏语音字段 添加拼音后,拼音并不显示。采用以下方法可显示拼音:(1)选择欲显示拼音的单元格;(2)选择“格式”菜单中的“语音信息”,按下“显示语音字段”,左侧的图标处于凹下状态即可。重复以上步骤就可隐藏语音字段。 3编辑语音字段 你可以按插入语音字段的操作方式进入编辑。选择欲更改拼音的单元格,再按下“插入”菜单的“语音字段”,然后更改拼音,按两次回车键确认更改。若语音字段所在单元格正处于编辑状态,你可以用Alt+Shift+上箭头或下箭头组合键在拼音和单元格中移动光标。 4改变语音信息的字体 (1)选择欲更改语音字体的单元格;(2)选择“格式语音信息定义”命令;(3)在字体列表框中选择要更改的字体,在“大小”的列表框中选择字体大小。另外,你还可以按下“字体设置…”按钮来改变拼音样式、颜色及添加字符的特殊效果等。〔12〕、ActiveX 控件在 Excel 中的运用 Excel97在工作表或图表上可使用ActiveX控件,根据我使用的体会,在工作上处理控件时,必须注意和了解如下事项: (一)用Excel5.0/95工作簿文件格式保存Excel97工作簿时,将选择ActiveX控件信息。当用户通过双击鼠标来编辑内嵌在其它应用程序文档中的Excel97工作簿时,该工作簿上的控件将不会正常工作。如果用户是通过用右键单击工作簿,然后选中快捷菜单上的“打开”命令来编辑工作簿的话,工作簿上的控件就能正常工作了。 (二)当ActiveX控件处于激活状态时,将禁用某些MicrosoftExcelVisualBasic方法和属性。 例如,当某一控件激活时,就不能使用Sort方法,故下述按钮单击事件处理过程中的代码将失败(因为用户单击按钮后,该按钮就处于激活状态)。 PrivateSubCommandButton1Click Range(〃a1:a10〃)SortKey1:=Range(〃a1〃) EndSub 解决办法是通过选激活工作表上其它元素的方法来绕过这种问题。例如,可用下列代码对单元格区域排序: PrivateSubCommandButton1Click Range(〃a1〃)Activate Range(〃a1:a10〃)SortKey1:=Range(〃a1〃) CommandButton1Activate End Sub (三)在MicrosoftExcel中,用OLEObjects集合中的OLEObject对象代表ActiveX控件。 如果要用编程的方式向工作表添加ActiveX控件,可用OLEObjects集合的Add方法。例如向第一张工作表添加命令按钮。 Worksheets(1)OLEObjectsAdd〃FormsCommandButton1〃,_ Left:=10,Top:=10,Height:=20,Width:=100 因为ActiveX控件也可用OLEObjects集合中的OLEObject对象代表,所以也可用该集合中的对象来设置控件的属性。例如要设置控件“CommandBotton1”的“左边位置”属性。 Worksheets(1)OLEObjects(〃CommandButton1〃)Left=10 那些不属于OLEObject对象属性的控件属性,可通过由Object属性返回的实际控件对象来设置。例如要设置控件“CommandButton1”的标题。 Worksheets(1)OLEObjects(〃CommandButton1〃) ObjectCaption=〃runme〃 因为所有的OLE对象也是Shapes集合的成员,所以也可用该集合设置若干控件的属性。例如要对齐第一张工作表上所有控件的左边框。 ForEachsInWorksheets(1)Shapes IfsType=msoOLEControlObjectThensLeft=10 Next 请注意,当在控件所在工作表的类模块之外使用控件的名称时,必须用工作表的名称限定该控件的名称。在工作表上ActiveX控件的事件处理过程中,Me关键字所指向的是工作表,而非控件。 〔13〕、巧解线性方程组 线性方程组在工程技术、经济等领域有着广泛的应用。许多实际问题可以归结为一个线性方程组的解,因此线性方程组的解法已成为广大工程技术人员、经济工作者必须掌握的知识。在线性代数领域,Excel可以通过插入函数来直接求行列式的值,逆矩阵和矩阵的乘积。但Excel并没有直接求解线性方程组的功能,本人发现Excel的规划求解可用来解线性方程组,现把这种方法介绍给大家。 例如要解线性方程组 x1+x2+2x3+3x4=1 3x1-x2-x3-2x4=-4 2x1+3x2-x3-x4=-6 x1+2x2+3x3-x4=-4 可按如下的步骤来解这个方程组: 1.打开Excel。 2.由于在本方程组中未知数有4个,所以预留4个可变单元格的位置A1—A4。 3.将活动单元格移至B1处,从键盘键入:=A1+A2+2*A3+3*A4:然后回车(此时B1显示0)。即在B1处输入方程组中第一个方程等号左边的表达式。 4.在B2处从键盘键入:=3*A1-A2-A3-2*A4;然后回车(此时B2显示0)。即在B2处输入方程组中第二个方程等号左边的表达式。 5.在B3处从键盘键入:=2*A1+3*A2-A3-A4;然后回车(此时B3显示0)。即在B3处输入方程组中第三个方程等号左边的表达式。 6.在B4处从键盘键入:=A1+2*A2+3*A3-A4;然后回车(此时B4显示0)。即在B4处输入方程组中第四个方程等号左边的表达式。 7.点击工具规划求解,出现规划求解参数对话框。 8.对话框中第一栏为:设置目标单元格,在相应的框中填入$B$1。 9.对话框中第二栏为:等于;后有三个选项,依次为最大值,最小值,值为。根据题意B1表示方程组中第一个方程等号左边的表达式,它的值应为1,因此点击值为前的圆圈,输入1。 10.对话框中第三栏为:可变单元格;我们预留的可变单元格为A1—A4,所以在可变单元格框内键入 A 1: A 4。 11.对话框中最后一栏为:约束;首先点击添加按钮,屏幕出现添加约束对话框。 12.在添加约束对话框的单元格引用位置键入:B2;在中间的下拉式菜单中选取=;在约束值处键入:-4;然后按添加按钮,屏幕出现空白的添加约束对话框。 13.在添加约束对话框的单元格引用位置键入:B3;在中间的下拉式菜单中选取=;在约束值处键入:-6;然后按添加按钮,屏幕出现空白的添加约束对话框。 14.在添加约束对话框的单元格引用位置键入:B4;在中间的下拉式菜单中选取=;在约束值处键入:-4;然后按确定键,返回规划求解参数对话框。特别注意在最后一个约束条件键入后,按确定键(而不是像前面一样按添加键)。 15.按求解键,出现求解结果对话框。此时在A1-A4的位置依次为:-1,-1,0,1;这就是说,原方程组的解为:X1=-1,X2=-1,X3=0,X4=1。这样我们就求出了方程组的解。 〔14〕、如何避免 Excel 中的错误信息 在Excel中输入或编辑公式后,有可能不能正确计算出结果,Excel将显示一个错误信息,引起错误的原因并不都是由公式本身有错误产生的。下面我们将介绍五种在Excel中常出现的错误信息,以及如何纠正这些错误。 错误信息1—#### 输入到单元格中的数据太长或单元格公式所产生的结果太大,在单元格中显示不下时,将在单元格中显示####。可以通过调整列标之间的边界来修改列的宽度。 如果对日期和时间做减法,请确认格式是否正确。Excel中的日期和时间必须为正值。如果日期或时间产生了负值,将在整个单元格中显示####。如果仍要显示这个数值,请单击“格式”菜单中的“单元格”命令,再单击“数字”选项卡,然后选定一个不是日期或时间的格式。 错误信息2—#DIV/0! 输入的公式中包含明显的除数0,例如-120/0,则会产生错误信息DIV/0!。 或在公式中除数使用了空单元格(当运算对象是空白单元格,Excel将此空值解释为零值)或包含零值单元格的单元格引用。解决办法是修改单元格引用,或者在用作除数的单元格中输入不为零的值。 错误信息3—#VALUE! 当使用不正确的参数或运算符时,或者当执行自动更正公式功能时不能更正公式,都将产生错误信息#VALUE!。 在需要数字或逻辑值时输入了文本,Excel不能将文本转换为正确的数据类型。这时应确认公式或函数所需的运算符或参数正确,并且公式引用的单元格中包含有效的数值。例如,单元格B3中有一个数字,而单元格B4包含文本,则公式=B3+B4将返回错误信息#VALUE!。 错误信息4—#NAME? 在公式中使用了Excel所不能识别的文本时将产生错误信息#NAME?。可以从以下几方面进行检查纠正错误: (1)如果是使用了不存在的名称而产生这类错误,应确认使用的名称确实存在。在“插入”菜单中指向“名称”,再单击“定义”命令,如果所需名称没有被列出,请使用“定义”命令添加相应的名称。 (2)如果是名称,函数名拼写错误应修改拼写错误。 (3)确认公式中使用的所有区域引用都使用了冒号(:)。例如:SUM(A1:C10)。 注意将公式中的文本括在双引号中。 错误信息5— #NUM! 当公式或函数中使用了不正确的数字时将产生错误信息#NUM!。 要解决问题首先要确认函数中使用的参数类型正确。还有一种可能是由公式产生的数字太大或太小,Excel不能表示,如果是这种情况就要修改公式,使其结果在-1×10307和1×10307之间。 (15)、给你的 Excel 加个计算器 Excel 是目前最流行的电子表格软件,功能极为强大。按理说,Excel 具有如此强大的计算功能,我们似乎不再需要什么计算器来帮忙了。不过一些刚入门不久的新用户因为对 Excel 还不太熟悉,需经常借用一下 Windows 自带的计算器程序,而老用户在进行有关函数运算时使用计算器也似乎更方便一些。但很多用户都是通过 Windows 的“开始”菜单来查找和启动计算器,非常麻烦。其实,Excel 自己也带了一个计算器,我们直接调用它的计算器要方便得多。缺省情况下,用户并不能直接使用 Excel 的计算器,为达到目的,我们必须采用如下方法将它添加到快捷工具栏上: 1.执行Excel“工具”菜单的“自定义”命令,系统弹出“自定义”对话框; 2.在“自定义”对话框中选择“命令”标签; 3.从“类别”列表框中选择“工具”选项;从“命令”列表框中选择一个计算器样式的“自定义”命令(注意,该列表框中有几个不同的“自定义”命令按钮,我们应选择那个在“说明”按钮中显示为“计算器”的按钮); 4.用鼠标将该命令拖到 Excel 快捷工具栏的合适位置; 5.此时 Excel 的快捷工具栏上就会出现一个计算器样式的“自定义”命令按钮,用鼠标右击该按钮,打开鼠标右键菜单; 6.执行快捷菜单中的“命名”命令,将其改名为“计算器”; 7.你也可以采用类似方法为 Excel 的菜单栏也添加一个“计算器”命令菜单; 8.单击“关闭”按钮,关闭“自定义”对话框。 这样,Excel 的快捷工具栏上就会出现一个名为“计算器”的命令按钮,我们只需单击该按钮即可调用系统的“计算器”程序,进行不同进制、不同单位的四则、函数等运算,从而简化了在使用 Excel 时调用计算器的步骤。七.如何利用WORD将文本转为表格?给出操作方法?打印输出时,如何对电子表格进行"缩放"操作?D:WORD将文本转为表格:选中文本—表格—转换—文本转换成表格 电子表格缩放:页面设置—缩放比例
2023-10-02 12:55:041

三行三列的共轭转置是什么

三行三列的共轭转置是指的是m*n型矩阵A做的一种数学变换,其中矩阵A中的任一元素aij属于复数域C。
2023-10-02 12:55:112

搜狗输入法打出行列式

搜狗输入法打出行列式,第一种方法:按住alt键,然后输入数字41389,松开alt,省略号就出来了。第二种方法:搜狗输入法里面输入shlh,结果里面第四个和第五个。
2023-10-02 12:55:311

如何用c++编程设计求行列式的值

设计一个类,计算行列式的值,行列式的阶数由键盘输入。要求该类可以作为其他类的基类(可继承,用常数列可以替换某列)。显示信息为:请输入行列式的阶数(1-20):3请选择输入行列式个元素的方式1.键盘输入2.随机函数自动产生请选择:2随机数的位数(1-5):2行列式:xxxxxxxxx行列式:abc行列式的值:abc=
2023-10-02 12:56:061

在MATLAB中求矩阵特征值和特征向量的代码

>> A=[3 -1 -2;2 0 -2;2 -1 -1]A = 3 -1 -2 2 0 -2 2 -1 -1>> [V,D]=eig(A)V = 0.7276 -0.5774 0.6230 0.4851 -0.5774 -0.2417 0.4851 -0.5774 0.7439D = 1.0000 0 0 0 0.0000 0 0 0 1.0000D为特征值,V为每个特征值对应的特征向量
2023-10-02 12:56:177

用英文字母组成汉字

给你几个网址,希望对你有用。http://www.333cn.com/graphic/sjxs/90671.html 这是几个英文汉字的组合。将汉字拆成“英文、符号部件” 古稀老人自编创意输入法 东莞市虎门镇退休干部梁传仁,历时4年研究出了五个版本的“形同意合码”电话汉字输入法,第一版本的专利目前已通过国家初审本版文、图/时报记者 尹仁祥 “吕=O+O,叮=O+J,印=E+P,合=A+O”,这样的汉字输入法,你见过吗? 年近70岁的退休老人梁传仁,经过近4年潜心研究,他设计出“形同意合码”中文输入法,现已升级为第五个版本,并全部申请了国家专利。目前,第一个版本已通过初审,并进入最后的实审阶段,他有望在今年年底领到专利证书。 在上世纪90年代中期,梁传仁在用电脑写作的过程中发现,常用的汉字输入法都存在着缺陷:不是重码太多就是难以记忆代码。于是,他脑海里便萌发了“要开发一种简易输入法”的念头。 4年前,梁传仁开始着手汉字输入法的设计和编程。在查阅大量工具书和资料后,他结合汉字字根的构造和特点,把现有汉字进行分类整合,再将其与键盘的字母和符号相对应。经过8个多月的研发实践,第一个版本名为“自由形码”的汉字输入法研究成功。后来,经过五次的改进升级和有关部门的测试,该输入法被正式命名为“形同意合码”。 研发过程 1、缘起 用电脑写作发现输入缺陷 梁传仁告诉记者,上个世纪90年代初,他从虎门镇某部门退休。在退休前,他从未真正操作过电脑。“退休后,我在利用电脑写作时,发现电脑的中文输入法存在着许多问题。”在利用拼音输入汉字时,往往会出现许多相同的词组,要输入者进行翻页挑选;如果利用五笔输入,则要求输入者背诵大量的字根;其他输入法也存在不同问题和缺陷。 他还说,由于中国各地的方言不同,对标准普通话掌握中,存在着前鼻音、后鼻音、卷舌音、舌尖音等不易区别的问题,这也导致了陌生汉字无法打出来。他说,以往有个调查显示,即使是普通话较好地区的大学毕业生,在对应掌握的6000多个国标汉字中,大部分人有近千字因读不出来难以输入。 “从那时起,我就陷入烦恼中,开始思考怎样才能研究出一种简洁的汉字输入法,为广大的电脑爱好者服务。”1994年,梁传仁把自己微薄的退休金拿出来,购买了一部286电脑。“那电脑在当时是非常先进的,于是我便靠它开始了对汉字简码的研究。” 2、研发 将汉字拆成“英文、符号部件” 从2003年3月开始,经过8个多月的潜心研究,梁传仁终于发明出汉字输入法。他将第一个版本命名为“自由形码”汉字输入法。经过五次升级后,他把该输入法最定名为“形同意合码”。 梁传仁说,他搜罗来各种字词典,细细查看字表词表、字频词频和笔势笔顺等内容,每天都在汉字中打转,琢磨拆字编码的“窍门”。为了减少一个重码,他必须对文字结构的视觉心理作研究,对每个汉字的组合习惯进行求证。有时,也会因改一码而乱了全局,需要回头再重新来。“烦杂汉字的分类、整理和测试,并要进行不断地检索、查找和排序。” 他介绍,利用键盘上的26个英语字母和6个其他的符号,将所有的汉字拆成与之对应的32个“部件”,然后再进行组合。目前,经国家专利部门测试,使用该输入法,3000多个国标一级汉字没有出现重码,1万多个国标字中也仅有5~6个重码,重码几率比现有的拼音输入法缩小了几十倍。 3、运用 新手也可顺利打字 梁传仁说,“学用‘形同意合码"输入法,无须背字根,也无须精通普通话和汉语拼音,甚至无须多花时间事先了解一下它的原理和规则,你就可以上机打字。”老梁很自豪地说。打开他设计的第五版本软件,便可以立即练习打字。一口气可以打出几十个、甚至几百个汉字。每个字只需要打一遍,没有重复的字,也不用反复练习。比如“吕”字,在键盘上按“O”键,再按上一次“O”键,“显示栏”上就立即出现一个“吕”字。又如“叮”字,按键盘上的“O”和“J”键。“印”字为EP,“合”字为AO,“凶”为XU等。 梁传仁把所有汉字“部件”拆成为英语字母模样,比如“口”字像“O”,“合”字的上半部分和“大”字均用“A”代码等,“形同意合码”的涵义就如“跟着感觉走”。许多“部件”,仅凭直观的感觉就知道该去按哪个对应键。他形容,部件及其键位,两者之间存在着一种形状相似或者意义相近的自然吸引力和结合力,仿佛双方一见钟情。“形同意合码”的原理是“看形意近似来布置键位”,它的规则是“依习惯倾向来拆分部件”。 梁传仁还说,他将所有的排码完成后,在儿子的帮助下,编写出了五大本的“形同意合码"输入法软件程序。 人生经历 只上过一年大学 采访中,梁传仁告诉记者,他学历只有高中一年级文化程度。1950年入伍后,他就一直担任部队的文化教员等职务。因当时整个部队官兵的文化素质普遍偏低,战士中有许多是文盲和半文盲。 在他当兵的时候,就在部队里的文化队举办过短期教学班,为连队的官兵开设了语文、代数、物理等课程,每年有许多自己教过的“学生”达到初中以上文化水平。后来,部队为了提高文化教员的综合素质,在1956年8月将他保送到湖北师专物理系进修一年。 “我只仅仅上过一年的大学,后来被中断了。”老梁惋惜地说。因当时全国进行“反右”活动,于是停止了他的学业。至今,他也没有完成正规的大学学习。 曾自编“代数速成法” 梁传仁说,在年轻的时候,他曾根据自己学过的高等数学知识,借用“变换”、“行列式”、“矩阵”等概念和方法,对初中代数的内容从新的视角进行了审视,并对原有的概念、方法、结构和系统进行改造后,写成了一份《初中代数速成教学法》,交给了当时的有关领导,但最终没有音信。 他表示,自己研究的代数教学法,简单易学。小学一、二年级的孩子也能学懂。曾萌发了这样一个想法:把初中一年级的代数放到小学来教学。“我买来小学各年级的全部数学课本,仿照其体例,重编其内容,把代数融入小学一年级的数学课程中。可惜最后因文革时被抄家,手稿也被视为废纸扔掉了。”他很痛心地说。 到目前为止,梁传仁最大的心愿便是把这种速成法做成软件,让众多的孩子们能在几个钟头之内,基本掌握有理数运算和一元一次方程解法。 十年辅导百余“学生” 在虎门镇海景巷一座陈旧的房子里,梁传仁被当地市民称为“奇师”。近十年来,他免费辅导的百余名“学生”。 被他命名为“海的书藏”的简陋屋子里,记者看到,到处堆满了书籍,其中不少都已发黄。梁传仁说,目前他的藏书有8000多册,涵盖政治、文化、科技等不同领域。不久前,他家的藏书被评为东莞市虎门镇“书香之家”,其事迹在东莞市图书馆“莞邑藏书展”上展览过呢。同时称,自己十多年来收留过许多学生,最多时达到100多人。主要教他们电脑、音乐等各方面知识,但从没有收过学生的学费。 梁传仁其人 梁传仁,男,1935年6月出生,籍贯广西。在部队服役40年,1990年从某部退休。1994年开始学习电脑知识,2000年研究出“形同意合码”中文输入法。目前,已向国家专利部门申报五个版本的软件专利。
2023-10-02 12:58:191

c语言矩阵运算

#include<stdio.h>#include<math.h>void jiafa(){ int m,n; float a[20][20],b[20][20],c[20][20]; int i,j; printf("请输入矩阵行数:"); scanf("%d",&m); printf("请输入矩阵列数:"); scanf("%d",&n); printf("请输入第一个矩阵:"); for(i=0;i<m;i++) for(j=0;j<n;j++) scanf("%f",&a[i][j]); printf("请输入第二个矩阵:"); for(i=0;i<m;i++) for(j=0;j<n;j++) scanf("%f",&b[i][j]); printf("矩阵相加的结果为:"); for(i=0;i<m;i++) { for(j=0;j<n;j++) { c[i][j]=a[i][j]+b[i][j]; printf("%4f ",c[i][j]); } printf(" "); }}void jianfa(){ int m,n; float a[20][20],b[20][20],c[20][20]; int i,j; printf("请输入矩阵行数:"); scanf("%d",&m); printf("请输入矩阵列数:"); scanf("%d",&n); printf("请输入第一个矩阵:"); for(i=0;i<m;i++) for(j=0;j<n;j++) scanf("%f",&a[i][j]); printf("请输入第二个矩阵:"); for(i=0;i<m;i++) for(j=0;j<n;j++) scanf("%f",&b[i][j]); printf("矩阵相减的结果为:"); for(i=0;i<m;i++) { for(j=0;j<n;j++) { c[i][j]=a[i][j]-b[i][j]; printf("%4f ",c[i][j]); } printf(" "); }}void chengfa(){ int m,n; float s; float a[20][20],b[20][20],c[20][20]; int i,j,k; printf("请输入矩阵行数:"); scanf("%d",&m); printf("请输入矩阵列数:"); scanf("%d",&n); printf("请输入第一个矩阵:"); for(i=0;i<m;i++) for(j=0;j<n;j++) scanf("%f",&a[i][j]); printf("请输入第二个矩阵:"); for(i=0;i<n;i++) for(j=0;j<m;j++) scanf("%4f",&b[i][j]); for(i=0;i<m;i++) { for(j=0;j<m;j++) { s=0; for(k=0;k<n;k++) { s=s+a[i][k]*b[k][j]; c[i][j]=s; } } } for(i=0;i<m;i++) { for(j=0;j<m;j++) { printf("%4f ",c[i][j]); } printf(" "); }}void zhuanzhi(){ int m,n; float a[20][20],b[20][20]; int i,j; printf("请输入矩阵行数:"); scanf("%d",&m); printf("请输入矩阵列数:"); scanf("%d",&n); printf("请输入一个矩阵:"); for(i=0;i<m;i++) for(j=0;j<n;j++) scanf("%f",&a[i][j]); for(i=0;i<m;i++) { for(j=0;j<n;j++) { b[i][j]=a[j][i]; printf("%4f ",b[i][j]); } printf(" "); }}void qiuni(){ int N; printf("输入矩阵的阶数N: "); scanf("%d",&N); float a[10][10],b[10][20],c[10][10],t; int i,j,m; printf("请输入行列式不为0的矩阵A(%d阶): ",N); //矩阵A的各元素存入二维数组a中。 for(i=0;i<N;i++) for(j=0;j<N;j++) scanf("%f",&a[i][j]); //增广矩阵(A|E)存入二维数组b中 for(i=0;i<N;i++) for(j=0;j<N;j++) b[i][j]=a[i][j]; for(i=0;i<N;i++) for(j=N;j<2*N;j++) b[i][j]=0; for(i=0;i<N;i++) b[i][N+i]=1;for(m=0;m<N;m++) //对每行进行处理。 { t=b[m][m]; //预存b[m][m]。 i=m; while(b[m][m]==0) { b[m][m]=b[i+1][m]; i++; } if(i>m) { b[i][m]=t; //实现交换。//交换其它各列相应位置的元素 for(j=0;j<m;j++) { t=b[m][j]; b[m][j]=b[i][j]; b[i][j]=t; } for(j=m+1;j<2*N;j++) { t=b[m][j]; b[m][j]=b[i][j]; b[i][j]=t; } }for(i=m+1;i<N;i++) for(j=2*N-1;j>=m;j--) b[i][j]-=b[i][m]*b[m][j]/b[m][m]; //m=0时,将第一行的-b[i][0]/b[0][0]倍加到以下各行。这样以下每行第一个元素b[i][0]就为0。 for(j=2*N-1;j>=m;j--) b[m][j]/=b[m][m]; //对第m行作行变换,同除以b[m][m],使b[m][m]为1。 }printf("第一步变换后得到的增广矩阵为: "); for(i=0;i<N;i++) { for(j=0;j<2*N;j++) printf("%3.5f ",b[i][j]); printf(" "); //实现了:每个i对应一个换行。 }m=N-1; while(m>0) { for(i=0;i<m;i++) for(j=2*N-1;j>=m;j--) //千万注意,此处j必须递减,否则b[i][m]先变为0,后面的计算就无效! b[i][j]-=b[i][m]*b[m][j]; m--; } printf("最后得到的增广矩阵为: "); for(i=0;i<N;i++) { for(j=0;j<2*N;j++) printf("%3.5f ",b[i][j]); printf(" "); //实现了:每个i对应一个换行。 } for(i=0;i<N;i++) //将逆矩阵存入二维数组c中。 for(j=0;j<N;j++) c[i][j]=b[i][N+j];printf("故逆矩阵为: "); for(i=0;i<N;i++) { for(j=0;j<N;j++) printf("%3.5f ",c[i][j]); printf(" "); //实现了:每个i对应一个换行。 }} main(){ int w; printf("1矩阵加法 "); printf("2矩阵减法 "); printf("3矩阵乘法 "); printf("4矩阵转置 "); printf("5矩阵求逆 "); printf(" "); printf("请选择要进行的运算:"); scanf("%d",&w); switch(w) { case 1:jiafa();break; case 2:jianfa();break; case 3:chengfa();break; case 4:zhuanzhi();break; case 5:qiuni();break; } return 0;}
2023-10-02 12:59:496

c++ 用代数余子式计算五阶行列式的值

设计一个类,计算行列式的值,行列式的阶数由键盘输入。要求该类可以作为其他类的基类(可继承,用常数列可以替换某列)。显示信息为:请输入行列式的阶数(1-20):3请选择输入行列式个元素的方式1.键盘输入2.随机函数自动产生请选择:2随机数的位数(1-5):2行列式:xxxxxxxxx行列式:abc行列式的值:abc=
2023-10-02 13:00:082

C51单片机用IO口做为几个按键的控制,现在想用4X4键盘控制,请问下面显示程序应该怎么改啊?折磨死了

// 4*4矩阵键盘/********************************************************连接: ------------------------------------ P1.0 P1.1 P1.2 P1.3 p1.4 S1 S5 S9 S13 P1.5 S2 S6 S10 S14 P1.6 S3 S7 S11 S15 P1.7 S4 S8 S12 S16 ------------------------------------实现原理:当高电平端口与低电平端口短接时,高电平端口会被拉成低电平------------------------算法分析:1,检查是否有键按下: P1=f0h (即0-3置1,4-7置0) 检查P1口是否是0F0H 是,则无键按下 否,则有键按下2,扫描按下的键值: 循环(依次将4至7口单独置0) 检查0-3口是否有低电平端 确定被按下的键 返回键值3,键盘防抖:抖动原因:键按下时,会产生电压的波动,持续约10MS去抖方法:10MS扫描一次,使前后两次均有键按下********************************************************/#include<ytc51.h>uchar jps,ks; //键盘缓存/*键盘扫描程序1,检查是否有按键*/uchar keyfun(){ uchar key_c; P2 = P2 & 0x03; P2 = P2 | 0x3c; key_c = P2; if((key_c & 0xfc) == 0x3c) return (0); else return(1);}/*键盘扫描程序2,确定按键数值*/uchar keyscan(){ uchar i,k; P2 = P2 & 0x03; P2 = P2 | 0xbc; if((P2 & 0x3c) != 0x3c) { i = 0; k = (~P2) & 0x3c; } else { P2 = P2 & 0x03; P2 = P2 | 0x7c; if((P2 & 0x3c) != 0x3c) { i = 1; k = (~P2) & 0x3c; } } k = k>>3; if( k==4 ) k=3; k=i*4+k+1; return(k);}/**********************************************************************函数功能: 定时器中断函数(扫描键盘)(10ms 16位定时)入口参数: 无出口参数: 无***********************************************************************/void Time0_Func() interrupt 3 /*当定时器中断时执行此函数*/{ TH1=(0xffff-9259)/256; /*T0初始化*/ TL1=(0xffff-9259)%256; WR = 1; if((ks == 0) && ( keyfun() )) { jps = keyscan(); } ks = keyfun();}/**********************************************************************函数功能: 上电初始化函数入口参数: 无出口参数: 无***********************************************************************/void Power_Up(void){ TMOD = 0x10;/*Time0/1为16计数器*/ TH1=(0xffff-9216)/256;/*10ms*/ TL1=(0xffff-9216)%256;/*10ms*/ TR1=1; SCON = 0x00;//串口工作模式设置 IE=0x88; /*EA=1 ET1=1*/ P0=0xff; P2=0xff;}
2023-10-02 13:00:401

C语言的编程题!

有没有搞错,这么多题,才10分!!!
2023-10-02 13:01:416

从键盘上为一个5*5的整型数组输入数据,并找出主对角线上元素的最大值及其所在的行号

用神马语言啊?!Java?C?C++?C#? or something else?要代码还是要算法思想???
2023-10-02 13:02:042

求这3题线代过程

练习1、左手画 方,右手 画园,同时开始,同时结束。练好了再换手。2、打拍子,左手1拍右手2拍,同时打,熟练后,右手换 三连音,换 4个 16,换 大切分,换 前 16 ,换 后16.这也许不是一个准确的时间能说明的问题.因为这其中牵涉到一些其他的因素.如果单纯说只想学会弹卡农,认识五线谱后你就可以去做这件事了,只是会很耗力气.原因很简单,对五线谱跟键盘的不熟悉造成的.这里给你有个建议也就是所谓的学习计划一:首先把五线谱上音符的位置都找准,然后把旋律部分摘下来在琴键上把相对的音符位置找见.跟唱.二:上面的阶段结束后,就可以开始左手部分的伴奏了.一样的规律.但记住,在你练习阶段,一定注意是分手练/三:以上两个阶段顺利结束后就可以合手了,一小节一小节走.音符节拍的位置要对准,音符时值要控制好.四:每天坚持不断重复的练习,也就是说要把时间分成一段段的练习,比方说上午一小时,下午一小时,晚上一小时重复练同一个地方,这样你的进步会突飞猛进的.
2023-10-02 13:02:402

“波形发生器”设计

1.2.1 课题背景随着科学技术的迅速发展,数字化技术已渗透到各个领域。智能仪表装置由于其安全、方便、高效、快捷、智能化等特点,使它在21世纪成为各种科学技术领域和工程实践的助手。它对于改善现代人类的生活质量,创造、安全、便利的生活空间有着非常重要的意义。随着电子技术的发展 , 数字化技术在智能仪表 ,外设控制等方面取得了广泛的运用。其中幅值、波形和频率可调的智能信号发生器经常要用在各种科学技术领域和工程实践中。函数信号发生器和示波器、电压表、频率计等仪器一样是最普通、最基本的 ,也是应用最广泛的电子仪器之一 ,几乎所有的电参量的测量都需要用到信号发生器 。频率越高、产生的波形种类越多的发生器性能越好,但器件的成本和技术要求也大大提高。比如:利用专用直接数字合成DDS芯片实现信号发生器。这种信号发生器能产生任意波形并达到很高的频率,但成本很高。因此,综合成本和性能等多方面考虑,设计出一款单片集成芯片配合52单片机实现的智能信号发生器是一次非常有意义的尝试。该种智能信号发生器能产生多种波形信号,达到较高的频率,易于调试,且有很高的性价比。怎么样才能设计出一款内部功能齐全,外围电路简单,使用方便的智能信号发生器呢?这就需要用到集成信号发生芯片。随着半导体芯片制造业的迅速发展和研制水平的飞速提高,出现了很多功能强大且性能可靠的集成信号发生芯片 ,几乎代替了以前用分立元件搭成的信号发生电路模块。精密函数发生芯片MAX038就是其中之一,而且在众多的信号发生芯片中MAX038 芯片的性价比较高 。所以本设计选用精密函数发生芯片MAX038。本设计中,用户可根据自己的需要,将要输出的波形种类通过外置键盘输入单片机,调用其相应的子程序,再通过与MAX038相连的可变电阻来调节波形的频率和占空比,经MAX038输出到放大电路,最后接到示波器,由示波器显示产生的波形。这种信号源的频率改变十分方便 ,而且线路简单,调试和修理简捷,性能价格比较高。1.2.2 技术指标本文设计的智能信号发生器的技术指标如下:(1)可以输出正弦波、矩形波及三角波;(2)输出方波的占空比可调范围在10%~90%;(3)输出信号的频率稳定度和准确度: ;(4)正弦波非线性失真度 :小于1%;(5)频率可调范围:0.1HZ~20MHZ;(6)幅度:6V为了达到这一目标,本课题重点在以下几个方面展开工作:(1)信号发生器的基本原理及相关技术的研究学习本课题工作初期主要阅读了大量相关书籍,特别是MAX038芯片的资料,还深入研究了信号发生器的基本原理、技术特点等。在这些工作的基础上,提出了系统的解决方案,并解决了其中的关键技术难题。 (2)硬件系统设计 硬件电路设计主要包括键盘电路、单片机外围电路、MAX038外围电路(占空比调节、频率调整电路)、放大电路的设计。根据系统方案的要求,ATMEL公司的8位Flash 单片机AT89C52作为系统的控制核心及数据处理中心,接距阵式键盘和MAX038电路部分。 (3)软件系统设计软件系统主要包括键盘去抖动延时程序、键盘扫描程序、波形选择程序。软件编程用C51语言。第二章 系统方案及原理框图2.1 系统方案设计MAX038是单片集成芯片,需要通过单片机的控制实现函数信号的波形选择。波形选择由两个输入引脚A0 和A1的逻辑电平设定。通过4*4键盘输入要产生的波形的种类,单片机判断键码并通过两个I/O口控制MAX038的A0和A1引脚,从而控制MAX038输出相应的波形。关于占空比调节和频率调整,为简单起见,可采用外部电位器调整控制。2.2 系统工作原理及框图从图2-1可以看出,系统按功能模块可分为几个部分:单片机系统:控制外围的信号发生芯片,完成波形选择。外围电路:实现外围的信号发生芯片和单片机之间的接口电路。C51程序:编写单片机外围信号发生芯片的接口程序,实现单片机函数信号输出功能。AT89C52单片机4*4键盘波形选择占空比调节节 MAX038频率调整放大电路波形输出图2-1 系统原理框图工作过程为:打开电源开始工作,按复位键复位,在键盘上输入所需波形,调用单片机的程序存储器中其相应的子程序 ,再通过与MAX038相连的可变电阻来调节波形的频率和占空比,经MAX038输出到放大电路,最后接到示波器,由示波器显示产生的波形。第三章 硬件电路设计本章将介绍信号发生器的电路设计原理,对各个功能模块分别进行讨论,主要包括键盘电路、单片机外围电路、MAX038外围电路(占空比调节、频率调整电路)、放大电路。3.1 键盘电路行列式键盘也即矩阵式键盘,它由行和列组成,在每个行列的交叉点上放置一个按键。4*4键盘是一种常见的键盘,用在本设计中完全能够满足要求。4*4行列式键盘共由16个键盘组成。图3-1是键盘电路图。矩阵键盘原理:矩阵键盘中,一个按键按下后会触发两个电平信号:X、Y,单片机通过扫描X、Y的值判断按键状态。把单片机AT89C52中的P1.0-P1.7端口用8芯排线连接到“4*4行列式键盘”区域中的L1-L4、C1-C4端口上。图3-1 键盘电路3.2 单片机外围电路设计MAX038是单片集成芯片,需要通过单片机的控制实现函数信号的波形选择。单片机是核心器件之一,通过它对MAX038的设置,实现不同波形的选择和输出。由于系统控制方案不太复杂 ,数据量也不太大,我们选用 AT89C52 作为控制系统的核心。它极为常用,价格便宜,易于获取。3.2.1 单片机外围电路硬件部分AT89C52是美国Atmel公司生产的低电压、高性能CMOS 8位单片机,片内含8KB的可 图 3-2 AT89C52管脚图反复檫写的程序存储器和12B的随机存取数据存储器(RAM),器件采用Atmel公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内配置通用8位中央处理器(CPU)和Flash存储单元,功能强大的AT89C52单片机可灵活应用于各种控制领域。AT89C52单片机属于AT89C51单片机的增强型,与Intel公司的80C52在引脚排列、硬件组成、工作特点和指令系统等方面兼容。图 3-2 是AT89C52的管脚图。其主要工作特性是:片内程序存储器内含8KB的Flash程序存储器,可擦写寿命为1000次;片内数据存储器内含256字节的RAM;具有32根可编程I/O口线;具有3个可编程定时器;中断系统是具有8个中断源、6个中断矢量、2个级优先权的中断结构;串行口是具有一个全双工的可编程串行通信口;具有一个数据指针DPTR;低功耗工作模式有空闲模式和掉电模式具有可编程的3级程序锁定位;AT89C52工作电源电压为5(1+0.2)V,且典型值为5V;AT89C52最高工作频率为24MHz。单片机正常工作时,都需要有一个时钟电路和一个复位电路,来构成单片机的最小电路。如图3-3所示。(1) 时钟电路 XTAL0(18脚)和XTAL1(19脚):计算机工作时,是在统一的时钟脉冲控制下一拍一拍的进行的,这个脉冲是由单片机控制器中的时序电路发出的。单片机的时序就是CPU在执行指令时所需控制信号的时间顺序。为了保证各部件间的同步工作。单片机内部电路就在唯一的时钟信号控制下严格地按时序进行工作。要给单片机提供时序要有相关的硬件电路,即振荡器和时钟电路。因此选择了内部时钟方式。利用芯片内部的振荡器,然后在引脚XTAL0和XTAL1两端跨接晶体或陶瓷谐振器,就构成了稳定的自激振荡器,其发出的脉冲直接送入内部时钟电路,AT89C52最高工作频率为24MHz,在本设计中采用11.0592 MHz晶振。外接晶振时,C1和C2值通常选择为22PF左右。C1,C2对频率有微调作用。晶体的频率范围可在1.2~12MHZ之间选择。在实际连接中,为了减少寄生电容,更好地保证振荡器稳定、可靠地工作,振荡器和电容应尽可能安装得与单片机芯片靠近。(2) 复位电路 RESET( 9脚)是复位, 由图3-3可以看出,按键电平复位电路相当于按复位键S1后复位端通过电阻与Vcc电源接通。复位是单片机的初始化操作。单片机在启动运行时,都需要先复位,其作用是使CPU和系统中其他部件都处于一个确定的初始状态,并从这个状态开始工作。因而,复位是一个很重要的操作方式。但单片机本身是不能自动进行复位的,必须配合相应的外部电路来实现。(3) 单片机电源(40脚)是电源:AT89C52工作电源电压为5(1+0.2)V,且典型值为5V;在线路中,电源去藕是一个关键问题。整个线路往往会由于电源引线而产生电路谐振,当有大的瞬时变化时,也会产生尖峰干扰信号。消除这两种现象的有效办法就是在片子的电源管脚与地之间加上适当的去藕电容,如图3-3中的C4。(4) P1、P2口P1口:是一个带内部上拉电阻的8位双向I/O口,P1的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。对端口写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作为输入口。作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流(IIL)。在图3-3中,KEY为单片机的外围4*4键盘接口,它和单片机的P1.0~P1.7连接,P1.0~P1.3对应于键盘的行1~4,P1.4~P1.7对应键盘的列1~4。P2口:P2是一个带有内部上拉电阻的8位双向I/O口,P2的输出缓冲极可驱(吸收或输出电流)4个TTL逻辑门电路。Flash编程或校验时,P2也接收高位地址和一些控制信号。在本设计中,单片机的P2.0和P2.1脚和MAX038的A0和A1相连,用于选择输出波形种类。图3-3 单片机部分硬件电路 3.2.2 单片机外围仿真电路部分仿真软件:Proteus7.1A0=0或者1、A1=1,即键盘第一行第一列的情况。表示选择的是正弦波。A0=0、A1=0,即键盘第一行第二列的情况,表示选择的是矩形波;A0=1、A1=0,即键盘第一行第三列,表示选择三角波输出。D1(A0)D2(A1)选择的波形暗(0)或者亮(1)亮(1)正弦波暗(0)暗(0)矩形波亮(1)暗(0)三角波表3-1单片机部分仿真结果图3-4仿真的是A0=0、A1=1,即键盘第一行第一列。表示选择的是正弦波的情况。图3-4 单片机部分软件仿真电路3.3 MAX038外围电路设计3.3.1 MAX038的基本工作原理MAX038是美国Maxim公司的一款高频率、高精度、低输出电阻、驱动能力强的函数信号发生器芯片,它是新一代的单片函数信号发生芯片。MAX038内部含有精密带隙电压基准、鉴相器和TTL同步输出,能以最少的外部元件构成波形高频函数信号发生器,也可以应用于压控振荡器(PPL)、脉宽调制器、锁相环、频率调制器、频率合成器及FSK信号(正弦波和方波)发生器,是目前较为理想的信号发生集成芯片 。如图3-5所示MAX038内部主要由振荡器、参考电压源2.5V、 恒流源250UA发生电路、多路选择开关 、比较器、相位监测器、输出缓冲器等电路组成。MAX038是单片精密函数信号产生器 ,它用±5V电源工作 ,基本的振荡器是一个交变地以恒定电流向电容器充电和放电的驰张振荡器 ,同时产生一个三角波和矩形波。通过改变COSC引 脚的外接电容 和流入 引脚的充放电电流的大小来控制输出信号频率, 工作频率范围为0.1Hz~20MHz。 流入 引脚的电流由加到FADJ 和DADJ 引脚上的电压来调制, 通过这两个引脚可用外接电压信号分别调整频率和占空比。MAX038内部有一个正弦波形成电路把振荡器的三角波转变成一个具有等幅的低失真度正弦波。三角波、正弦波和矩形波输入一个多路器,两根地址线A0和A1从这三个波形中选出一个。图3-5 MAX038的内部结构(虚线框内)MAX038内部有一个2.5V的基准电压源,由REF引脚输出。基准电压源电路由两个运放LF353及电阻、电容组成,分别组成放大倍数为+1和-1的缓冲器,因而得到 的基准电源。这个电压源对整机的性能很重要,因为各控制电路均需要参考输入。图3-6 MAX038管脚图鉴相器是作为锁相环的备用单元,为异或门电路结构,输入信号一路来自内部差动矩形波OSCA和OSCB,另一路来自外部引脚PD1。鉴相器输出信号为电流,由PD0引脚输出,平均值变化范围为0~550 。当两路输入信号的相位差为 时,输出电流的占空比为50%,平均值为250 。如果构成锁相环电路,则PDO和FADJ相连,并且对地连接一个电阻 ,同时并联一个电容 。 决定鉴相器的灵敏度, 则滤除电流中的高频成分。MAX038的各引脚功能见于表3-2。 表3-2 MAX038引脚功能注:5个GND脚在MAX038内部是不连接的,在电路设计时,需要一个地平面,然后所有5个GND脚连到靠近MAX038器件的地平面上。表3-3是MAX038 地址线A0和A1对波形选择的取值。表3-3 MAX038 地址线A0和A1对波形选择的取值波形选择由A0和A1两个输入引脚的逻辑电平设定:当A0=0或1、A1=1时为正弦波;当A0=0、A1=0时输出矩形波;当A0=1、A1=0时输出三角波。MAX038的关键特性如下:(1)工作频率范围从 0.1HZ~ 20MHZ,各种波形的输出幅度均为2 V(P-P);(2)能精密地产生三角波、方波、正弦波信号;(3)占空比调节范围宽, 占空比和频率均可单独调节, 互不影响, 占空比最大调节范围10%~90%;(4)波形失真小, 正弦波失真度低于1%;(5) 采用±5V双电源供电, 允许有5%变化范围,电源电流为 80mA , 典型功耗 400 mW, 工作温度范围为0~70℃;(6) 内设2.5V电压基准,利用控制端FADJ、DADJ实现频率微调和占空比调节;(7)频率扫描范围:350倍;(8)输出电阻:0.1 ;(9)温度系数: 。MAX038核心部分是一个电流控制的振荡器,通过恒定的电流对外部电容 充电和放电,获得三角波和方波信号输出。充、放电电流由流进MAX038的 脚的电流控制,由加在引脚FADJ、DADJ上的电压调整。电路的振荡频率为: f= (1-0.2915 )= (1-0.2915 )/ (1)波形的占空比为: (2)当 =0时, 可设为2~750 ,对应中心频率为350:1的变化范围;当= 时,调制频偏为 。控制外部电容 充、放电电流的比值,当 =0时,波形的占空比为50%;当 = 时,占空比为10%~90%。在FADJ和DADJ端口的内部,设置了250 的下拉电流源,可简化外部电路设计,仅用电阻 (连接引脚FADJ和2.5V基准电压的可变电阻)和 (连接引脚DADJ和2.5V基准电压的可变电阻)就可以对频偏和占空比进行调整。 端口由内部的运放强制为虚地,故仅用电阻 就能调整输入电流 ,实现中心频率的调节。3.3.2 占空比调节原理MAX038的DADJ引脚上的电压可控制波形的占空比 (定义为输出波形为正时所占时间的百分数),并且能够改善正弦波的波形,可进行脉冲宽度调制和产生锯齿波。当 接地(即 =0)时,由 可得其占空比为50%。当 =±2.3V时,占空比可在 10%~90%范围内调整;当电压超过±2.3V 时,将使频率偏移或引起不稳定。加在DADJ上的电压: (3)其中: 为 DADJ 引脚上的电压, 为定义为输出波形的占空比。由公式(3)可完成的占空比设置。在本设计中要求占空比 在10%~90%的变化范围,这样 的范围为-2.3V~+2.3V之间变化。因为:为内部恒流源; :连接引脚DADJ和2.5V基准电压的可变电阻。基准电压 :+2.5V由以上分析,可以计算出要使 的范围为-2.3V~+2.3V之间变化时 的范围在0.8K~19.2K 之间变化。所以 可以选择20K 的可变电阻。综上,MAX038工作时引脚DADJ电压的变化可引起电容 充电和放电的相对速率的变化,由此引起矩形波占空比发生变化 ,当 时矩形波占空比为50%,即输出为方波。 的变化范围为±2.3V则占空比的变化范围为10%~90%。所以 ,可使 变化 ,从而改变占空比,这即是设置占空比调节的原理。3.3.3 频率调整原理(1) 频率粗调原理由MAX038内部结构及参考文献[4]可得,当引脚FADJ的电压 =0时,MAX038输出信号频率的计算由式(1)给出: (4)(4)式中, 的计算为 (5) (5)式中 为内部输出的2.5V恒定参考电压,可见 时, 输出信号的频率完全由内部结构及充电电容 决定。 电流大小在2~750μA内变化,电容大小若为pF量级,则输出频率的大小为MHz量级;电容大小若为 μF量级 则输出频率的大小为kHz量级;电容大小若为μF量级,则输出频率的大小为Hz量级;所以其输出频率范围为0.1Hz~20MHz。由此可通过改变电容 的大小达到大幅度地改变输出信号频率,这即是设置频率粗调的原理。在本设计中要求频率在0.1HZ~20MHZ的变化范围,所以选择电容大小若为pF量级。(2) 频率细调原理MAX038工作时引脚FADJ的电压 由参考电压 及可调电阻 决定 = -250μA× (6)由(6)式得 (7)= 时,代入(7)式得到 的变化范围为0.4K~19.6K,所以 可以选择20K 的可变电阻。由(6)式调节 ,可变化FADJ引脚的电压,其变化范围为±2.4V。而 的变化可引起电容充电电流的变化 输出频率则以(4)式的频率 为中心频率,产生±70%左右的变化。由此可通过调节可变电阻 的大小,达到小幅度改变输出信号的频率,这即是设置细调输出信号频率的原理。综上所述,MAX038的输出频率 由 、 、 三者共同决定,当 =0时 = = / = / * ,实现粗调;当 0时, = (1-0.2915 ),实现细调。3.3.4 MAX038外围电路图 3-7 MAX038外围电路原理图由以上的分析,设计出的MAX038部分的电路如图3-7。SYNC电路具有单独的电源引线因而可被禁止。 数字电压 (+5V)电源端,如果没有用到SYNC的时候 应该悬空。PDI、PDO引脚分别是相位检波器的输入和输出端,在本设计中不用应该接地。3.3.5 MAX038外围电路注意事项由MAX038实现的信号发生电路是模数混合电路,因此在电路设计和线路板布局上都必须注意。具体有:(1)如果PCB板中,MAX038的模拟电源和数字电源需要分开,在供电时要分别供电,即分别取不同的电源,以防数字信号通过电源线干扰模拟部分;同样,模拟地和数字地的处理要慎重,万用板上要用低阻地平面分别将模拟地和数字地连接,再在某点上将两地相连。(2)信号线要尽量部在焊接面,元件面为地平面,这样就可减少信号间的干扰,这一点对系统性能的稳定尤为重要,因为系统性能受 、FADJ、COSC、DADJ等引脚周围的分布电容及信号环境变化的影响特别敏感。此外,这些引脚引线的长度和面积还应尽量短小。(3)由于不同结构的电阻具有不同的寄生电容和寄生电感,因此选择电阻时,应选用寄生电容和寄生电感小的电阻。推荐使用1%以上精度的金属膜电阻。(4)在高频线路中,电源去藕是一个关键问题。整个线路往往会由于电源引线而产生电路谐振,当有大的瞬时变化时,也会产生尖峰干扰信号。消除这两种现象的有效办法就是在片子的电源管脚与地之间加上适当的去藕电容,一般使用1 以上的优质电容。在许多场合,采用2个电容并联的方法(并联一个0.1 电容),则去藕效果更佳。3.4 幅度放大电路由于MAX038的输出信号为恒定的2V(P-P),且输出电流不高,所以必须在输出级至少有一级的放大电路来提供足够的输出电压和电流,以满足一般的使用要求。以下是放大电路设计的几点考虑:图3-8 放大电路(1) 首先,要求放大电路具有很高的频宽。因为输出信号最大基频为20MHZ,其三角波和矩形波的高次谐波成分很高,只有高频宽才能得到不失真的输出波形。(2) 其次,高频大信号放大要求电路有足够的输出电压转换速率。(3) 另外,要带动低阻负载,放大电路的电流输出能力也是个重要参数。要在10 负载上输出6V信号,则放大器至少要有60mA的连续电流输出能力。居于以上要求本设计的放大电路部分如图3-8。采用低功耗,宽带,高速运算放大器AD8055提高了放大电路的带宽和转换速率,把电压由原来MAX038输出的2V放大到6V。而9013和9012构成了“推挽式电路”也叫做互补对称电路,实现了在静态时管子不取电流,而在有信号时,T1、T2轮流导电。T1、T2是工作在乙类的放大电路,管耗小,提高了电流,从而提高了效率,而且减少了失真。最后接的电阻是为了防止输出端的外接负载短路,所以加一个电阻限制电流。3.5 软件设计软件需要实现的主要功能是检测键盘的输入,根据输入结果选择输出相应的波信号。键盘操作和对应的输出如下:输入按键“0”(第一行第一列),得到正弦波;输入按键“1”(第一行第二列),得到矩形波;输入按键“2”(第一行第三列),得到三角波;软件编程用C51语言,主要包括键盘去抖动延时程序、键盘扫描程序、波形选择程序。单片机控制MAX038实现波形输出的程序流程图3-9。开始初始化键盘扫描键码为11?键码为21?键码为41?NONONO输出正弦波输出矩形波输出三角波图3-9 单片机控制MAX038实现波形输出的程序流程图键码为11对应的是第一行第一列的按键;键码为21对应的是第一行第二列的按键;键码为41对应的是第一行第三列的按键。希望对你能有所帮助。
2023-10-02 13:02:541

单片机键盘扫描的问题

36个按键?恐怕要四十个按键:5×8个i/o口,就够了如:51的单片机,可以用p0.0-p0.7和p2.0-p2.4组成矩阵式键盘就可以了。
2023-10-02 13:03:434

单片机键盘程序问题

你明白矩阵键盘的原理吗??先上网搜个视频看看就明白了,不太好讲!!
2023-10-02 13:04:011

键盘显示接口电路设计 急!

这个不是教材里面的例题么推荐你看 吉林大学出版社出版的 汇编语言和电路接口设计两本都是黄本的小书
2023-10-02 13:04:093

利用模数转换器(ADC)可以设计键盘检测功能电路,采用行列式结构,按键安装在行和列的交点上。电路如下图

不是画的很明白吗,例如此时按下S5,此时把S5左侧的总体看作一个电阻值,此电阻与(r27+r28+。。。r38)并联,然后与(r23+r24+。。。r26)串联,总体电压是Vcc,此时可以算出s5左侧总的电阻值分得的电压值,并对其进行采样,由ad模块转换成数字量。其他的一样。
2023-10-02 13:04:241

求基于8051单片机用C语言编写的双矩阵键盘扫描程序(5个IO口控制25个按键)

5个按键确实可以控制25个按键,不过要加二极管。
2023-10-02 13:04:424

PIC16F877A的4*4矩阵式按键程序该怎么写

电脑上面只有51的,不行的话明天有877A的,现在的这台电脑上面没有源代码4×4矩阵式键盘识别技术实验任务如图4.14.2所示,用AT89S51的并行口P1接4×4矩阵键盘,以P1.0-P1.3作输入线,以P1.4-P1.7作输出线;在数码管上显示每个按键的“0-F”序号。对应的按键的序号排列如图4.14.1所示图4.14.1硬件电路原理图图4.14.2系统板上硬件连线把“单片机系统“区域中的P3.0-P3.7端口用8芯排线连接到“4X4行列式键盘”区域中的C1-C4 R1-R4端口上;把“单片机系统”区域中的P0.0/AD0-P0.7/AD7端口用8芯排线连接到“四路静态数码显示模块”区域中的任一个a-h端口上;要求:P0.0/AD0对应着a,P0.1/AD1对应着b,……,P0.7/AD7对应着h。程序设计内容4×4矩阵键盘识别处理每个按键有它的行值和列值 ,行值和列值的组合就是识别这个按键的编码。矩阵的行线和列线分别通过两并行接口和CPU通信。每个按键的状态同样需变成数字量“0”和“1”,开关的一端(列线)通过电阻接VCC,而接地是通过程序输出数字“0”实现的。键盘处理程序的任务是:确定有无键按下,判断哪一个键按下,键的功能是什么;还要消除按键在闭合或断开时的抖动。两个并行口中,一个输出扫描码,使按键逐行动态接地,另一个并行口输入按键状态,由行扫描值和回馈信号共同形成键编码而识别按键,通过软件查表,查出该键的功能。程序框图图4.14.3汇编源程序KEYBUF EQU 30H ORG 00HSTART: MOV KEYBUF,#2WAIT: MOV P3,#0FFH CLR P3.4 MOV A,P3 ANL A,#0FH XRL A,#0FH JZ NOKEY1 LCALL DELY10MS MOV A,P3 ANL A,#0FH XRL A,#0FH JZ NOKEY1 MOV A,P3 ANL A,#0FH CJNE A,#0EH,NK1 MOV KEYBUF,#0 LJMP DK1NK1: CJNE A,#0DH,NK2 MOV KEYBUF,#1 LJMP DK1NK2: CJNE A,#0BH,NK3 MOV KEYBUF,#2 LJMP DK1NK3: CJNE A,#07H,NK4 MOV KEYBUF,#3 LJMP DK1NK4: NOPDK1: MOV A,KEYBUF MOV DPTR,#TABLE MOVC A,@A+DPTR MOV P0,ADK1A: MOV A,P3 ANL A,#0FH XRL A,#0FH JNZ DK1ANOKEY1: MOV P3,#0FFH CLR P3.5 MOV A,P3 ANL A,#0FH XRL A,#0FH JZ NOKEY2 LCALL DELY10MS MOV A,P3 ANL A,#0FH XRL A,#0FH JZ NOKEY2 MOV A,P3 ANL A,#0FH CJNE A,#0EH,NK5 MOV KEYBUF,#4 LJMP DK2NK5: CJNE A,#0DH,NK6 MOV KEYBUF,#5 LJMP DK2NK6: CJNE A,#0BH,NK7 MOV KEYBUF,#6 LJMP DK2NK7: CJNE A,#07H,NK8 MOV KEYBUF,#7 LJMP DK2NK8: NOPDK2: MOV A,KEYBUF MOV DPTR,#TABLE MOVC A,@A+DPTR MOV P0,ADK2A: MOV A,P3 ANL A,#0FH XRL A,#0FH JNZ DK2ANOKEY2: MOV P3,#0FFH CLR P3.6 MOV A,P3 ANL A,#0FH XRL A,#0FH JZ NOKEY3 LCALL DELY10MS MOV A,P3 ANL A,#0FH XRL A,#0FH JZ NOKEY3 MOV A,P3 ANL A,#0FH CJNE A,#0EH,NK9 MOV KEYBUF,#8 LJMP DK3NK9: CJNE A,#0DH,NK10 MOV KEYBUF,#9 LJMP DK3NK10: CJNE A,#0BH,NK11 MOV KEYBUF,#10 LJMP DK3NK11: CJNE A,#07H,NK12 MOV KEYBUF,#11 LJMP DK3NK12: NOPDK3: MOV A,KEYBUF MOV DPTR,#TABLE MOVC A,@A+DPTR MOV P0,ADK3A: MOV A,P3 ANL A,#0FH XRL A,#0FH JNZ DK3ANOKEY3: MOV P3,#0FFH CLR P3.7 MOV A,P3 ANL A,#0FH XRL A,#0FH JZ NOKEY4 LCALL DELY10MS MOV A,P3 ANL A,#0FH XRL A,#0FH JZ NOKEY4 MOV A,P3 ANL A,#0FH CJNE A,#0EH,NK13 MOV KEYBUF,#12 LJMP DK4NK13: CJNE A,#0DH,NK14 MOV KEYBUF,#13 LJMP DK4NK14: CJNE A,#0BH,NK15 MOV KEYBUF,#14 LJMP DK4NK15: CJNE A,#07H,NK16 MOV KEYBUF,#15 LJMP DK4NK16: NOPDK4: MOV A,KEYBUF MOV DPTR,#TABLE MOVC A,@A+DPTR MOV P0,ADK4A: MOV A,P3 ANL A,#0FH XRL A,#0FH JNZ DK4ANOKEY4: LJMP WAITDELY10MS: MOV R6,#10D1: MOV R7,#248 DJNZ R7,$ DJNZ R6,D1 RETTABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H DB 7FH,6FH,77H,7CH,39H,5EH,79H,71H ENDC语言源程序#include <AT89X51.H>unsigned char code table[]={0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71};unsigned char temp;unsigned char key;unsigned char i,j;void main(void){ while(1) { P3=0xff; P3_4=0; temp=P3; temp=temp & 0x0f; if (temp!=0x0f) { for(i=50;i>0;i--) for(j=200;j>0;j--); temp=P3; temp=temp & 0x0f; if (temp!=0x0f) { temp=P3; temp=temp & 0x0f; switch(temp) { case 0x0e: key=7; break; case 0x0d: key=8; break; case 0x0b: key=9; break; case 0x07: key=10; break; } temp=P3; P1_0=~P1_0; P0=table[key]; temp=temp & 0x0f; while(temp!=0x0f) { temp=P3; temp=temp & 0x0f; } } } P3=0xff; P3_5=0; temp=P3; temp=temp & 0x0f; if (temp!=0x0f) { for(i=50;i>0;i--) for(j=200;j>0;j--); temp=P3; temp=temp & 0x0f; if (temp!=0x0f) { temp=P3; temp=temp & 0x0f; switch(temp) { case 0x0e: key=4; break; case 0x0d: key=5; break; case 0x0b: key=6; break; case 0x07: key=11; break; } temp=P3; P1_0=~P1_0; P0=table[key]; temp=temp & 0x0f; while(temp!=0x0f) { temp=P3; temp=temp & 0x0f; } } } P3=0xff; P3_6=0; temp=P3; temp=temp & 0x0f; if (temp!=0x0f) { for(i=50;i>0;i--) for(j=200;j>0;j--); temp=P3; temp=temp & 0x0f; if (temp!=0x0f) { temp=P3; temp=temp & 0x0f; switch(temp) { case 0x0e: key=1; break; case 0x0d: key=2; break; case 0x0b: key=3; break; case 0x07: key=12; break; } temp=P3; P1_0=~P1_0; P0=table[key]; temp=temp & 0x0f; while(temp!=0x0f) { temp=P3; temp=temp & 0x0f; } } } P3=0xff; P3_7=0; temp=P3; temp=temp & 0x0f; if (temp!=0x0f) { for(i=50;i>0;i--) for(j=200;j>0;j--); temp=P3; temp=temp & 0x0f; if (temp!=0x0f) { temp=P3; temp=temp & 0x0f; switch(temp) { case 0x0e: key=0; break; case 0x0d: key=13; break; case 0x0b: key=14; break; case 0x07: key=15; break; } temp=P3; P1_0=~P1_0; P0=table[key]; temp=temp & 0x0f; while(temp!=0x0f) { temp=P3; temp=temp & 0x0f; } } } }}
2023-10-02 13:05:421

求用avr单片机,c语言编电子密码锁,四个数码管显示,3*4的键盘其中有两个分别为清除和开始

有51的全盘资料。跟你的要求差不多 要的话自己留邮箱,窝发给你
2023-10-02 13:05:522

工程数学计算行列式,学霸大神帮帮忙,最好手写上传一下,键盘敲出来的我也看不懂,感激不尽,急用!

第3行,减去第1、2行,得到x y x+yy x-y x0 0 -2x然后第3列,减去第1、2列,得到x y 0y x-y 00 0 -2x按照第3列展开,得到2阶行列式,因此等于:-2x(x(x-y)-y^2)=-2x(x^2-xy-y^2)
2023-10-02 13:06:271

51单片机。4*4矩阵键盘扫描程序

建议看一下行列式键盘的使用原理
2023-10-02 13:06:362

键盘和显示接口芯片BC7281B与51单片机之间通讯用C语言怎么编写

datasheet上有例程
2023-10-02 13:06:443

4*4键盘输入 凌阳密码锁设计 只要程序! 下面是要求 做好了请发到邮箱 139993@qq.com 注明你的id 我给你分

只要有4*4键盘,再附加个液晶屏,密码程序就是小问题啦!凌阳61a上得OCMJ4X8C液晶驱动程序(串行)4*4键盘凌阳上的我没了,不过有arm的,可以按照这个改改基于arm7 lpc21XX系列的4x4键盘密码的程序,就是先写一个输入界面,检测到确认键后,和内存中的密码做对比,成功进入菜单,否则退出重输,异常简单的程序。现在不搞这个了,要不帮你写个都没问题!
2023-10-02 13:06:501

在任何输入法状态下,按Q A Z这几个字母没有显示。谁知道这是什么原因啊?

那三个按键坏掉了.
2023-10-02 13:06:589

【十万火急】求 程序大牛 用C语言写一个触摸按键的程序,原理图附上,我写的不成功的程序,能改正确最好

#define KEYLOOP 10 /*连续键间隔次数,需小于KEYDELAY*/ unsigned char key_bak; unsigned char key_temp; unsigned char key_old; unsigned char key_data; bit key_ok; unsigned char code Tab_key[]= //行列式键盘映射,这个表主要是为了直观 {0x00, //无键按下 "7","8","9","/", "4","5","6","*", "1","2","3","-", "C","0","="
2023-10-02 13:07:131