简单按键程序

简单按键程序
简单按键程序

/******************************************************

程序功能:用中断方式读取四个独立式按键的键值,同时用

D1~D4四个LED的点亮来指示k1~K4四个按键的按下

----------------------------------------------------

测试说明:按动K1~k4四个按键,观察LED是否正确点亮

*******************************************************/

#include

#include "BoardConfig.h"

#define keyin (P1IN & 0x0f)

uchar KeyVal = 0; // 按键的键值

/********************主函数********************/

void main( void )

{

WDTCTL = WDTPW + WDTHOLD; //关闭看门狗

BoardConfig(0xb0); //打开流水灯,关闭数码管和电平转换

P1IES = 0x0f; // P1.0~P1.3选择下降沿中断

P1IE = 0x0f; // 打开中断使能

P1DIR = BIT7; //设置P1.0~P.3为输入状态,P.7为输出P1OUT = 0;

P2DIR = 0xff;

P2OUT = 0xff;

_EINT(); //打开全局中断控制位

while(1)

{

LPM1;

P2OUT = ~(1 << (KeyVal - 1));

}

}

/*******************************************

函数名称:delay

功能:用于消抖的延时

参数:无

返回值:无

********************************************/

void delay(void)

{

uint tmp;

for(tmp = 12000;tmp > 0;tmp--);

}

/*******************************************

函数名称:PORT1_ISR

功能:P1端口的中断服务函数

参数:无

返回值:无

********************************************/

#pragma vector=PORT1_VECTOR

__interrupt void PORT1_ISR(void)

{

if(P1IFG & 0x0f)

{

switch(P1IFG)

{

case 0x01:

if(keyin == 0x0e) //如果是第一个按键被按下

{

delay();

if(keyin == 0x0e)

{

while(keyin != 0x0f); //等待按键放开

KeyVal = 1;

LPM1_EXIT;

P1IFG = 0;

return;

}

}

case 0x02:

if(keyin == 0x0d) //如果是第二个按键被按下

{

delay();

if(keyin == 0x0d)

{

while(keyin != 0x0f); //等待按键放开

KeyVal = 2;

LPM1_EXIT;

P1IFG = 0;

return;

}

}

case 0x04:

if(keyin == 0x0b) //如果是第三个按键被按下

{

delay();

if(keyin == 0x0b)

{

while(keyin != 0x0f); //等待按键放开

KeyVal = 3;

LPM1_EXIT;

P1IFG = 0;

return;

}

}

case 0x08:

if(keyin == 0x07) //如果是第四个按键被按下

{

delay();

if(keyin == 0x07)

{

while(keyin != 0x0f); //等待按键放开

KeyVal = 4;

LPM1_EXIT;

P1IFG = 0;

return;

}

}

default:

while(keyin != 0x0f); //等待按键放开

P1IFG = 0;

return;

}

}

}

显示和键盘流程图及程序

3.2 部分软件设计 3.2.3显示子程序 动态显示程序框图如图所示。显示程序的要点有两个:一是代码转换。因为直接驱动LED 显示器的是字形码,而人们习惯的是0、1、2、…、F 等字符,因此,必须将待显示的字符转换成字形码。转换用查表的方法进行。二是通过软件实现逐位轮流点亮每个LED 。 为了实现代码转换,首先开辟一个显示缓冲区,将待显示的字符预先存放在缓冲区中。由于有4位LED 显示器,故不妨假设显示缓冲区长度为4个字节。显示缓冲区地址为DIS 0~DIS 3 ,DIS 0单元与最左边一位LED 相对应,DIS 3单元与最右边一位LED 相对应。 程序清单如下: DIS : ORG 0500H MOV A ,#00000011B MOV DPTR ,#7F00H MOVX @DPTR ,A MOV R0,#78H MOV R3,#7FH MOV A ,R3 LD : MOV DPTR ,#7F01H 开 始 结 束 8051初始化 指向下个显示缓冲单元 显示下一位 延时1mS 段选码送入 查段选表 送位选字 动态显示初始化 3位显示完?

有键闭合吗? 确有键闭合吗 闭合键释放吗 返 回 MOVX @DPTR ,A INC DPTR MOV A ,@R0 ADD A ,#0DH MOVC A ,@ DPTR ACALL DLY MOV A ,R3 JNB A ,R0 RR A ,LD1 MOV R3,A INC R0 AJMP LD0 LD1: SJMP LD1 DSEG :DB 3FH ,06H ,5BH ,4FH ,66H ,6DH 7DH ,07H ,7FH ,6FH DLY : MOV R7,#02H DL : MOV R6,#0FFH DL1: DJNZ R6,DL1 DJNZ R7,DL RET 3.2.4键盘子程序 键盘扫描子程序框图如图 图3-4 键盘扫描子程序框图 开 始 两次调用 延时子程序 判断闭合键号 键号 → A 调用延时子程序

超经典CAD lisp程序集锦、CAD快捷键大全

