独立按键程序
独立式键盘的接口设计与编程
—1—
独立式键盘相互独立,每个按键占用一根I/O口线,每根
I/O口线上的按键工作状态不会影响其他按键的工作状态,CPU可 直接读取该I/O线的高/低电平状态。这种按键硬件、软件结构简 单,判键速度快,使用方便,但占用I/O口线较多,适用于按键 数量较少的系统中。
独立连接式键盘连接图如图
—8—
【例9-2】 中断方式下的键盘扫描程序
ORG LJMP ORG 址 LJMP ORG MAIN: MOV SETB SETB SETB
0000H MAIN 0003H
INT0 0100H
P1,#0FFH EA EX0 IT0
—9—
;外部中断0中断服务入口地
;转中断服务
;P1口做输入时,先送1 ;开总中断允许 ;开INT0中断 ;下降沿有效
—3—
对于时钟是微秒级的单片机而言,键盘的抖动有可能造成单片机对一次 按键的多次处理。为了提高系统的稳定性,我们必须采用有效的方式消除抖 动。
去除抖动可以采用硬件方式和软件方式。硬件方式一般是在按键与单片 机的输入通道上安装硬件去抖电路(如RS触发器)。软件方式的实现方法是: 当查询到电路中有按键按下时,先不进行处理,而是先执行10~20ms的延 时程序,延时程序结束后,再次查询按键状态,若此时按键仍为按下状态, 则视为按键被按下。
…
;主程序其余部分
;<--------------------------中断服务程序------------------------->
INT0:
LCALL
DL_20MS
;延时去抖动
MOV
A,P1
;读P1口各引脚
CJNE
A,#0FFH,CLOSE
独立式键盘程序
51单片机:键盘控制程序2009-11-14 16:12键盘控制1.功能说明:用八位指拨开关(DIP)作单片机的输入,控制输出端口连接的八只LED发光二极管。
如若DIP1开关为 ON(向右拨动)则LED1亮,其它开关作用同。
程序:LOOP: MOV A, P3 ; 从P3读入DIP开关值MOV P1, A ; 从P1输出03: JMP LOOP ; 无穷循环04: END ;程序结束2.功能说明:用DIP开关中的低4位作二进制的输入,控制输出端数码管显示器的输出。
程序:01: MOV DPTR,#TABLE ; 存表02: MOV P0, #0FFH ; LED全灭03: LOOP: MOV A, P3 ; 从P3口读入DIP开关值04: ANL A, #0FH ; 高4位清0,取低四位05: ACALL CHANG ; 转成七段显示码06: MOV P0, A ; 从P0输出07: JMP LOOP ; 转移LOOP处,循环08: CHANG: MOVC A,@A+DPTR ; 取码09: RET ; 返回转换显示码子程序10: TABLE: DB 0C0H, 0F9H, 0A4H, 0B0H ;11: DB 99H, 92H, 82H, 0F8H ;12: DB 80H, 90H, 88H, 83H ;13: DB 0C6H, 0A1H, 86H, 8EH ; 显示码表14: END ;程序结束3.功能说明:用两个按键开关K1和K2作输入,K1为电源指示灯开关,K2为工作指示灯开关。
分别控制电源指示灯(P1.0接的LED)和工作指示灯(P1.7接的LED)的接通和关闭。
接通电源时,电源指示灯是在亮的状态。
当按K2时,工作指示灯亮,电源指示灯灭。
按K1时,电源指示灯亮,工作指示灯灭。
程序:01: START: MOV P1, #11111110B ; P1.0所接LED亮02: JB P2.5 , $ ; 判断P2.5(K2键)是否为103: ON: MOV P1, #01111111B ; P1.7所接LED亮04: JNB P2.4, START ; 判断P2.4(K1键)是是否为005: JMP ON ; 未按K1键,则跳至ON06: END ;程序结束4.功能说明:由四个按键开关组成独立式键盘,控制灯左移、右移和闪烁。
单片机独立按键控制led灯实验原理
主题:单片机独立按键控制LED灯实验原理目录1. 概述2. 单片机独立按键控制LED灯实验原理3. 实验步骤4. 结语1. 概述单片机在现代电子设备中起着至关重要的作用,它可以通过编程实现各种功能。
其中,控制LED灯是单片机实验中常见的任务之一。
本文将介绍单片机独立按键控制LED灯的实验原理及实验步骤,希望对初学者有所帮助。
2. 单片机独立按键控制LED灯实验原理单片机独立按键控制LED灯的实验原理主要涉及到单片机的输入输出端口及按键和LED的连接方式。
在单片机实验中,按键与单片机的输入端口相连,LED与单片机的输出端口相连。
通过按键的按下和松开来改变单片机输出端口电平,从而控制LED的亮灭。
3. 实验步骤为了完成单片机独立按键控制LED灯的实验,需要按照以下步骤进行操作:步骤一:准备材料- 单片机板- 按键- LED灯- 连线- 电源步骤二:搭建电路- 将按键与单片机的输入端口相连- 将LED与单片机的输出端口相连- 连接电源步骤三:编写程序- 使用相应的单片机开发软件编写程序- 程序中需要包括按键状态检测和LED控制的部分步骤四:烧录程序- 将编写好的程序烧录到单片机中步骤五:运行实验- 按下按键,观察LED的亮灭情况- 确保按键可以正确控制LED的亮灭4. 结语通过上述实验步骤,我们可以实现单片机独立按键控制LED灯的功能。
这个实验不仅可以帮助学习者了解单片机的输入输出端口控制,还可以培养动手能力和程序设计能力。
希望本文对单片机实验初学者有所帮助,谢谢阅读!实验步骤在进行单片机独立按键控制LED灯实验时,需要按照一定的步骤进行操作,以确保实验能够顺利进行并取得预期的效果。
下面将详细介绍实验步骤,帮助读者更好地理解和掌握这一实验过程。
1. 准备材料在进行单片机独立按键控制LED灯实验前,首先需要准备相应的材料。
这些材料包括单片机板、按键、LED灯、连线和电源。
在选择单片机板时,需要根据具体的实验需求来确定,常见的有51单片机、Arduino等,不同的单片机板具有不同的特性和使用方法,因此需要根据实验要求来选择适合的单片机板。
GD32E230开发标准教程【ch05】GPIO与独立按键输入 PPT课件
谢谢观看
GD32E230开发标准教程
实验原理
KEY;按键的电路与另外两个按键的不同之处是,连接 KEY1网络的PA0 引脚除了可以用作GPIO,还可以通过配置备用功能来实现芯片的唤醒。 在本实验中,PA0用作GPIO,且被配置为下拉输入模式。因此,KEY1按 键弹起时,PA0引脚为低电平,KEY1按键按下时,PA0引脚为高电平。
实验原理
实验原理
端口输入状态寄存器(GPIOx ISTAT)用于读取一组GPIO端口的16个引脚的输入电平状态,因此只 用了低16位。该寄存器为只读,其结构、偏移地址和复位值,以及部分位的解释说明如图5-3和表5-1 所示。GPIOx ISTAT也常常简称为ISTAT。
实验原理
实验原理
GPIO部分固件库函数 第4章已经介绍了GPIO部分固件库函数,包括gpio_mode set、 gpio_output_options_set、 gpio bit write和 gpio_output bit_get, 本实验还涉及gpio_input bit get函数,该函数同样在 gd32e230 gpio.h 文件中声明,在gd32e230 gpio.c文件中实现。
步骤8:编译及下载验证。
04本章任务ຫໍສະໝຸດ 本章任务基于GD32E2杏仁派开发板,编写程序实现通过按键切换LED编码计数方 向。假设LED熄灭为0,点亮为1,初始状态为LED1和LED2均熄灭(00 ),第二状态为LED1熄灭、LED2点亮(01),第三状态为LED1点亮、 LED2熄灭(10),第四状态为LED1和LED2均点亮(11)。按下KEY1 按键,按照“初始状态→第二状态→第三状态→第四状态→初始状态” 方向进行递增编码计数;按下KEY3按键,按照“初始状态→第四状态→ 第三状态→第二状态→初始状态”方向进行递减编码计数。无论是递增 编码计数,还是递减编码计数,两个相邻状态的间隔均为1s。
状态转移的独立按键程序
基于状态转移的独立按键程序设计本章所描述的按键程序要达到的目的:检测按键按下,短按,长按,释放。
即通过按键的返回值我们可以获取到如下的信息:按键按下(短按),按键长按,按键连发,按键释放。
不知道大家还记得小时候玩过的电子钟没有,就是外形类似于CALL 机(CALL )的那种,有一个小液晶屏,还有四个按键,功能是时钟,闹钟以及秒表。
在调整时间的时候,短按+键每次调整值加一,长按的时候调整值连续增加。
譬如,用一个智能充电器给你的手机电池充电,刚开始,它是处于快速充电状态,随着电量的增加,电压的升高,当达到规定的电压时候,它会转换到恒压充电。
总而言之,细心观察,你会发现生活中的总总都可以归结为一个个的状态,而状态的变换或者转移总是由某些条件引起同时伴随着一些动作的发生。
我们的按键亦遵循同样的规律,下面让我们来简单的描绘一下它的状态流程转移图。
下面对上面的流程图进行简要的分析。
首先按键程序进入初始状态S1,在这个状态下,检测按键是否按下,如果有按下,则进入按键消抖状态2,在下一次执行按键程序时候,直接由按键消抖状态进入按键按下状态3,在此状态下检测按键是否按下,如果没有按键按下,则返回初始状态S1,如果有则可以返回键值,同时进入长按状态S4,在长按状态下每次进入按键程序时候对按键时间计数,当计数值超过设定阈值时候,则表明长按事件发生,同时进入按键连发状态S5。
如果按键键值为空键,则返回按键释放状态S6,否则继续停留在本状态。
在按键连发状态下,如果按键键值为空键则返回按键释放状态S6,如果按键时间计数超过连发阈值,则返回连发按键值,清零时间计数后继续停留在本状态。
看了这么多,也许你已经有一个模糊的概念了,下面让我们趁热打铁,一起来动手编写按键驱动程序吧。
下面是我使用的硬件的连接图。
硬件连接很简单,四个独立按键分别接在P3^0------P3^3四个I/O上面。
因为51单片机I/O口内部结构的限制,在读取外部引脚状态的时候,需要向端口写1.在51单片机复位后,不需要进行此操作也可以进行读取外部引脚的操作。
单片机竞赛程序1
1. LED程序:#include "reg52.h"void delay(void);void main(){ unsigned char i;while(1){for(i=0;i<8;i++){ P0 = ~(1<<i);P2 |= 0xE0;P2 &= 0x9F;delay();}}}//软件延时程序void delay(void){unsigned char i,j,k;for(i=20;i>0;i--)for(j=20;j>0;j--)for(k=248;k>0;k--);}3.1 1602程序:#include "reg52.h"#include "intrins.h"unsigned char text1[] = "LCD 1602 TEST" ; unsigned char text2[] = "" ;sbit RS = P2^0;sbit RW = P2^1;sbit EN = P1^2;void delay_ms(unsigned char t);void init_1602(void);void write_command(unsigned char cmd); void write_data(unsigned char dat);void dsp_onechar(unsigned char pos,unsigned char c);void dsp_string(unsigned char line,unsigned char *p,unsigned char length);void main(void){init_1602();delay_ms(15);dsp_string(0,text1,13);dsp_string(1,text2,12); 2.1 独立按键程序:#include "reg52.h"void main(void){while(1){switch(P3){case 0xFE: //S1{P0 = 0xFC;P2 |= 0xE0;P2 &= 0x9F;break;}case 0xFD: //S2{P0 = 0xF3;P2 |= 0xE0;P2 &= 0x9F;break;}case 0xFB: //S3{P0 = 0xCF;P2 |= 0xE0;P2 &= 0x9F;break;}case 0xF7: //S4{P0 = 0x3F;P2 |= 0xE0;P2 &= 0x9F;break;}}}}2.2 键盘矩阵程序:#include "reg52.h"unsigned char dspflag;unsigned char keyflag;unsigned char tflag;unsigned char code dsp_code_ca[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80 ,0x90};unsigned char keyscan(void);void display(unsigned char d);void main(){unsigned char temp;while(1);}void delay_ms(unsigned char t){unsigned char i;while(t--){for(i=0;i<112;i++);}}void write_command(unsigned char cmd) {delay_ms(5); // check busy flagEN = 0;RS = 0;RW = 0;_nop_();EN = 1;P0 = cmd;EN = 0;}void write_data(unsigned char dat){delay_ms(5); //busy flag checkEN = 0;RS = 1;RW = 0;_nop_();EN = 1;P0 = dat;EN = 0;RS = 0;}void dsp_onechar(unsigned char pos,unsigned char c){unsigned char p;if (pos>=0x10)p=pos+0xb0;elsep=pos+0x80;write_command(p);write_data(c);}void dsp_string(unsigned char line,unsigned char *p,unsigned char length){unsigned char l,i;l=line<<4;for (i=0;i<length;i++)dsp_onechar(l++,*(p+i));TMOD = 0x02;TH0 = 0x06;TL0 = 0x06;EA = 1;ET0 = 1;TR0 = 1;while(1){if(keyflag){temp = keyscan();keyflag = 0;}display(temp);}}//定时器0中断服务函数void isr_t0(void) interrupt 1{tflag++;if(tflag == 16) // 4ms{dspflag++;if(dspflag == 2)dspflag = 0;}if(tflag == 20) //10ms{tflag = 0;keyflag = 1;}}// 4×4键盘矩阵扫描函数unsigned char keyscan(void){unsigned char keyvalue;P3 = 0x7F; //S4 S5 S6 S7 switch(P3){case 0x7E: keyvalue = 0;break;case 0x7D: keyvalue = 4;break;case 0x7B: keyvalue = 8;break;case 0x77: keyvalue = 12;break;default: break;}P3 = 0xBF; //S8 S9 S10 S11 switch(P3){case 0xBE: keyvalue = 1;break;case 0xBD: keyvalue = 5;break;case 0xBB: keyvalue = 9;break;case 0xB7: keyvalue = 13;break;default: break;}}void init_1602(void){delay_ms(15);write_command(0x38);write_command(0x38);write_command(0x38);write_command(0x06);write_command(0x0c);write_command(0x01);}3.2 数码管程序;#include "reg52.h"unsigned char code dsp_code_ca[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0 x80,0x90};unsigned int tflag;unsigned char dspflag;unsigned char second;unsigned char dflag;void display(unsigned char d);void main(){TMOD |= 0x02;TH0 = 0x06;TL0 = 0x06;EA = 1;ET0 = 1;TR0 = 1;while(1){display(second);}}//T0中断服务函数void isr_t0(void) interrupt 1{tflag++;dflag++;if(dflag == 16){dflag = 0;dspflag++;if(dspflag == 2)dspflag = 0;}if(tflag == 4000){tflag = 0;second++;P3 = 0xDF; //S12 S13 S14 S15 switch(P3){case 0xDE: keyvalue = 2;break;case 0xDD: keyvalue = 6;break;case 0xDB: keyvalue = 10;break;case 0xD7: keyvalue = 14;break;default: break;}P3 = 0xEF; //S16 S17 S18 S19 switch(P3){case 0xEE: keyvalue = 3;break;case 0xED: keyvalue = 7;break;case 0xEB: keyvalue = 11;break;case 0xE7: keyvalue = 15;break;default: break;}return keyvalue;}//数码管显示函数,显示两位void display(unsigned char d){if((dspflag == 0) && (d/10 != 0)) {P0 = 0xFF;P2 |= 0xE0;P2 &= 0x1F;P0 = dsp_code_ca[d/10];P2 |= 0xE0;P2 &= 0x1F;P0 = 0x40;P2 |= 0xC0;P2 &= 0x3F;}if(dspflag == 1){P0 = 0xFF;P2 |= 0xE0;P2 &= 0x1F;P0 = dsp_code_ca[d%10];P2 |= 0xE0;P2 &= 0x1F;P0 = 0x80;P2 |= 0xC0;P2 &= 0x3F;}}if(second == 60)second = 0;}}//显示程序void display(unsigned char d){if((dspflag == 0) && (d/10 != 0)){P0 = 0xFF;P2 |= 0xE0;P2 &= 0x1F;P0 = dsp_code_ca[d/10];P2 |= 0xE0;P2 &= 0x1F;P0 = 0x40;P2 |= 0xC0;P2 &= 0x3F;}if(dspflag == 1){P0 = 0xFF;P2 |= 0xE0;P2 &= 0x1F;P0 = dsp_code_ca[d%10];P2 |= 0xE0;P2 &= 0x1F;P0 = 0x80;P2 |= 0xC0;P2 &= 0x3F;}}5. common程序:#include "reg52.h"sbit buzzer = P0^6;sbit relay = P0^4;void main(void){//关闭蜂鸣器buzzer = 0; //高有效P2 = 0xA0;P2 = 0x00;//关闭继电器relay = 0; //高有效P2 = 0xA0;P2 = 0x00; 4. UART(串行数据总线)程序;#include "at89x52.h"unsigned char txbuffer1[] = "STC89C52RC UART TEST PROGRAM";unsigned char txbuffer2[] = "============================"; unsigned char enter[] = {0x0A,0x0D};void uart_tx(unsigned char *p,unsigned char length);void main(){SCON = 0x50;TMOD = 0x20;TH1 = 0xF3;TL1 = 0xF3;TR1 = 1;uart_tx(txbuffer2,28);uart_tx(enter,2); //Enteruart_tx(txbuffer1,28);uart_tx(enter,2); //Enteruart_tx(txbuffer2,28);uart_tx(enter,2); //Enterwhile(1);}void uart_tx(unsigned char *p,unsigned char length){unsigned char i;for(i=0;i<length;i++){SBUF = *(p+i);while(TI == 0);TI = 0;}}6.1 DS18b20(温度传感器)主程序:#include "reg52.h"#include "ds18b20.h"unsigned int tflag;bit secflag = 0;unsigned char text[] = "Temperature = "; unsigned char enter[] = {0x0A,0x0D}; //回车符//关闭数码管显示P0 = 0x00; //位选置低P2 = 0xC0;P2 = 0x00;//关闭发光二极管显示P0 = 0xFF; //低有效P2 = 0x80;P2 = 0x00;while(1);}8. 1 AT24C02(2K位串行CMOS E2PROM)主程序:#include "reg52.h"#include "24c02.h"unsigned char dspflag;unsigned char cnt;unsigned char tflag;unsigned char code dsp_code_ca[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0 x80,0x90};void display(unsigned char d);void init_t0(void);void main(){//wrbyte_24c02(0x00,0x00);cnt = rdbyte_24c02(0x00);wrbyte_24c02(0x00,cnt+1);init_t0();while(1){display(cnt);}}void isr_t0(void) interrupt 1{tflag++;if(tflag == 16){tflag = 0;dspflag ++;if(dspflag == 3)dspflag = 0;}} void uart_tx(unsigned char *p,unsigned char length);char dat(char a);void main(void){unsigned char temp;SCON = 0x50;TMOD = 0x22;TH1 = 0xF3;TL1 = 0xF3;TH0 = 0x06;TL0 = 0x06;EA = 1;ET0 = 1;TR0 = 1;TR1 = 1;while(1){if(secflag == 1){secflag = 0;uart_tx(text,14);temp = rd_temperature();if(temp>99){SBUF = temp/100 + 0x30;while(TI == 0);TI = 0;}if(temp>9){SBUF = temp%100/10 + 0x30;while(TI == 0);TI = 0;}SBUF = temp%100%10 + 0x30;while(TI == 0);TI = 0;uart_tx(enter,2);}}}//定时器TO中断服务函数void isr_t0(void) interrupt 1void init_t0(void){TMOD = 0x02;TH0 = 0x06;TL0 = 0x06;ET0 = 1;EA = 1;TR0 = 1;}void display(unsigned char d){if((dspflag == 0)&&(d>99)){P0 = 0xFF;P2 |= 0xE0;P2 &= 0x1F;P0 = dsp_code_ca[d/100];P2 |= 0xE0;P2 &= 0x1F;P0 = 0x20;P2 |= 0xC0;P2 &= 0x3F;}if((dspflag == 1)&&(d>9)){P0 = 0xFF;P2 |= 0xE0;P2 &= 0x1F;P0 = dsp_code_ca[d%100/10];P2 |= 0xE0;P2 &= 0x1F;P0 = 0x40;P2 |= 0xC0;P2 &= 0x3F;}if(dspflag == 2){P0 = 0xFF;P2 |= 0xE0;P2 &= 0x1F;P0 = dsp_code_ca[d%100%10];P2 |= 0xE0;P2 &= 0x1F;P0 = 0x80;P2 |= 0xC0;P2 &= 0x3F;}}8. 2 AT24C02(2K位串行CMOS E2PROM)程序:#include "24c02.h" {tflag++;if(tflag == 4000){tflag = 0;secflag = 1;}}//串口传输函数void uart_tx(unsigned char *p,unsigned char length){unsigned char i;for(i=0;i<length;i++){SBUF = *(p+i);while(TI == 0);TI = 0;}}6.2 DS18b20(温度传感器)程序:#include "ds18b20.h"//延时函数void delay(unsigned int t){while(t--);}//DS18B20初始化函数bit init_ds18b20(void){bit initflag = 0;DQ = 1;delay(12);DQ = 0;delay(80); // 延时大于480usDQ = 1;delay(10); // 14initflag = DQ; // initflag等于1初始化失败delay(5);return initflag;}//通过单总线向从器件写一个字节void wr_ds18b20(unsigned char byt){unsigned char i;for(i=0;i<8;i++){DQ = 0;void iic_start(void){SDA = 1;_nop_();SCL = 1;somenop;SDA = 0;somenop;SCL = 0;}void iic_stop(void){SDA = 0;_nop_();SCL = 1;somenop;SDA = 1;}void iic_ack(bit ackbit){if(ackbit)SDA = 0;elseSDA = 1;somenop;SCL = 1;somenop;SCL = 0;SDA = 1;somenop;}bit iic_waitack(void){SDA = 1;somenop;SCL = 1;somenop;if(SDA){SCL = 0;iic_stop();return 0;}else{SCL = 0;return 1;}}void iic_sendbyte(unsigned char byt) {unsigned char i;DQ = byt&0x01;delay(5);DQ = 1;byt >>= 1;}delay(5);}//通过单总线从从器件读一个字节unsigned char rd_ds18b20(void){unsigned char i;unsigned char byt;for(i=0;i<8;i++){DQ = 0;byt >>= 1;DQ = 1;if(DQ){byt |= 0x80;}delay(5);}return byt;}//温度转换、读取及数据处理器函数unsigned char rd_temperature(void) {unsigned char low,high;char temp;init_ds18b20();wr_ds18b20(0xCC);wr_ds18b20(0x44); //启动温度转换delay(200);init_ds18b20();wr_ds18b20(0xCC);wr_ds18b20(0xBE); //读取寄存器low = rd_ds18b20(); //低字节high = rd_ds18b20(); //高字节temp = high<<4;temp |= (low>>4);return temp;}for(i=0;i<8;i++){if(byt&0x80)SDA = 1;elseSDA = 0;somenop;SCL = 1;byt <<= 1;somenop;SCL = 0;}}unsigned char iic_recbyte(void){unsigned char da;unsigned char i;for(i=0;i<8;i++){SCL = 1;somenop;da <<= 1;if(SDA)da |= 0x01;SCL = 0;somenop;}return da;}void wrbyte_24c02(unsigned char add,unsigned char dat){// Device Address 1100 000 R/Wiic_start();iic_sendbyte(0xa0);iic_waitack();iic_sendbyte(add);iic_waitack();iic_sendbyte(dat);iic_waitack();iic_stop();delay(10);}unsigned char rdbyte_24c02(unsigned char add){// Device Address 1100 000 R/W unsigned char da;iic_start();iic_sendbyte(0xa0);iic_waitack();iic_sendbyte(add);iic_waitack();iic_start(); 9.1 ADC主程序:#include "reg52.h"#include "pcf8591.h"void init_t0(void);void init_pcf8591(void);void display(unsigned char d);bit adcflag = 0;unsigned char dspflag;unsigned char tflag1;unsigned char tflag2;unsigned char code dsp_code_ca[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80 ,0x90};void main(void){unsigned char adcvalue;init_pcf8591();init_t0();while(1){display(adcvalue);if(adcflag == 1){adcvalue = adc_pcf8591();adcflag = 0;}}}void isr_t0(void) interrupt 1{tflag1++;tflag2++;if(tflag1 == 16) //4ms{tflag1 = 0;dspflag++;if(dspflag == 3)dspflag = 0;}if(tflag2 == 80) //20ms{tflag2 = 0;adcflag = 1;}}void init_t0(void){TMOD = 0x02;TH0 = 0x06;TL0 = 0x06;iic_sendbyte(0xa1);iic_waitack();da = iic_recbyte();iic_ack(0);iic_stop();return da;}void delay(unsigned char t){unsigned char i;while(t--){for(i=0;i<112;i++);}}10.1 DAC主程序:#include "reg52.h"#include "pcf8591.h"#include "math.h"unsigned char idata table[128];void main(void){unsigned char i = 0;for(i=0;i<128;i++){table[i] = 127*sin(2.0*3.1415/256.0*i*2)+128;}iic_start();iic_sendbyte(0x90);iic_waitack();iic_sendbyte(0x40); //选择DAC功能iic_waitack();while(1){for(i=0;i<128;i++){iic_sendbyte(table[i]); //通过PCF8591输出正弦波iic_waitack();}}}ET0 = 1;EA = 1;TR0 = 1;}void init_pcf8591(void){iic_start();iic_sendbyte(0x90);iic_waitack();iic_sendbyte(CHANNEL_3);iic_waitack();iic_stop();delay(10);}void display(unsigned char d){if((dspflag == 0)&&(d>99)){P0 = 0xFF;P2 |= 0xE0;P2 &= 0x1F;P0 = dsp_code_ca[d/100];P2 |= 0xE0;P2 &= 0x1F;P0 = 0x20;P2 |= 0xC0;P2 &= 0x3F;}if((dspflag == 1)&&(d>9)){P0 = 0xFF;P2 |= 0xE0;P2 &= 0x1F;P0 = dsp_code_ca[d%100/10];P2 |= 0xE0;P2 &= 0x1F;P0 = 0x40;P2 |= 0xC0;P2 &= 0x3F;}if(dspflag == 2){P0 = 0xFF;P2 |= 0xE0;P2 &= 0x1F;P0 = dsp_code_ca[d%100%10];P2 |= 0xE0;P2 &= 0x1F;P0 = 0x80;P2 |= 0xC0;P2 &= 0x3F;}10.2 DAC(pcf8591)程序:#include "pcf8591.h"void iic_start(void){SDA = 1;_nop_();SCL = 1;somenop;SDA = 0;somenop;SCL = 0;}void iic_stop(void){SDA = 0;_nop_();SCL = 1;somenop;SDA = 1;}bit iic_waitack(void){SDA = 1;somenop;SCL = 1;somenop;if(SDA){SCL = 0;iic_stop();return 0;}else{SCL = 0;return 1;}}void iic_sendbyte(unsigned char byt) {unsigned char i;for(i=0;i<8;i++){if(byt&0x80)SDA = 1;elseSDA = 0;somenop;SCL = 1;byt <<= 1;somenop;SCL = 0;}} }9.2 ADC(pcf8591)程序:#include "pcf8591.h"void iic_start(void){SDA = 1;_nop_();SCL = 1;somenop;SDA = 0;somenop;SCL = 0;}void iic_stop(void){SDA = 0;_nop_();SCL = 1;somenop;SDA = 1;}void iic_ack(bit ackbit){if(ackbit)SDA = 0;elseSDA = 1;somenop;SCL = 1;somenop;SCL = 0;SDA = 1;somenop;}bit iic_waitack(void){SDA = 1;somenop;SCL = 1;somenop;if(SDA){SCL = 0;iic_stop();return 0;}else{SCL = 0;return 1;}}void iic_sendbyte(unsigned char byt) {unsigned char i;for(i=0;i<8;i++){if(byt&0x80)SDA = 1;elseSDA = 0;somenop;SCL = 1;byt <<= 1;somenop;SCL = 0;}}unsigned char iic_recbyte(void) {unsigned char da;unsigned char i;for(i=0;i<8;i++){SCL = 1;somenop;da <<= 1;if(SDA)da |= 0x01;SCL = 0;somenop;}return da;}void delay(unsigned char t){unsigned char i;while(t--){for(i=0;i<112;i++);}}unsigned char adc_pcf8591(void) {unsigned char temp;iic_start();iic_sendbyte(0x91);iic_waitack();temp = iic_recbyte();iic_ack(0);iic_stop();return temp; }。
独立按键的加1计数显示
设计报告项目:独立按键的加1计数显示班级:电气121姓名:学号:12322081设计报告四独立按键的加1计数显示1、设计目标(1)认识8051的独立按键功能;(2)能够在C语言的程序里启用独立按键功能;(3)能够编写独立按键加1计数程序。
2、设计要求使用1个独立按键,当主程序正常执行时,P2口连接的数码管循环显示0-9。
3、硬件电路设计硬件电路图:4.软件系统设计(要求:对程序块进行注释)#include<reg52.h>sbit key=P1^3;#define uchar unsigned charuchar m;uchardisplay_data[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f} ;void delay10ms(unsigned int z);void delay10ms(unsigned int z){unsigned int x,y;for(x=2;x>0;x--)for(y=z;y>0;y--);}void main(){m=0;P2=0x00;key=1;while(1){if(key==0){delay10ms(625);if(key==0){P2=display_data[m];m++;if(m==10)m=0;delay10ms(625);while(key==0);//判断按键是否弹起}}}}5、小结(1)认识了8051的独立按键功能;(2)能够在C语言的程序里启用独立按键功能;(3)能够编写独立按键加1计数程序。
一、 独立式键盘接口电路及程序设计
3.1 键盘与接口 3.2 LED显示及接口 3.3 键盘/LED显示器接口设计 3.4 CRT显示及接口 3.5 微型打印机及接口
第3章 智能仪器人机接口
人机交互功能即用户与仪器交换信息的功能。 这个功能有两方面的含义:一是用户对智能仪 器进行状态干预和数据输入;二是智能仪器向用户报 告运行状态与处理结果。
3.1 键盘与接口
3.1.1 键盘输入基础知识
一、 键盘的组织
键盘按其工作原理可分为编码式键盘和非编码式键盘。
编码式键盘由按键键盘和专用键盘编码器两部分构成。当键 盘中某一按键被按下时,键盘编码器会自动产生对应的按键代 码, 并输出选通脉冲信号与CPU 进行信息联络。
非编码键盘不含编码器,当某键按下时,键盘只送出一个简 单的闭合信号, 对应按键代码的确定必须借助于软件来完成。
一、 独立式键盘接口电路及程序设计
独立式键盘的每个按键占用一根测试线,它们可以直接与 单片机I/O 线相接或通过输入口与数据线相接,结构很简单。 这些测试线相互独立无编码关系,因而键盘软件不存在译码问 题,一旦检测到某测试线上有键闭合,便可直接转入到相应的 键功能处理程序进行处理。
一个实际三个按 键的独立式键盘接口 电路如右图所示:
3.1.1 键盘输入基础知识
一、 键盘的组织 二、 键盘的工作方式
编程扫描工作方式、中断工作方式和定时扫描工作方式。 (1) 编程扫描工作方式:也称查询方式。 (2) 中断工作方式:程扫描工作方式: 该方式也称查询方式,它是利用 CPU在完成其他工作的空余调用键盘扫描程序,以响应键输入 的要求。当CPU在运行其他程序时,它就不会再响应键输入要 求,因此,采用该方式编程时, 应考虑程序是否能对用户的每 次按键都会做出及时的响应。
实验6 独立按键电路的设计与仿真
实验项目五独立按键电路的设计与仿真[实验目的]1.掌握独立键盘的工作原理2.掌握独立键盘硬件电路的设计方法3.掌握对独立键盘的控制方法[实验原理][实验仪器]PC机一台[Proteus用到器件的关键词]单片机(at89c52)、数码管(7seg-com-cathode)、排阻(respack-7)、按键(button)、蜂鸣器(buzzer active)[实验内容与步骤]1.用Proteus软件设计出独立键盘接口电路原理图。
2.用P2.1口来控制独立键盘ADDKEY,每按一次按键,让数码管显示的数值加1一次,一直加到9,再按一次,数码管重新显示0。
同时,每按一次键,蜂鸣器会发“滴”的声音。
3.在进行按键处理时,要注意按键去抖动的软件处理方法,在按键松开时要进行按键松手检测。
4.用Keil编写程序,完上上面所描述的任务,最后调试程序、编译后生成HEX文件。
5.将HEX文件装载到MCU AT89C52中,单击Start按钮开始动态仿真。
[实验数据记录]ADDKEY BIT P2.1BEEP BIT P2.6ORG 0000HAJMP MAINORG 0050HMAIN: MOV P0,#00HLCALL DELAYMOV DPTR,#0100HLP: JB ADDKEY,$ ;检测到有键按下CLR BEEPLCALL DELAY ;软件延时去抖SETB BEEPJB ADDKEY,$ ;确实有键按下JNB ADDKEY,$ ;松手检测LCALL DISPLAYSJMP LPDISPLAY:MOVC A,@A+DPTRMOV P0,AINC DPTRCLR AMOV R2,DPLCJNE R2,#10,DONE ;数码显示到9,给DPL重新赋值,并清零计数器R2MOV R2,#00HMOV DPL,#00HDONE: RETDELAY: MOV R0,#64H ;延时100msDL1: MOV R1,#0C8HDL2: NOPNOPNOPDJNZ R1,DL2DJNZ R0,DL1RETORG 0100HTAB: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH ;段选代码,对应0123456789 END[实验数据处理][实验结果及讨论]。
实验5-独立键盘和矩阵键盘
实验5 独立键盘和矩阵键盘一、实验目的1、学会用C语言进行独立按键应用程序的设计。
2、学会用C语言进行矩阵按键应用程序的设计。
二、实验内容1、独立按键:对四个独立按键编写程序:当按k1时,8个LED同时100ms闪烁;当按k2时,8个LED从左到右流水灯显示;当按k3时,8个LED从右到左流水灯显示;当按k4时,8各LED同时从两侧向中间逐步点亮,之后再从中间向两侧逐渐熄灭;2、矩阵按键:采用键盘扫描方式,顺序按下矩阵键盘后,在一个数码管上顺序显示0~F,采用静态显示即可。
3、提高部分(独立按键、定时器、数码管动态扫描):编写程序,实现下面的功能。
用数码管的两位显示一个十进制数,变化范围为00~59,开始时显示00,每按一次k1,数值加1;每按一次k2,数值减1;每按一次k3,数值归零;按下k4,利用定时器功能使数值开始自动每秒加1;再按一次k4,数值停止自动加1,保持显示原数。
三、实验步骤1、硬件连接(1)使用MicroUSB数据线,将实验开发板与微型计算机连接起来;(2)在实验开发板上,用数据线将相应接口连接起来;2、程序烧入软件的使用使用普中ISP软件将HEX文件下载至单片机芯片内。
查看结果是否正确。
四、实验结果——源代码1. #include "reg52.h"typedef unsigned char u8;typedef unsigned int u16;#define LED P2sbit key1=P3^1;sbit key2=P3^0;sbit key3=P3^2;sbit key4=P3^3;const char tab[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; u8 code begMid[]={0x7e, 0xbd,0xdb,0xe7, 0xdb, 0xbd, 0x7e}; void Delay(u16 i){ while(i--);}void KeyDown(){u8 i;if(key2==0){Delay(1000);if(key2==0){for(i=0;i<8;i++){LED=tab[i];Delay(50000);}while(!key2);}LED=0xff;}else if(key1==0){Delay(1000);if(key1==0)for(i=0;i<3;i++){LED=0x00;Delay(10000);LED=0xff;Delay(10000);}}}}void Int0Init(){IT0=1;EX0=1;EA=1;}void Int1Init(){IT1=1;EX1=1;EA=1;} void main(){Int0Init();Int1Init();while(1){KeyDown();}}void Int0() interrupt 0{u8 i;if(key3==0){Delay(1000);if(key3==0)for(i=7;i>=0;i--){LED=tab[i];Delay(50000);}}}}void Int1() interrupt 2{u8 i;if(key4==0){Delay(1000);if(key4==0){for(i=0;i<=6;i++){LED=begMid[i];Delay(50000);}}}}2.#include "reg52.h"typedef unsigned int u16;typedef unsigned char u8;#define GPIO_DIG P0#define GPIO_KEY P1sbit LSA=P2^2;sbit LSB=P2^3;sbit LSC=P2^4;u8 KeyValue;u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//??0~F?? void delay(u16 i){while(i--);}void KeyDown(void){char a=0;GPIO_KEY=0x0f;if(GPIO_KEY!=0x0f){delay(1000);if(GPIO_KEY!=0x0f){GPIO_KEY=0X0F;switch(GPIO_KEY){case(0X07): KeyValue=0;break;case(0X0b): KeyValue=1;break;case(0X0d): KeyValue=2;break;case(0X0e): KeyValue=3;break;}GPIO_KEY=0XF0;switch(GPIO_KEY){case(0X70): KeyValue=KeyValue;break;case(0Xb0): KeyValue=KeyValue+4;break;case(0Xd0): KeyValue=KeyValue+8;break;case(0Xe0): KeyValue=KeyValue+12;break;}while((a<50)&&(GPIO_KEY!=0xf0)){delay(1000);a++;}}}}void main(){LSA=0;LSB=0;LSC=0;while(1){KeyDown();GPIO_DIG=smgduan[KeyValue];}}3.#include <reg52.h>typedef unsigned int u16;typedef unsigned char u8;#define KEYPORT P3sbit LSA=P2^2;sbit LSB=P2^3;sbit LSC=P2^4;sbit key1=P3^1;sbit key2=P3^0;sbit key3=P3^2;sbit key4=P3^3;u16 t;u8 sec;u8 DisplayData[2];u8 code smgduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; void Time1Init(){TMOD |= 0x10;TH1=0Xd8;TL1=0Xf0;EA=1;ET1=1;}void delay(u16 i){while(i--); }void DigDisplay(){u8 i;for(i=0;i<2;i++){switch(i){case 0:LSA=0;LSB=0;LSC=0;break;case 1:LSA=1;LSB=0;LSC=0;break;}P0=DisplayData[i];delay(100);P0=0x00;}}void datapros(){DisplayData[0]=smgduan[sec%10];DisplayData[1]=smgduan[sec/10];}void main(){Time1Init();while(1){if(key4==0){delay(1000);if(key4==0){TR1=!TR1;while(key4==0);}}if(key3==0){delay(1000);if(key3==0){sec=0;while(key3==0);}}if(key2==0){delay(1000);if(key2==0){sec--;while(key2==0);}}if(key1==0){delay(1000);if(key1==0){sec++;while(key1==0);}}}}void Time1() interrupt 2{TH1=0Xd8;TL1=0Xf0;t++;if(t==100){t=0;sec++;if(sec>=60){sec=0;}}datapros();DigDisplay();}五、实验体会——结果分析1、独立按键:位定义四个按键key1、key2、key3、key4,宏定义LED为P2口,tab数组保存流水灯D0-D7依次点亮的数值,begMid数组保存流水灯同时从两侧向中间逐步点亮,之后再从中间向两侧逐渐熄灭的赋值方式。
单片机按键处理技巧及编程方式
单片机按键处理技巧及编程方式2010-10-23 15:01从这一章开始,我们步入按键程序设计的殿堂。
在基于单片机为核心构成的应用系统中,用户输入是必不可少的一部分。
输入可以分很多种情况,譬如有的系统支持PS2键盘的接口,有的系统输入是基于编码器,有的系统输入是基于串口或者USB或者其它输入通道等等。
在各种输入途径中,更常见的是,基于单个按键或者由单个键盘按照一定排列构成的矩阵键盘(行列键盘)。
我们这一篇章主要讨论的对象就是基于单个按键的程序设计,以及矩阵键盘的程序编写。
◎按键检测的原理常见的独立按键的外观如下,相信大家并不陌生,各种常见的开发板学习板上随处可以看到他们的身影。
(原文件名:1.jpg)引用图片总共有四个引脚,一般情况下,处于同一边的两个引脚内部是连接在一起的,如何分辨两个引脚是否处在同一边呢?可以将按键翻转过来,处于同一边的两个引脚,有一条突起的线将他们连接一起,以标示它们俩是相连的。
如果无法观察得到,用数字万用表的二极管挡位检测一下即可。
搞清楚这点非常重要,对于我们画PCB的时候的封装很有益。
它们和我们的单片机系统的I/O口连接一般如下:(原文件名:2.jpg)引用图片对于单片机I/O内部有上拉电阻的微控制器而言,还可以省掉外部的那个上拉电阻。
简单分析一下按键检测的原理。
当按键没有按下的时候,单片机I/O通过上拉电阻R接到VCC,我们在程序中读取该I/O的电平的时候,其值为1(高电平); 当按键S按下的时候,该I/O被短接到GND,在程序中读取该I/O的电平的时候,其值为0(低电平) 。
这样,按键的按下与否,就和与该按键相连的I/O的电平的变化相对应起来。
结论:我们在程序中通过检测到该I/O口电平的变化与否,即可以知道按键是否被按下,从而做出相应的响应。
一切看起来很美好,是这样的吗?◎现实并非理想在我们通过上面的按键检测原理得出上述的结论的时候,其实忽略了一个重要的问题,那就是现实中按键按下时候的电平变化状态。
51单片机-独立按键
查询方式
单片机不断的扫描键盘判断按键是否动作 特点:硬件简单,但需要单片出中断请求,单片机响应中断请求后转按键 识别程序
特点:硬件复杂,需要中断电路,但不占用CPU资源
单片机处理按键的流程
单片机处理按键动作需要以下步骤:
按键识别
单片机在识别按键时,IO口工作在输入状态:
按键弹起,IO口电平5V
Vcc
按键按下,IO口电平0V
单片机读取IO口的状态
即可知按键的状态
单片机
按键抖动
实际的按键在被按下或抬起时,由于机械 触点的弹性作用,在闭合或断开的瞬间均伴随有 一连串的抖动现象。
理想波形
实际波形
按下抖动
稳定闭合
释放抖动
完整的按键过程包括: 1. 释放状态 2. 按下抖动阶段 3. 完全按下状态 4. 释放抖动阶段 5. 释放状态
按键防抖
防抖措施:
硬件防抖
在按键输出端加RS或施密特触发器 去抖效果好、电路复杂、成本高
软件防抖
利用软件进行延时(10ms) 电路简单、成本低、但占用CPU时间
键盘的工作方式
判断按键是否按下 按键按下时的防抖 识别哪个按键按下,判断键值 判断按键是否放开 送出键值,处理按键动作
练习:单片机按键查询操作,8个按键对应8个LED灯, K1对应D1,K2对应D2,K3对应D3,……,查询按键, 按下某一个按键后对应的LED亮起,再按一次关闭。
独立按键及矩阵键盘控制LED灯课件
THANKS
电路。
当按键被按下时,按键的两个触 点之间会短路,从而接通电路; 当按键释放时,触点断开,电路
断开。
独立按键通常用于简单的输入控 制,如开关一个LED灯。
独立按键控制LED灯的电路连接
01
将LED的正极连接到按键的常闭 触点上,LED的负极连接到地线 。
02
当按键没有被按下时,LED灯不 亮;当按键被按下时,LED灯亮 起。
控制家电设备
独立按键和矩阵键盘可以用于控制各种家电设备,如灯光、空调、电视等,实现一键控制和智能 化管理。
实现人机交互
通过独立按键和矩阵键盘,用户可以方便地与智能家居系统进行交互,实现语音控制、手势控制 等多种交互方式。
实现家庭安全
独立按键和矩阵键盘可以用于设置安全报警系统,如门窗报警、烟雾报警等,提高家庭安全防范 能力。
应用场景的比较
独立按键
适用于按键数量较少,布局较为分散 的场合,如遥控器、计算器等。
矩阵键盘
适用于按键数量较多,布局较为紧凑 的场合,如电脑键盘、游戏机手柄等 。
优缺点的比较
独立按键
01
缺点:占用引脚多,不适合大量按键的应 用场景。
03
02
优点:每个按键独立控制,电路简单,易于 实现。
04
矩阵键盘
优点:可节省引脚数量,适用于大量按键 的应用场景。
05
06
缺点:电路较为复杂,需要行列扫描或解 码电路才能实现。
04
独立按键及矩阵键盘在智能 家居中的应用
智能家居概述
1 2
3
智能家居定义
智能家居是指通过互联网、物联网等技术,将家庭中的各种 设备连接到一起,实现智能化控制和管理,提高生活便利性 和舒适度。
独立按键与菜单显示系统的设计方案
独立按键与菜单显示系统的设计引言:通过按键和LCD液晶显示组成的人机界而是电子产品设汁的常用的人机交互方式,如果能够将复杂且耗时的按键驱动、液晶驱动、菜单维护等工作从系统中分离出来并提供完备的功能,对于减少资源占用提高系统实时性、简化系统设汁具有重要的意义。
本文以设计一套包含按键置数、菜单滚动、动态显示变呈:、系统状态发送等功能的最小化的单片机系统,并且以此为契机探讨按键和显示程序设计中应当注意的种种问题和程序的优化设计。
一、独立设计按键和显示系统的意义人机交互界而就是是人与计算机之间传递、交换信息的媒介和对话接口,是il•算机系统的重要组成部分。
按键驱动和液晶显示部分是很多电子设计采取的交互手段,它的好处是接口简便、成本低。
实际上多数的设汁中按键和液晶的响应控制不需要有很高的实时性,按键程序通常都包含100ms左右的消抖延时,液晶显示时只要刷屏速度大于150ms (60HZ)肉眼是看不出分别的,但这段时间相对于实时系统来说是一个很长的,如果和系统混合在一起编译运行将占用很大的存储和运行开销。
能够将按键和显示部分从应用系统中剥离岀来对于提高开发效率完备程序设il•都有很髙的价值,特别的对于电子竞赛短时间内需要完成完整的功能设计的情况都有重要的意义。
从系统应用的角度看不同的系统对于按键的处理和显示的功能都是很类似的,比如按键输入一个数据、屏幕的特定位置显示一个变疑、菜单上下滚动选中其中的某一行等等。
一个只有三个按键的系统输入一个变虽时需要很多的中间变量,还要配合按键扫描、变量数据上下限判断、液晶屏显示当前值、标记显示当前正在输入的位等一系列的功能函数调用步骤才能完成,然而最后系统所关心的只是输入变星的值是多少。
不难看出将按键与显示部分分离出来不仅简化应用系统的设计而且可以大幅提髙系统实时处理能力。
设计一个完整的按键菜单液晶模块对于初学者来说也并不是一件容易的事,通常在很熟悉编译环境和语言的前提下要完整编写这些代码也需要几个星期甚至更长的时间,重复编写这些功能不仅耗时而且没有必要。
51单片机学习之5-独立按键和矩阵键盘
51单片机学习之5-独立按键和矩阵键盘
第14集
键盘的原理
键盘分编码键盘(例如电脑键盘)和非编码键盘(自己用程序去识别)。
非编码键盘分:独立式非编码键盘(独立按键)、行列式非编码键盘(4*4阵列键盘)
独立键盘的电路图。
因为51单片机的IO口不是双向口而是准双向口,要让IO口具备输入功能,必须将IO口置1,置1之后当按键按下时IO口的电平会被拉低,即被置0。
当检测到IO口为0时即可判断该按键已经按下。
按键按下时会有一个抖动的
过程(弹片会抖动),由于单片机检测IO口速度非常快,超过弹片抖动的频率,所以当单片机检测到IO口为0时需延时一小段时间再检测IO是否为0,如果仍为0就确认该按钮被按下。
因为IO口里面有上拉电阻,所以当松开按钮时,IO口又被拉高。
例程:
#include
#defineuintunsignedint
#defineucharunsignedchar
sbitKey=P3;//按键
sbitLed=P1;//Led灯
voiddelay(uintz);
/********主函数********/
voidmain()。
51单片机:独立按键与矩阵按键控制数码管
51单⽚机:独⽴按键与矩阵按键控制数码管⼀,独⽴按键注意⼀下⼏点>按下的时候,电压被拉低,所以IO⼝要传低电平( 0x0 )>按下的时候要消除抖动 ( 延时10ms ),在判断,是否还是低电平,再做业务处理下⾯这段程序,就是通过⼀个独⽴按键连接到p1⼝,控制静态数码管的⼀段进⾏亮和灭的切换。
#include <reg52.h>sbit key_control = P1^0;sbit led = P0^0;typedef unsigned char u8;typedef unsigned int u16;void delay( u16 i ){while( i-- );}void key_press(){if( key_control == 0x0 ) {delay( 1110 );if( key_control == 0x0 ){led = ~led;}while( !key_control );}}void main (){/*while( 1 ){if( key_control == 0x0 ) {delay( 1110 ); //⼤概10msif ( key_control == 0x0 ) {led = 1;}}else if( key_control == 0x1 ) {delay( 1110 );if ( key_control == 0x1 ) {led = 0;}}}*/led = 0;while( 1 ) {key_press();}}⼆,当按键⽐较多的时候,⽤矩阵按钮,因为如果不⽤矩阵按钮,⼀个独⽴按键需要⼀个IO⼝,浪费资源。
如: 16个独⽴按键需要16个io⼝,⽽16个矩阵按键(4x4,⼀共8个管脚)需要8个IO⼝下⾯的程序,通过16个矩阵按钮,控制静态数码管,显⽰0~F#include <reg52.h>#define GPIO_DIG P0 //段选数码管#define GPIO_KEY P1 //矩阵按键typedef unsigned char u8;typedef unsigned int u16;void delay( u16 i ){while( i-- );}u8 key_value;//静态数码管段码u8 character [16] = { 0xC0, 0xF9 , 0xA4 , 0xB0 , 0x99 , 0x92,0x82 , 0xF8 , 0x80 , 0x90 , 0x88 , 0x83,0xC6 , 0xA1 , 0x86 , 0x8E};void key_down(){u8 count = 0;//⾏列扫描判断哪个键被按下GPIO_KEY = 0x0F; //⾼四位全部输出低电平,低四位输出⾼电平-->判断被按下的按钮所在的列if( GPIO_KEY != 0x0F ) { //有按键按下delay( 1110 ); //消除抖动if( GPIO_KEY != 0x0F ){switch( GPIO_KEY ){case0x07:key_value = 0; //矩阵第1列的按钮被按下break;case0x0B:key_value = 1; //矩阵第2列的按钮被按下break;case0x0D:key_value = 2; //矩阵第3列的按钮被按下break;case0x0E:key_value = 3; //矩阵第4列的按钮被按下break;}GPIO_KEY = 0xF0; //⾼四位输出⾼电平,低四位输出低电平-->判断被按下的按钮所在的⾏switch( GPIO_KEY ){case0x70:key_value = key_value; //矩阵第1⾏的按钮被按下break;case0xB0:key_value = key_value + 4; //矩阵第2⾏的按钮被按下break;case0xD0:key_value = key_value + 8; //矩阵第3⾏的按钮被按下break;case0xE0:key_value = key_value + 12; //矩阵第4⾏的按钮被按下break;}GPIO_DIG = character[key_value];//如果⼀直按下按键,等待500ms,强制退出while( ( count < 50 ) && ( GPIO_KEY != 0xF0 ) ) {count++;}}}}void main (){while( 1 ) {key_down();}}。
6.4 STM32F103ZET独立按键功能深入剖析(神舟王103)
6.4 独立按键 (2)6.1.1 按键的分类 (2)6.1.2 按键属性 (2)6.1.3 STM32的位带操作 (3)6.1.4 例程01 STM32芯片按键点灯(无防抖) (8)6.1.5 例程02 STM32芯片按键点灯-增加了防抖的代码 (13)6.4 独立按键6.1.1按键的分类目前,按键有多种形式。
有机械接触式,电容式,轻触式等。
1.按制作工艺分:硬板按键:带弹簧的按键焊接在印刷电路板上软板键盘:以导电橡胶作为接触材料放在以聚脂薄膜作为基底的印刷电路上所形成的按键。
2.按工艺原理分:可以将键盘分为编码键盘和非编码键盘,编码键盘的键盘电路内包含有硬件编码器,当按下某—个键后,键盘电路能直接提供与该键相对应的编码信息,例如ASCII码。
非编码键盘的键盘电路中只有较简单的硬件,采用软件来识别按下键的位置,并提供与按下键相对应的中间代码送主机,然后由软件将中间代码转换成相应的字符编码,例如ASCII码;非编码键盘主要靠软件编程来识别的,在单片机组成的各种系统中,用的较多的是非编码键盘。
非编码键盘又分为独立键盘和行列式(又称矩阵式)键盘。
6.1.2按键属性键盘实际上就是一组按键,在单片机外围电路中,通常用到的按键都是机械弹性开关,当开关闭合时,线路导通,开关断开时,线路断开,下图是几种单片机系统常见的按键:弹性小按键被按下时闭合,松手后自动断开;自锁式按键按下时闭合且会自动锁住,只有再次按下时才弹起断开。
单片机的外围输入控制用小弹性按键较好,单片机检测按键的原理是:单片机的I/O口既可作为输出也可作为输入使用,当检测按键时用的是它的输入功能,我们把按键的一端接地,另一端与单片机的某个I/O口相连,开始时先给该I/O口赋一高电平,然后让单片机不断地检测该I/O口是否变为低电平,当按键闭合时,即相当于该I/O口通过按键与地相连,变成低电平,程序一旦检测到I/O口变为低电平则说明按键被按下,然后执行相应的指令。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
/********************************************************************
* 文件名:独立按键.c
* 描述: 该程序实现独立按键的判断,按了相应的独立按键后,
会在数码管上显示最先被按下的值,只有按复位按键或者重新开电才消失。
* 创建人:2013年2月7日
* 版本号:1.0
* 杜邦线接法:
独立按键接法:
P3.2接J8的1端。
P3.3接J8的2端。
P3.4接J8的3端。
P3.5接J8的4端。
用8针排线把P0口和J12的1-8连接(P0.0接J12的1端)。
P2.0对应J13的8端。
***********************************************************************/
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit KEY1 = P3^2;
sbit KEY2 = P3^3;
sbit KEY3 = P3^4;
sbit KEY4 = P3^5;
//数码管的段码编码
uchar table[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
/********************************************************************
* 名称: Delay_1ms()
* 功能: 延时子程序,延时时间为1ms * x
* 输入: x (延时一毫秒的个数)
* 输出: 无
***********************************************************************/
void Delay_1ms(uint i)
{
uint x,j;
for(j=0;j<i;j++)
for(x=0;x<=148;x++);
}
/********************************************************************
* 名称: Delay()
* 功能: 实现按键功能,并在LED上显示
* 输入: 无
* 输出: 无
***********************************************************************/ uchar KEY(void)
{
if(KEY1==0 || KEY2==0 || KEY3==0 || KEY4==0)
{
Delay_1ms(20); //20毫秒软件防抖
if(KEY1 == 0)
{
while(1)
{
if(KEY1 == 1)
{
Delay_1ms(20);;
if(KEY1 == 1)
{
break;
}
}
}
return 1;
}
else if(KEY2 == 0)
{
while(1)
{
if(KEY2 == 1)
{
Delay_1ms(20);
if(KEY2 == 1)
{
break;
}
}
}
return 2;
}
else if(KEY3 == 0)
{
while(1)
{
if(KEY3 == 1)
{
Delay_1ms(20);
if(KEY3 == 1)
{
break;
}
}
}
return 3;
}
else if(KEY4 == 0)
{
while(1)
{
if(KEY4 == 1)
{
Delay_1ms(20);
if(KEY4 == 1)
{
break;
}
}
}
return 4;
}
}
return 0;
}
/********************************************************************
* 名称: Main()
* 功能: 实现按键控制LED的显示
* 输入: 无
* 输出: 无
***********************************************************************/ void Main(void)
{
uchar temp;
while(1)
{
temp = KEY(); //判断是否有按键按下
if(temp != 0)
{
break; //如果按下,那么退出循环}
}
P0 = table[temp]; //显示是哪个按键按下了P2 = 0xfe;
while(1); //程序停止
}。