自己写的按键单片机程序

合集下载

基于51单片机的数码管及键盘程序

基于51单片机的数码管及键盘程序

/*本程序功能:4*4按键,其中四个按键组成独立键盘,有加一减一和定时功能;另外十二个按键组成矩阵键盘,显示相应的编号。

*/#include<reg52.h>#define uchar unsigned char#define uint unsigned intuchar code duan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; uchar code wei[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};/*sbit key7=P3^7;sbit key6=P3^6;sbit key5=P3^5;sbit key4=P3^4;sbit key3=P3^3;sbit key2=P3^2;sbit key1=P3^1;sbit key0=P3^0;*/uchar temp,num,shi,ge;void delay(uint tms){uint i,j;for(i=tms;i>0;i--)for(j=110;j>0;j--);}void display(){shi=num/10;ge=num%10;P2=wei[2];P0=~duan[shi];P2=wei[3];P0=~duan[ge];delay(2);}/*void keyscan() //法①{key0=0;if(key4==0)P0=~duan[0];else if(key5==0)P0=~duan[4];else if(key6==0)P0=~duan[8];else if(key7==0)P0=~duan[12];delay(2);key0=1;key1=0;if(key4==0)P0=~duan[1];else if(key5==0)P0=~duan[5];else if(key6==0)P0=~duan[9];else if(key7==0)P0=~duan[13];delay(2);key1=1;if(key4==0)P0=~duan[2];else if(key5==0)P0=~duan[6];else if(key6==0)P0=~duan[10];else if(key7==0)P0=~duan[14];delay(2);key2=1;key3=0;if(key4==0)P0=~duan[3];else if(key5==0)P0=~duan[7];else if(key6==0)P0=~duan[11];else if(key7==0)P0=~duan[15];delay(2);key3=1;//这一句很重要,不要漏写}*/void init_t0()//法二{TMOD=0x01;TH0=(65536-46083)/256;TL0=(65536-46083)%256;EA=1;ET0=1;//TR0=1;}void timer0() interrupt 1{uchar count;TH0=(65536-46083)/256;TL0=(65536-46083)%256;count++;if(count==20){count=0;num++;if(num==60)num=0;}}void keyscan(){P1=0xfe;temp=P1;temp=temp&0xf0;if(temp!=0xf0){temp=P1;temp=temp&0xf0;delay(10);if(temp!=0xf0){temp=P1;switch(temp){case 0xee:num++;/* while(temp==0xee){temp=P1;}*/ //这几条语句也可用于检测按键是否释放;若没有temp=P1,则不正确break;case 0xde:if(num==0)num=60;num--;// while(temp!=0xde);break;case 0xbe:num=0;// while(temp!=0xbe);break;case 0x7e:TR0=~TR0;// while(temp==0x7e);break;}while(temp!=0xf0){temp=P1;temp=temp&0xf0;}}}P1=0xfd;temp=P1;temp=temp&0xf0;if(temp!=0xf0){temp=P1;switch(temp){case 0xed:num=1;break;case 0xdd:num=5;break;case 0xbd:num=9;break;case 0x7d:num=13;break;}}P1=0xfb;temp=P1;temp=temp&0xf0;if(temp!=0xf0){temp=P1;switch(temp){case 0xeb:num=2;break;case 0xdb:num=6;break;case 0xbb:num=10;break;case 0x7b:num=14;break; }}P1=0xf7;temp=P1;temp=temp&0xf0;if(temp!=0xf0){temp=P1;switch(temp){case 0xe7:num=3;break;case 0xd7:num=7;break;case 0xb7:num=11;break;case 0x77:num=15;break; }}}void main(){init_t0();while(1){keyscan();display();}}。

单片机按键程序的编写