超经典CAD lisp程序集锦 如果您使用 AutoCAD,下面的内容对您一定有帮助。在某些方面能大大提高 您的工作效率。下面的程序均以源程序方式给出,您可以使用、参考、修改它。 bg.lsp --- 表格自动生成 asc.lsp --- 将文本文件内容写入图中,字符是单个的 wf.lsp --- 将图中字符写入磁盘 exstr.lsp --- 将字符串分解成单字 pgtxt.lsp --- 将字符合成字符串 pb.lsp --- 通过给出长度将字符串分成两个串 cht.lsp --- 直接修改文字内容或块属性 ct.lsp --- 对数字串进行加减 chh.lsp --- 直接修改文字高度 chhw.lsp --- 直接修改文字高宽比(针对PKPM软件将字符定位点改为左下角) chst.lsp --- 直接修改文字字体 txt.shx --- 修改后的标准txt.shx文件。(kuozhan.sld为增强的内容幻灯片) tiao.lsp --- 配合修改过的标准字体文件,将中文字符调大 tiao1.lsp --- 配合修改过的标准字体文件,将英文字符调小 untiao.lsp --- 上两个程序的复原 sht.lsp --- 在图中查找字符串 zhuang.lsp --- 桩点及钎探号绘制(勘测图) dim.lsp --- 配合JT.DWG将尺寸标注调成适合建筑结构设计(1:1) dimm.lsp --- 配合JT.DWG将尺寸标注调成适合建筑结构设计(1:100)

di1.lsp~di8.lsp --- 直接连续标注尺寸(用于1:1的图) di100.lsp~di800.lsp --- 直接连续标注尺寸(用于1:100的图) 详细内容及附件下载请浏览北纬服务论坛 https://www.360docs.net/doc/2b13672300.html,/thread-2724-1-1.html

Verilog写的按键消抖程序

前几天看了特权同学用Verilog写的按键消抖程序,感觉很经典。在这里将程序贴出来分享一下。 module lcd_button2(clk,rst,seg,wei,sw1,sw2,sw3,sw4);//按键按下,数码管依次显示0-9 input clk; input rst; input sw1,sw2,sw3,sw4; output [3:0] wei; output[7:0] seg; reg [7:0] seg; reg [3:0] wei; integer num; initial begin num = 0; end reg[3:0] key_rst; always @(posedge clk or negedge rst) if(!rst) key_rst <= 4'b1111; else key_rst <= {sw4,sw3,sw2,sw1}; reg[3:0] key_rst_r; always @(posedge clk or negedge rst) if(!rst) key_rst_r <= 4'b111; else key_rst_r <= key_rst; wire[3:0] key_an = key_rst_r & (~key_rst); reg[19:0] cnt; always @(posedge clk or negedge rst) if(!rst) cnt <= 0; else if(key_an) cnt <= 0; else cnt <= cnt+1'b1; reg [3:0] low_sw; always @(posedge clk or negedge rst)

电梯控制程序源代码(带流程图-功能分解、源代码)

《综合电子创新训练》研究报告研究题目:CTS1600-1控制技术综合试验 院系名称: 专业名称: 学生姓名: 指导教师: xxxx年 xx月 xx日 xxxxxxxxxx

目录 第一章绪论 (1) 1.1课题背景与目的 (1) 1.2课题研究方法 (1) 第二章电梯模型硬件设备 (2) 2.1 实验单片机模型与接口定义 (2) 2.1.1 实验用单片机 (2) 2.1.2 单片机接口定义 (3) 2.1.3 I/O接口DATA控制命令表 (4) 2.2 电梯控制命令说明 (6) 2.3 实验用电梯模型 (8) 第三章与电梯模型相关的实验程序 (10) 3.1数码管连续显示 (10) 3.1.1 程序流程图 (10) 3.1.2 功能简介 (10) 3.1.3 功能实现过程 (11) 3.1.4 问题的解决及收获 (11) 3.2 外部按键灯连续闪烁 (12) 3.2.1 程序流程图 (12) 3.2.2 功能简介 (12) 3.2.3 功能实现过程 (12) 3.2.4 问题的解决及收获 (13) 3.3 键、灯、数码管 (14)

3.3.2 功能简介 (14) 3.3.3 功能实现过程 (14) 3.3.4 问题的解决及收获 (15) 3.4 外部按键上下行 (16) 3.4.1 程序流程图 (16) 3.4.2 功能简介 (16) 3.4.3 功能实现过程 (17) 3.4.4 问题的解决及收获 (18) 3.5 计算器 (19) 3.5.1 程序流程图 (19) 3.5.2 功能简介 (21) 3.5.3 功能实现过程 (21) 3.5.4 问题的解决及收获 (22) 3.6 密码锁 (23) 3.6.1程序流程图 (23) 3.6.2功能简介 (23) 3.6.3实现功能过程 (24) 3.6.4问题的解决及收获 (24) 3.7逐层停自动开关门循环 (25) 3.7.1程序流程图 (25) 3.7.2功能简介 (27) 3.7.3实现功能过程 (27) 3.7.4问题的解决及收获 (27) 3.8 可记录顺序逐层停自动开关门 (28)

矩阵键盘控制12864显示最经典程序