单片机按键程序的编写
下面我们来看看多个按键的情况 吧
一般情况下,如果多个按键每个都直接接在单片机的 I/O 上的话会占用很多的 I/O 资源。比 较合理的一种做法是,按照行列接成矩阵的形式。按键接在每一个的行列的相交处。这样对 于 m 行 n 列的矩阵,可以接的按键总数是 m*n。这里我们以常见的 4*4 矩阵键盘来讲解矩阵 键盘的编程。
/******************************************
* 此模块所需相关支持库
*
******************************************/
#include"regx52.h"
#define uint8 unsigned char
#define uint16 unsigned int
bit bdata StartScan = 0 ;//此变量需放在定时中断中置位
else
{
//SHOW_ICON
}
}
}
每次执行读键盘函数时,只是对一些标志进行判断,然后退出。因此能够充分的利用 CPU 的资源。同时可以处理连发按键。此按键扫描按键函数可以直接放在主函数中。如果感觉按 键太过灵敏或者迟钝则改一下相关消抖动的宏定义即可。此函数也可以通过中断标志位进行 定时的扫描。此时,需要添加一个定时标志位,并将相关消抖动的和连击时间的宏定义改小 即可。然后在主程序类似下面这样写即可
这个流程是好多教科书上的做法。可惜,误导了好多人。为什么呢。因为它根本就没有考虑 实际情况。我们根据这幅流程图来写它的代码看看。
unsigned char v_ReadKey_f( void )
{
unsigned char KeyPress ;

51单片机使用状态机的键盘程序

51单片机使用状态机的键盘程序
break;
}
default://其它
{
step = _Key1_up;//单键抬起消抖
#define Key_Down 0x3D //下箭头
#define Key_Add 0x3B //加
#define Key_Sub 0x37 //减
#define Key_Enter 0x2F //回车
传入参数:无
返回参数:无
设 计:莫汉伟 amo73@
修改日期:2007-10-12
备 注:详细功能和处理算法请参照本文件相关的流程图和文档
**************************************************************************/
#define KeyBuffLen 8 //定义键值环形缓冲区长度为8(缓冲区大小可自由定义,只要大于0即可)
//定义一个键盘缓冲区结构体
struct Struct_KeyBoardBuff
{
u8 buff[KeyBuffLen];//键值环形缓冲区
u8 in; //写键值指示(定时器中断写)
u8 Read_Key(void)
{
u8 Value;
if(Key.out != Key.in)
{
Value=Key.buff[Key.out++];//"读"还没有追上"写",缓冲区有键值,读之
if(Key.out >= KeyBuffLen) //如果"读"跑到了队列尾部,则重新跳回原点
u8 out; //读键值指示(用户读)

stc单片机范例程序

stc单片机范例程序

stc单片机范例程序STC单片机范例程序STC单片机是一种常用的嵌入式系统开发工具,它具有体积小、功耗低、功能强大等特点,被广泛应用于各种电子设备中。

在使用STC单片机开发项目时,范例程序是非常重要的参考资料。

本文将介绍一些常见的STC单片机范例程序,以帮助读者更好地理解和应用STC单片机。

一、LED闪烁程序以下是一个简单的LED闪烁程序范例:```c#include <reg52.h>sbit LED = P1^0;void main(){while(1){LED = 0; // LED亮delay(500); // 延时500msLED = 1; // LED灭delay(500); // 延时500ms}}void delay(unsigned int count){unsigned int i, j;for(i = 0; i < count; i++)for(j = 0; j < 120; j++);}```该程序使用了P1口的第0位作为控制LED的引脚,通过不断改变LED的状态来实现LED的闪烁效果。

其中的delay函数用于延时一定的时间,以控制LED的亮灭频率。

二、按键检测程序以下是一个简单的按键检测程序范例:```c#include <reg52.h>sbit KEY = P2^0;sbit LED = P1^0;void main(){while(1){if(KEY == 0) // 检测按键是否按下{LED = 0; // LED亮}else{LED = 1; // LED灭}}}```该程序使用了P2口的第0位作为检测按键的引脚,当按键被按下时,LED亮起;当按键松开时,LED熄灭。

三、数码管显示程序以下是一个简单的数码管显示程序范例:```c#include <reg52.h>unsigned char code ledChar[] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90};sbit digit1 = P2^0;sbit digit2 = P2^1;sbit digit3 = P2^2;sbit digit4 = P2^3;void main(){unsigned char i = 0;while(1){P0 = ledChar[i]; // 在数码管上显示数字digit1 = 1; // 第1位数码管亮digit2 = 0; // 第2位数码管灭digit3 = 0; // 第3位数码管灭digit4 = 0; // 第4位数码管灭delay(10);P0 = ledChar[i]; // 在数码管上显示数字digit1 = 0; // 第1位数码管灭digit2 = 1; // 第2位数码管亮digit3 = 0; // 第3位数码管灭digit4 = 0; // 第4位数码管灭delay(10);P0 = ledChar[i]; // 在数码管上显示数字 digit1 = 0; // 第1位数码管灭digit2 = 0; // 第2位数码管灭digit3 = 1; // 第3位数码管亮digit4 = 0; // 第4位数码管灭delay(10);P0 = ledChar[i]; // 在数码管上显示数字 digit1 = 0; // 第1位数码管灭digit2 = 0; // 第2位数码管灭digit3 = 0; // 第3位数码管灭digit4 = 1; // 第4位数码管亮delay(10);i++;if(i == 10){i = 0;}}}void delay(unsigned int count){unsigned int i, j;for(i = 0; i < count; i++)for(j = 0; j < 120; j++);}```该程序使用了P0口作为数码管的控制引脚,通过改变P0口的输出来控制数码管显示不同的数字。

单片机2个按键互锁c语言程序,单片机按键点动互锁程序源程序

单片机2个按键互锁c语言程序,单片机按键点动互锁程序源程序

单片机2个按键互锁c语言程序,单片机按键点动互锁程序源程序如何编写一个单片机按键点动互锁的C语言程序?单片机按键点动互锁是一种常见的应用场景,通过编写相关的C语言程序可以实现按键的互锁功能。

在这篇文章中,我将一步一步地回答如何编写这样一个程序。

首先,我们需要了解一些基本概念和原理。

单片机是一种集成电路,可以实现各种功能。

按键是一种输入设备,通常用于接收用户的输入信号。

点动是指按下按钮后立即释放按钮。

互锁是指两个或多个按键之间的相互作用,在某一个按键按下的同时,其他按键是不能按下的。

接下来,我们就可以开始编写程序了。

第一步,我们需要定义端口和引脚的初始状态。

在单片机中,端口是一组相邻的IO引脚,我们可以将某个引脚设为输入或输出。

在这个程序中,我们需要将两个按键连接到单片机的两个不同的引脚上,并将这两个引脚设为输入。

C#include <reg51.h>sbit button1 = P1^0;sbit button2 = P1^1;其中,sbit关键字用于定义一个特殊的数据类型,表示单片机的一个引脚。

第二步,我们需要实现一个延时函数,用于保证按键被稳定地读取。

由于单片机的执行速度非常快,如果没有延时函数,可能会导致按键抖动。

Cvoid delay(unsigned int k){unsigned int i, j;for(i = 0; i < k; i++)for(j = 0; j < 123; j++);}第三步,我们需要编写一个函数用于检测按键的状态。

在这个函数中,我们将使用一个while循环来检测按键是否被按下。

Cunsigned char button_pressed(){while(1){if(button1 == 0){delay(10); 延时10msif(button1 == 0){while(button1 == 0); 等待按键释放return 1; 返回按键1被按下的状态}}if(button2 == 0){delay(10); 延时10msif(button2 == 0){while(button2 == 0); 等待按键释放return 2; 返回按键2被按下的状态}}}}在这个函数中,我们首先检测按键1的状态,如果按键1被按下,延时一段时间后再次检测按键1的状态,如果按键1仍然被按下,则返回按键1被按下的状态。

单片机程序设计范文

单片机程序设计范文

单片机程序设计范文单片机程序设计是指利用单片机进行程序编程开发,实现各种功能或控制操作的过程。

单片机是一种微型计算机系统,它具有CPU、内存、输入输出接口等基本组成部分,并且集成在一个芯片上。

单片机程序设计是利用这种芯片进行软件开发,从而实现各种应用需求。

在进行单片机程序设计时,需要掌握一些基本的知识和技巧。

首先,需要了解硬件系统的基本结构和功能,包括CPU、存储器、输入输出接口等。

其次,需要熟悉单片机的指令集和编程语言,如汇编语言或C语言等。

此外,还需要了解各种外设的接口和控制方法,如LED灯、数码管、按键等。

单片机程序设计的流程主要包括以下几个步骤:分析需求、设计框架、编写代码、调试测试和优化改进。

首先,要对需求进行分析,明确所需实现的功能和控制要求。

然后,根据需求设计单片机系统的框架,包括硬件连接和软件模块划分。

接着,根据设计完成编程工作,编写相应的代码。

编写代码时,需要考虑到系统的实时性、稳定性和可扩展性等方面。

编写完成后,需要进行调试测试,确保系统正常运行和实现预期功能。

最后,还需要对系统进行优化改进,提高性能和稳定性。

在实际的单片机程序设计中,有很多经典的案例和实践经验可以借鉴。

例如,LED灯的闪烁控制、数码管的显示操作、按键的响应等。

通过学习这些案例,可以更好地理解和掌握单片机程序设计的基本思路和方法。

此外,还可以通过参加单片机比赛、实践项目等方式提升编程能力和设计水平。

单片机程序设计具有很广泛的应用领域。

例如,工业控制领域中,可以利用单片机实现各种自动化控制系统。

在家电领域中,可以运用单片机实现智能化、联网化的产品功能。

在通信领域中,可以使用单片机实现各种数据处理和通信控制功能。

此外,还可以利用单片机设计各种嵌入式系统、物联网设备等。

总之,单片机程序设计是一项重要的技术和领域,对于电子工程师和计算机科学家来说具有重要的意义和价值。

通过系统学习和实践,可以掌握单片机程序设计的基本理论和实践技巧,进而应用到实际项目中,为社会和经济发展做出贡献。

单片机经典长短按程序

单片机经典长短按程序

新型的按键扫描程序不过我在网上游逛了很久,也看过不少源程序了,没有发现这种按键处理办法的踪迹,所以,我将他共享出来,和广大同僚们共勉。

我非常坚信这种按键处理办法的便捷和高效,你可以移植到任何一种嵌入式处理器上面,因为C语言强大的可移植性。

同时,这里面用到了一些分层的思想,在单片机当中也是相当有用的,也是本文的另外一个重点。

对于老鸟,我建议直接看那两个表达式,然后自己想想就会懂的了,也不需要听我后面的自吹自擂了,我可没有班门弄斧的意思,hoho~~但是对于新手,我建议将全文看完。

因为这是实际项目中总结出来的经验,学校里面学不到的东西。

以下假设你懂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; // 1Trg = ReadData & (ReadData ^ Cont); // 2Cont = ReadData; // 3}完了。

有没有一种不可思议的感觉?当然,没有想懂之前会那样,想懂之后就会惊叹于这算法的精妙!!下面是程序解释:Trg(triger)代表的是触发,Cont(continue)代表的是连续按下。

1:读PORTB的端口数据,取反,然后送到ReadData 临时变量里面保存起来。

2:算法1,用来计算触发变量的。

一个位与操作,一个异或操作,我想学过C 语言都应该懂吧?Trg为全局变量,其它程序可以直接引用。

按键程序

按键程序
我用C51做的键盘程序,望大家批砖
作者:hexiaoxiao栏目:单片机
我用C51做的键盘程序,望大家批砖
该程序没有被仿真过,可能有一些错误.不过编译是;intrins.h>
#include<reg51.h>
#define uCHAR unsigned CHAR
if(state!=0x0F) //&Oacute;&ETH;&frac14;ü°&acute;&Iuml;&Acirc;
{
SWITCH(state)
{
case 0x0E:
key=(0x4-i)*0x4+0x1;
break;
case 0x0D:
key=(0x4-i)*0x4+0x2;
break;
case 0x0B:
{
delayms();
if((P0&0x0f)!=0x0f) //确认有键按下
{
for(i=0;i<4;i++) //扫描4行
{
P0=m; //从P0.4=0(第一行)开始扫描
if(KEY_A==0) //列1有效
{
h=h+1; //算出列1键盘值
flag0=1;
while(KEY_A==0) //等待按键松开
11楼:>>参与讨论
作者:fushaobing于2005-4-15 17:32:00发布:
--------------------------------------------------------------------------------
TO xwj:
你的意思是不是这样:把键盘扫描放在定时中断子程序中(定时周期约10ms),可以用两次中断的时间间隔来去抖动,可以引入“键龄”的概念来实现连击的处理(在中断中使键龄减1)。例如,如果设“键龄=25”,则每25*10=250ms操作一次按键。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

自己写的按键单片机程序
用4个按键来控制数码管显示的内容#include#define duan P0//段选#define wei P2//位选unsigned char code wei1[8] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//位选控制查表的方法控制unsigned char code duan1[17] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0 x71};//0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F的显示码unsigned char ge,shi,bai,a,b;sbit key1=P1;sbit key2=P1 ;sbit key3=P1 ;sbit key4=P1 ;void keys();//按键函数void s(unsigned char xms);//延时函数void DigDisplay(); //动态显示函数void init(); //初始化函数void main(void){init(); while(1){DigDisplay();keys();} }void DigDisplay(){unsigned char i;unsigned int j;bai=a/100;shi=a%100/10;ge=a%10;i=0;wei = wei1[i];//发送位选duan = duan1[bai]; //发送段码j = 10;//扫描间隔时间设定while(j--);duan = 0x00; //消隐i++;wei = wei1[i];//发送位选duan = duan1[shi]; //发送段码j = 10;//扫描间隔时间设定while(j--);duan = 0x00; //消隐i++;wei = wei1[i];//发送位选duan = duan1[ge]; //发送段码j = 10;//扫描间隔时间设定while(j--);duan = 0x00; //消隐}void init() {key1=1;key2=1;key3=1;key4=1;TMOD=0X01;TH0=(65536-
45872)/256;TL0=(65536-45872)%256;EA=1;ET0=1;}void s(unsigned char xms){unsigned char x,y;for(x=xms;x>0;x--)for(y=110;y>0;y--);}void times() interrupt 1{TH0=(65536-45872)/256;TL0=(65536-45872)%256;b++;if(b==20){b=0;a++;if(a==256){a=0;}}}void
keys(){if(key1==0){s(10);if(key1==0){a++;TR0=0;if(a==256)a=0;while(!key1)Dig Display();}}if(key2==0){s(10);if(key2==0){TR0=0;if(a==0)a=256;a--。

相关文档
最新文档