#include //这个程序的功能:用4*4的矩阵键盘(接P3口)按键盘k1——k16中的任何一个键ki #include //12864液晶上显示数字i-1 (液晶数据口接P0) #define uint unsigned int//键盘扫描的思想是将行设置为低,列设置为高,来读取P3口的值,就能知道是哪个按键按下了 #define uchar unsigned char #define LCDdata P0 sbit E = P2^7; sbit RW = P2^6; sbit RS = P2^5; void init(); void delayms(uint x); void displaykey(); void write_com(uchar com);//写命令 void write_data(uchar date);//写数据 uchar temp; //--------------主函数----------------- void main() { init();// P3=0xfe;//P3=0xfd;//P3=0xfb;//P3=0xf7; while(1) { displaykey(); } } //-------------液晶初始化---------------- void init() { write_com(0x01); write_com(0x02); write_com(0x06); write_com(0x0e); } //------------毫秒延时--------------- void delayms(uint x) { uchar i; while(x--) {

按键扫描处理程序流程图代码

4.3.2 按键扫描处理程序流程图 (1)按键扫描处理代码 /* 功能实现参数,参数mode为Key_Menu按键选择的功能模块*/ void Display(unsigned char mode) { switch (mode)//显示模式,0为显示实时温度,1为显示温度上限,2为显示温度下限 { case 0: if (temperature < 0)//温度小于0 { temperature = -temperature;//换为正温度 DisplaySeg(0x40, temperature % 1000); //0x40为负号 } else DisplaySeg(codeSeg[temperature % 10000 / 1000], temperature % 1000); break; case 1: DisplaySeg(0x76, alarm_temp_H * 10); break;//显示温度上限,0x76为H字符 case 2: DisplaySeg(0x38, alarm_temp_L * 10); break;//显示温度下限,0x38为L字符 default:break; } } /* 按键扫描和处理函数*/ void KeyScan(void) { if (Key_Menu == 0)//判断按键是否被按下 { DelayMs(10);//延时10毫秒,去抖动干扰 if (Key_Menu == 0)//再次确认按键是否被按下 { while(Key_Menu == 0)Display(menu);//等待按键释放,器件扫描数码管

menu++;//功能键,功能切换 if (menu == 3)menu = 0;//三个功能切换完 } } if (Key_Add == 0) { DelayMs(10); if (Key_Add == 0) { while(Key_Add == 0)Display(menu); switch (menu) { case 1: if (alarm_temp_H < 50)alarm_temp_H++;break;//加温度上限 case 2: if (alarm_temp_L < 27)alarm_temp_L++;break;//加温度下限 default:break; } } } if (Key_Dec == 0) { DelayMs(10); if (Key_Dec == 0) { while(Key_Dec == 0)Display(menu); switch (menu) { case 1: if (alarm_temp_H > 30)alarm_temp_H--;break;//减温度上限 case 2: if (alarm_temp_L > 7)alarm_temp_L--;break;//减温度下限 default:break; }

简单按键程序

/****************************************************** 程序功能:用中断方式读取四个独立式按键的键值,同时用 D1~D4四个LED的点亮来指示k1~K4四个按键的按下 ---------------------------------------------------- 测试说明:按动K1~k4四个按键,观察LED是否正确点亮 *******************************************************/ #include #include "BoardConfig.h" #define keyin (P1IN & 0x0f) uchar KeyVal = 0; // 按键的键值 /********************主函数********************/ void main( void ) { WDTCTL = WDTPW + WDTHOLD; //关闭看门狗 BoardConfig(0xb0); //打开流水灯,关闭数码管和电平转换 P1IES = 0x0f; // P1.0~P1.3选择下降沿中断 P1IE = 0x0f; // 打开中断使能 P1DIR = BIT7; //设置P1.0~P.3为输入状态,P.7为输出P1OUT = 0; P2DIR = 0xff; P2OUT = 0xff; _EINT(); //打开全局中断控制位 while(1) { LPM1; P2OUT = ~(1 << (KeyVal - 1)); } } /******************************************* 函数名称:delay 功能:用于消抖的延时 参数:无 返回值:无 ********************************************/ void delay(void) { uint tmp; for(tmp = 12000;tmp > 0;tmp--); }

长短按键程序及其运用

本文讲的是同一按键长短按实现不同功能的程序。 延时10ms子程序: void delay10ms(void) { unsigned char i,j,k; for(i=1;i>0;i--) for(j=38;j>0;j--) for(k=130;k>0;k--); } 长短按键子程序: void anjian(void) { uint j,h; chang=0; duan=0; if(T_F==0&&m==0) //T_F键按下去的时候,标志位m用于防止长短按键T_F二次判定{ for(j=0;j<3000;j++); //防抖 if(T_F==0) { h=0; //计时初始值 m=1; while(T_F==0) //看按了多久 { delay10ms(); //调用延时10ms子程序 h++; //每过10ms加1 if(h>=200) break; //当按键时间过长(约2s),则自动跳出 } if(h>=200)chang=1; //表示为长按(约2s) else duan=1; //表示为短按 } } else if(T_F==1) //按键T_F弹起进行下一次长短按判定 { m=0; } } 有了此长短按键子程序就能在主函数中进行调用,并通过设定长按功能与短按功能,实现同一按键长短按具有不同功能。

简例: #include sbit T_F=P1^5; //定义按键T_F bit chang,duan,m; void delay10ms(void); void anjian(void); void main() { m=0; //标志位m 用于防止长短按键T_F二次判定 while(1) { anjian(); //T_F按键判断 if(chang==1) { 长按T_F所实现功能程序,自己写 } else if(duan==1) { 短按T_F所实现功能程序,自己写 } } } void delay10ms(void) { unsigned char i,j,k; for(i=1;i>0;i--) for(j=38;j>0;j--) for(k=130;k>0;k--); } void anjian(void) { uint j,h; chang=0; duan=0; if(T_F==0&&m==0) //T_F键按下去的时候,标志位m用于防止长短按键T_F二次判定{ for(j=0;j<3000;j++); //防抖 if(T_F==0) {

经典的矩阵键盘扫描程序

键盘是单片机常用输入设备,在按键数量较多时,为了节省I/O口等单片机资源,一般采取扫描的方式来识别到底是哪一个键被按下。即通过确定被按下的键处在哪一行哪一列来确定该键的位置,获取键值以启动相应的功能程序。 4*4矩阵键盘的结构如图1(实物参考见万用板矩阵键盘制作技巧)。在本例中,矩阵键盘的四列依次接到单片机的P1.0~P1.3,四行依次接到单片机的P1.4~P1.7;同时,将列线上拉,通过10K电阻接电源。 查找哪个按键被按下的方法为:一个一个地查找。 先第一行输出0,检查列线是否非全高; 否则第二行输出0,检查列线是否非全高; 否则第三行输出0,检查列线是否非全高; 如果某行输出0时,查到列线非全高,则该行有按键按下; 根据第几行线输出0与第几列线读入为0,即可判断在具体什么位置的按键按下。 下面是具体程序:

void Check_Key(void) { unsigned char row,col,tmp1,tmp2; tmp1 = 0x10; //tmp1用来设置P1口的输出,取反后使 P1.4~P1.7中有一个为0 for(row=0;row<4;row++) // 行检测 { P1 = 0x0f; // 先将p1.4~P1.7置高 P1 =~tmp1; // 使P1.4~p1.7中有一个为0 tmp1*=2; // tmp1左移一位 if ((P1 & 0x0f) < 0x0f) // 检测P1.0~P1.3中是否有一位为0,只要有,则说明此行有键按下,进入列检测 { tmp2 = 0x01; // tmp2用于检测出哪一列为0 for(col =0;col<4;col++) // 列检测 { if((P1 & tmp2)==0x00) // 该列如果为低电平则可以判定为该列 { key_val =key_Map[ row*4 +col ]; // 获取键值,识别按键;key_Map为按键的定义表 return; // 退出循环 } tmp2*=2; // tmp2左移一位 } } } } //结束 这是一种比较经典的矩阵键盘识别方法,实现起来较为简单,程序短小精炼。

(完整版)Revit实用快捷键大全(绝对经典)

Revit实用快捷键大全(绝对经典) 分享自:云台网 设置快捷键时注意: 1。设置规则说明:以[ "WA" menu:"建模-墙" ]为例,"WA" 为快捷命令,"建模-墙" 为下拉彩单“建模”中的“墙”命令。注意:在引号中设置完快捷命令后,要将行首的分号; 删除掉,快捷命令才能生效。 2。目前revit的快捷命令为两个字符,例如墙的快捷命令为WA,如果设置了一个字符如W,则在软件中必须连续单击“W+空格键”,才能激活命令。 3。编辑完KeyboardShortcuts.txt 文件并保存后,需要重新启动Revit 方才生效。此时在下拉菜单中的命令后面会出现设置好的快捷命令。 ————编辑menu———— "DE" menu:"编辑-删除" "MD" menu:"编辑-修改" ; "" menu:"编辑-上次选择" "SA" menu:"编辑-选择全部实例" "MV" menu:"编辑-移动" "CO" menu:"编辑-复制" ; "CC" menu:"编辑-复制" "RO" menu:"编辑-旋转" "AR" menu:"编辑-阵列" "MM" menu:"编辑-镜像" "RE" menu:"编辑-调整大小" "GP" menu:"编辑-成组-创建组" "EG" menu:"编辑-成组-编辑" "UG" menu:"编辑-成组-解组" "LG" menu:"编辑-成组-链接组" "EX" menu:"编辑-成组-排除构件" "MP" menu:"编辑-成组-将构件移到项目" "RB" menu:"编辑-成组-恢复已排除构件"

"RA" menu:"编辑-成组-全部恢复" "AP" menu:"编辑-成组-添加到组" "RG" menu:"编辑-成组-从组中删除" "AD" menu:"编辑-成组-附着详图" "PG" menu:"编辑-成组-组属性" "FG" menu:"编辑-成组-完成组" "CG" menu:"编辑-成组-取消组" "PP" menu:"编辑-锁定位置" "UP" menu:"编辑-解锁位置" "CS" menu:"编辑-创建类似实例" "PR" menu:"编辑-属性" ————绘图menu———— "DI" menu:"绘图-尺寸标注" "EL" menu:"绘图-高程点标注-高程点" ; "" menu:"绘图-高程点标注-高程点坐标" "TX" menu:"绘图-文字" "GR" menu:"绘图-网格" "LL" menu:"绘图-标高" "TG" menu:"绘图-标记-按类别" "RM" menu:"绘图-房间" "RT" menu:"绘图-房间标记" "DL" menu:"绘图-详图线" ————工具menu———— F7 menu:"工具-拼写检查" "MA" menu:"工具-匹配" "LW" menu:"工具-线处理" "PT" menu:"工具-填色"

89c51一键多功能按键识别技术

9.一键多功能按键识别技术 1.实验任务 如图4.9.1所示,开关SP1接在P3.7/RD管脚上,在AT89S51单片机的P1端口接有四个发光二极管,上电的时候,L1接在P1.0管脚上的发光二极管在闪烁,当每一次按下开关SP1的时候,L2接在P1.1管脚上的发光二极管在闪烁,再按下开关SP1的时候,L3接在P1.2管脚上的发光二极管在闪烁,再按下开关SP1的时候,L4接在P1.3管脚上的发光二极管在闪烁,再按下开关SP1的时候,又轮到L1在闪烁了,如此轮流下去。 2.电路原理图 图4.9.1 3.系统板上硬件连线 (1.把“单片机系统”区域中的P3.7/RD端口连接到“独立式键盘”区域中的SP1端口上; (2.把“单片机系统”区域中的P1.0-P1.4端口用8芯排线连接到“八路发光二极管指示模块”区域中的“L1-L8”端口上;要求,P1.0连接到L1, P1.1连接到L2,P1.2连接到L3,P1.3连接到L4上。

4.程序设计方法 (1.设计思想由来 在我们生活中,我们很容易通过这个叫张三,那个叫李四,另外一个是王五;那是因为每个人有不同的名子,我们就很快认出,同样,对于要通过一个按键来识别每种不同的功能,我们给每个不同的功能模块用不同的ID号标识,这样,每按下一次按键,ID的值是不相同的,所以单片机就很容易识别不同功能的身份了。 (2.设计方法 从上面的要求我们可以看出,L1到L4发光二极管在每个时刻的闪烁的时间是受开关SP1来控制,我们给L1到L4闪烁的时段定义出不同的ID号,当L1在闪烁时,ID =0;当L2在闪烁时,ID=1;当L3在闪烁时,ID=2;当L4在闪烁时,ID=3;很显然,只要每次按下开关K1时,分别给出不同的ID号我们就能够完成上面的任务了。 下面给出有关程序设计的框图。 5.程序框图 图4.9.2

显示和键盘流程图及程序

3.2 部分软件设计 3.2.3显示子程序 动态显示程序框图如图所示。显示程序的要点有两个:一是代码转换。因为直接驱动LED显示器的是字形码,而人们习惯的是0、1、2、…、F等字符,因此,必须将待显示的字符转换成字形码。转换用查表的方法进行。二是通过软件实现逐位轮流点亮每个LED。 为了实现代码转换,首先开辟一个显示缓冲区,将待显示的字符预先存放在缓冲区中。由于有4位LED显示器,故不妨假设显示缓冲区长度为4个字节。显 示缓冲区地址为DIS 0~DIS 3 ,DIS 单元与最左边一位LED相对应,DIS 3 单元与最 右边一位LED相对应。 程序清单如下: DIS: ORG 0500H MOV A,#00000011B MOV DPTR,#7F00H MOVX @DPTR,A MOV R0,#78H MOV R3,#7FH MOV A,R3 LD: MOV DPTR,#7F01H

MOVX @DPTR,A INC DPTR MOV A,@R0 ADD A,#0DH MOVC A,@ DPTR ACALL DLY MOV A ,R3 JNB A,R0 RR A,LD1 MOV R3,A INC R0 AJMP LD0 LD1: SJMP LD1 DSEG:DB 3FH,06H,5BH,4FH,66H,6DH 7DH,07H,7FH,6FH DLY: MOV R7,#02H DL: MOV R6,#0FFH DL1: DJNZ R6,DL1 DJNZ R7,DL RET 3.2.4键盘子程序 键盘扫描子程序框图如图 图3-4 键盘扫描子程序框图

键盘扫描子程序如下: KEY: ORG 0440H ; ACALL KS ;调用KS判别是否有键按下 JNZ K1 ;有键按下转移 ACALL DIR ;无键按下,调延时子程序AJMP KEY ; K1: ACALL DIR ;加长延时时间,消除键抖动ACALL DIR ; ACALL KS ;调用KS子程序,再次判别 有无键按下 JNZ K2 ;有键按下,转逐列扫描 AJMP KEY ;误读键,返回 K2: MOV R2,#0FEH ;首列扫描字送R2 MOV R4,#00H ;首列号送R4 K3: MOV DPTR,#PA ;A口地址送DRTR MOV A,R2 ; MOVX @DPTR,A ;列扫描字送8155A口 INC DPTR ;指向8155C口 INC DPTR ; MOVX A,@ DPTR ;读取行扫描值 JB ACC.0,L1 ;第0行无键按下,转查第1行 MOV A,#00H ;第0行有键按下,该行的行首键号#00H 送 A AJMP LK ;转求键号 L1: JB ACC .1,L2 ;第1行无键按下,转查第2行MOV A,#08H ;第1行无键按下,该行的行首键号 #08H送A AJMP LK ;转求键号 L2: JB ACC .2,L3 ;第2行无键按下,转查第3行MOV A,#10H ;第2行有键按下,该行的行首键号#10H 送 A AJMP LK ;转查键号 L3: JB ACC.3,NEXT ;第3行无键按下,转查下一列MOV A,#18H ;第3行有键按下,该行的行首键号#18H 送 A LK: ADD A,R4 ;形成键释放 PUSH ACC ;未释放,等待 K4: ACALL DIR ;键释放,弹出堆栈送ACC ACALL KS ;键扫描结束,返回 JNZ K4 ;修改列号

经典的矩阵键盘扫描程序

经典的矩阵键盘扫描程序 查找哪个按键被按下的方法为:一个一个地查找。 先第一行输出0,检查列线是否非全高; 否则第二行输出0,检查列线是否非全高; 否则第三行输出0,检查列线是否非全高; 如果某行输出0时,查到列线非全高,则该行有按键按下; 根据第几行线输出0与第几列线读入为0,即可判断在具体什么位置的按键按下。 下面是具体程序: void Check_Key(void) { unsigned char row,col,tmp1,tmp2; tmp1 = 0x10; //tmp1用来设置P1口的输出,取反后使 P1.4~P1.7中有一个为0 for(row=0;row<4;row++) // 行检测 { P1 = 0x0f; // 先将p1.4~P1.7置高 P1 =~tmp1; // 使P1.4~p1.7中有一个为0 tmp1*=2; // tmp1左移一位 if ((P1 & 0x0f) < 0x0f) // 检测P1.0~P1.3中是否有一位为0,只要有,则说明此行有键按下,进入列检测 { tmp2 = 0x01; // tmp2用于检测出哪一列为0 for(col =0;col<4;col++) // 列检测

{ if((P1 & tmp2)==0x00) // 该列如果为低电平则可以判定为该列 { key_val =key_Map[ row*4 +col ]; // 获取键值,识别按键;key_Map为按键的定义表 return; // 退出循环 } tmp2*=2; // tmp2左移一位 } } } } //结束 这是一种比较经典的矩阵键盘识别方法,实现起来较为简单,程序短小精炼。 4*4矩阵键盘扫描程序 /* 设置行线为输入线,列线为输出线 */ uchar KeyScan(); //按键扫描子程序 void delay10ms(); //延时程序 uchar key_free(); //等待按键释放程序 void key_deal(); //键处理程序 //主程序 void main() { while(1) { KeyScan(); key_free(); key_deal(); } } //按键扫描子程序 uchar KyeScan() { unsigned char key,temp; P1=0xF0; if(P1&0xF0!=0xF0) { delay10ms(); //延时去抖动 if(P1&0xF0!=0xF0) { P1=0xFE; //扫描第一列

六十个经典的电脑操作技巧

六十个经典的电脑操作技巧! 1.如果同时有多个窗口打开,想要关闭的话,可以按住shift 不放然后点击窗口右上角的关闭图标. 2.在保存网页前,可以按一下"ESC"键(或脱机工作)再保存,这样保存很快 3.用电脑听CD可以不用任何的播放软件,把音箱线直接接到光驱的耳机孔,放入CD,按光驱上的play键就可以直接听了,这样听歌可以不占用系统资源。(如果你的电脑坏了,不能启动或什么的,一时放在那不能修,千万不要浪费资源,把用里面的电源给光驱通上电,就可以暂时做CD机了. 4.MSN中发消息的时候是按enter的,如果想要换行而不想发出消息,可以shift+enter或ctrl+enter 5.浏览器的地址栏里可以调试简短的HTML代码。方发如下:地址栏写about :abc 回车,就看到效果了. 6.Windows快捷键: win+m 显示桌面 win+pause 系统属性 快速重新启动:按确定前先按shift(不适用于2k、xp). 彻底删除:shift+del 不让光盘自动运行:按shift Ctrl+Esc:相当于"开始"或WIN键

Ctrl+Home:将游标移至文字编辑区的开始始(Home单用:移至列首) Ctrl+End:将光标移至文字编辑区的终点(End单用:移至列尾) Alt+F4:关闭当前视窗(若是点一下桌面再按则为关机) F2:更改名称 windows+e 资源管理器. windows+r 运行. windows+f 查找. windows+u 关闭系统. windows+d最小化所有窗口,再按一次Win+D可回到最小化前的窗口. windows+m最小化所有窗口,但再按一次无发回到最小化前的窗口. Shift+F10,可以打开所选项目的右键菜单. 按住CTRL+SHIFT 拖动文件:创建快捷方式. 7.关机快捷方式 (1). 在桌面空白位臵按鼠标右键-> <新建> -> 选<快捷方式> (2). 在<指令行>键入rundll.exe user.exe,exitwindows (3). 在<选择快捷方式的名称>键入<关闭Window>或你想要的名称-> 按<完成> 8.重新启动快捷方式

一键多功能按键识别技术

1.实验任务 如图4.9.1所示,开关SP1接在P3.7/RD管脚上,在AT89S51单片机的P1端口接有四个发光二极管,上电的时候,L1接在P1.0管脚上的发光二极管在闪烁,当每一次按下开关SP1的时候,L2接在P1.1管脚上的发光二极管在闪烁,再按下开关SP1的时候,L3接在P1.2管脚上的发光二极管在闪烁,再按下开关SP1的时候,L4接在P1.3管脚上的发光二极管在闪烁,再按下开关SP1的时候,又轮到L1在闪烁了,如此轮流下去。 2.电路原理图 图4.9.1 3.系统板上硬件连线 (1.把“单片机系统”区域中的P3.7/RD端口连接到“独立式键 盘”区域中的SP1端口上; (2.把“单片机系统”区域中的P1.0-P1.4端口用8芯排线连 接到“八路发光二极管指示模块”区域中的“L1-L8”端口上; 要求,P1.0连接到L1,P1.1连接到L2,P1.2连接到L3, P1.3连接到L4上。 4.程序设计方法

(1.设计思想由来 在我们生活中,我们很容易通过这个叫张三,那个叫李四,另外一个是王五;那是因为每个人有不同的名子,我们就很快认出,同样,对于要通过一个按键来识别每种不同的功能,我们给每个不同的功能模块用不同的ID号标识,这样,每按下一次按键,ID的值是不相同的,所以单片机就很容易识别不同功能的身份了。 (2.设计方法 从上面的要求我们可以看出,L1到L4发光二极管在每个时刻的闪烁的时间是受开关SP1来控制,我们给L1到L4闪烁的时段定义出不同的ID号,当L1在闪烁时,ID=0;当L2在闪烁时,ID=1;当L3在闪烁时,ID=2;当L4在闪烁时,ID=3;很显然,只要每次按下开关K1时,分别给出不同的ID号我们就能够完成上面的任务了。下面给出有关程序设计的框图。 5.程序框图

单片机一键多功能控制(八个灯)c语言程序

#include #define k1 P3_2 #define d1 P1_0 #define d2 P1_1 #define d3 P1_2 #define d4 P1_3 #define d5 P1_4 #define d6 P1_5 #define d7 P1_6 #define d8 P1_7 void delay(unsigned int); void main(void) { unsigned char count; count=0; k1=1; d1=1; d2=1; d3=1; d4=1; d5=1; d6=1; d7=1; d8=1; while(1) { if(k1==0) { delay(20); if(k1==0) { count=count+1; if(count==9) { count=0; } switch(count) { case 0: d1=1;d2=1;d3=1;d4=1;d5=1;d6=1;d7=1;d8=1; break; case 1: d1=0; break;

case 2: d2=0; break; case 3: d3=0; break; case 4: d4=0; break; case 5: d5=0; break; case 6: d6=0; break; case 7: d7=0; break; case 8: d8=0; break; } do { do { ; }while(k1==0); delay(20); }while(k1==0); } } } } void delay(unsigned int n) { unsigned int x,y; for(x=0;x

C语言按键程序

C语言按键程序 // 源程序大公开 // // (c) Copyright 2001-2005 xuwenjun // // All Rights Reserved // // V1.00 // //--------------------------------------------------------------------------// //标题: P1口行列式键盘程序 ? // //文件名: xwj_hlkey.c // //版本: V1.00 // //修改人: 徐文军 E-mail:xuwenjun@https://www.360docs.net/doc/2b13672300.html, // //日期: 05-05-13 // //描述: P1口行列式键盘程序 ? // //声明: // // 以下代码仅免费提供给学习用途,但引用或修改后必须在文件中声明出处. // // 如用于商业用途请与作者联系. E-mail:xuwenjun@https://www.360docs.net/doc/2b13672300.html, // // 有问题请mailto xuwenjun@https://www.360docs.net/doc/2b13672300.html, 欢迎与我交流! // //--------------------------------------------------------------------------// //老版本: 无老版本文件名: // //创建人: 徐文军 E-mail:xuwenjun@https://www.360docs.net/doc/2b13672300.html, // //日期: 05-05-13 // //描述: // // CODE SIZE = 396 ---- // // CONST ANT SIZE = 32 ---- // // DAT A SIZE = 4 1 // // BIT SIZE = 1 ---- // //--------------------------------------------------------------------------// #include #include "xwj_hlkey.h" // P1口行列式键盘 // //#include "xwj_bp.h" //峰鸣器 #define KEYDELAY 25 /*首键延迟次数*/

单片机设计程序流程图

设计题1: 按下SW1电机全速运行,电机输出端P2.6输出高峰 按下SW2电机半速运行,电机输出端P2.6输出低峰 设计题2;四路抢答器 说明:按下复位键后没有显示,开始抢答,根据P3口的输入值,显示对应的数字

设计题3:双路报警器 说明:正常时SW1为断开状态,SW2为闭合状态。当小偷翻窗入室,会导致SW1闭合或SW2断开时,同时启动声光报警:直流蜂鸣器(BUZZER)通电发声,LED1与LED2交替闪亮,交替时间为0.5秒 设计题4:三人表决器 说明:程序检测按键,三个按键中如果有一个主裁判和任意一个副裁判按下说明有效

设计题5: 设计题:5:单双八拍 说明:A→AB →B →BC→C →CD→D →DA

设计题6:小便池自动抽水 说明:当人靠近小便池时,出水2秒,人离开后,出水5秒(请考虑时间的精度问题)。本题仅要求用一只普通开关SW1来代替人体红外感应开关,有人靠近时SW1接通,人离开时,SW1断开。 设计题7:小便池自动抽水 说明:通过三档旋转开关设定高、中、低三档水位,水位设定好后单片机能按设定水位控制电磁阀注水,达到设定水位后停止注水。

设计题8:自动计数 说明:当自动检测开关SW1检测到有工件通过时,马上闭合,然后断开,利用这一特点实现自动流水线货物(SW1接通次数)计数(00--99)。 设计题9:水塔水位 说明:当水位低于B时,开启水泵电机进行抽水,水池水位慢慢升高,达到预设水位C时,水泵电机停止;放水时,水池水位低于B时,水泵电机又开始启动并抽水(排除机械故障),如此循环。当系统处于进水状态时,要求指示灯D1点亮。

按键处理的几种方法

新型的按键扫描程序 核心算法: unsigned char Trg; unsigned char Release; unsigned char Cont; void KeyRead( void ) { unsigned char ReadData = PINB^0xff; // 1 读键值 Trg = ReadData & (ReadData ^ Cont); // 2 得到按下触发值 Release=(ReadData^Trg^Cont); //3 得到释放触发值 Cont = ReadData; //4 得到所有未释放的键值 } 下面是程序解释: Trg(triger)代表的是触发,Cont(continue)代表的是连续按下。 1:读PORTB的端口数据,取反,然后送到ReadData 临时变量里面保存起来。 2:算法1,用来计算触发变量的。一个位与操作,一个异或操作,我想学过C语言都应该懂吧?Trg为全局变量,其它程序可以直接引用。 3:算法2,用来计算连续变量。 我们最常用的按键接法如下:A VR是有内部上拉功能的,但是为了说明问题,我是特意用外部上拉电阻。那么,按键没有按下的时候,读端口数据为1,如果按键按下,那么端口读到0。下面就看看具体几种情况之下,这算法是怎么一回事。 (1)没有按键的时候 端口为0xff,ReadData读端口并且取反,很显然,就是0x00 了。 Trg = ReadData & (ReadData ^ Cont); (初始状态下,Cont也是为0的)很简单的数学计算,因为ReadData为0,则它和任何数“相与”,结果也是为0的。 Cont = ReadData; 保存Cont 其实就是等于ReadData,为0;

经典按键扫描程序

以下假设你懂C语言,因为纯粹的C语言描述,所以和处理器平台无关,你可以在MCS-51,AVR,PIC,甚至是ARM平台上面测试这个程序性能。以下以AVR的MEGA8作为平台讲解,没有其它原因,因为我手头上只有AVR的板子而已没有51的。用51也可以,只是芯片初始化部分不同,还有寄存器名字不同而已。 核心算法: unsigned char Trg; unsigned char Cont; void KeyRead( void ) { unsigned char ReadData = PINB^0xff; // 1 Trg = ReadData & (ReadData ^ Cont); // 2 Cont = ReadData; // 3 } 下面是程序解释:Trg(triger)代表的是触发,Cont(continue)代表的是连续按下。 1:读PORTB的端口数据,取反,然后送到ReadData 临时变量里面保存起来。(端口值与0XFF 按位异或,有按键按下为0,异或后相应的位就为1,相当于将读取的端口值取反) 2:算法1,用来计算触发变量的。一个位与操作,一个异或操作,我想学过C语言都应该懂吧?Trg为全局变量,其它程序可以直接引用。 3:算法2,用来计算连续变量。 看到这里,有种“知其然,不知其所以然”的感觉吧?代码很简单,但是它到底是怎么样实现我们的目的的呢?好,下面就让我们绕开云雾看青天吧。 我们最常用的按键接法如下:AVR是有内部上拉功能的,但是为了说明问题,我是特意用外部上拉电阻。(STM32可以将端口设置为输入上拉模式)那么,按键没有按下的时候,读端口数据为1,如果按键按下,那么端口读到0。下面就看看具体几种情况之下,这算法是怎么一回事。 (1)没有按键的时候 端口为0xff,ReadData读端口并且取反,很显然,就是 0x00 了。(0XFF^0XFF=0X00)Trg = ReadData & (ReadData ^ Cont); (初始状态下,Cont也是为0的)很简单的数学计算,因为ReadData为0,则它和任何数“相与”,结果也是为0的。 Cont = ReadData; 保存Cont 其实就是等于ReadData,为0; 结果就是: ReadData = 0; Trg = 0; Cont = 0; (2)第一次PB0按下的情况 端口数据为0xfe,ReadData读端口并且取反,很显然,就是 0x01 了。(0XFE^0XFF=0X01)Trg = ReadData & (ReadData ^ Cont); 因为这是第一次按下,所以Cont是上次的值,应为为0。那么这个式子的值也不难算,也就是 Trg = 0x01 & (0x01^0x00) = 0x01 Cont = ReadData = 0x01; 结果就是: ReadData = 0x01; Trg = 0x01;Trg只会在这个时候对应位的值为1,其它时候都为0 Cont = 0x01;

相关文档
最新文档