msp430矩阵键盘c代码

msp430矩阵键盘c代码
msp430矩阵键盘c代码

基于msp430f249的4*4矩阵键盘c代码

采用查询方式获取键值,P3口键盘输入,P1口把0~15的16进制(0~f)形式送到一位共阴数码管显示(2014.11.25)

代码:

#include

#define uchar unsigned char

#define uint unsigned int

void delay(uchar n)

{

uchar x;

while(n--)

for(x=110;x;x--);

}

void IO_init()

{

P3DIR=0x0f;

P3OUT=0x00;

}

uchar key_putdown()

{

uchar putdown=0;

P3OUT=0x00;

while(1)

{

if((P3IN&0xf0)!=0xf0)

{

delay(10);

if((P3IN&0xf0)!=0xf0)

{

putdown=1; //有键按下为1,否则为0

break;

}

}

}

return putdown;

}

uchar key_scan(uchar n)

{

uchar hang,lie,key_value,i;

uchar keysweepcode[4]={0x0e,0x0d,0x0b,0x07}; //键盘扫描码,用来扫描每一行,当某一行等于0的同时有一列也等于0时即可确定是哪个键被按下了

if(n==1)

for(i=0;i<4;i++)

{

P3OUT=keysweepcode[i];

hang=keysweepcode[i];

if((P3IN&0xf0)!=0xf0)

{

lie=P3IN&0xf0;

key_value=hang|lie;

break;

}

}

return key_value;

}

uchar key_process(uchar n)

{

uchar key_jianzhi; //返回键值

switch(n)

{

case 0xee:key_jianzhi=0;break;

case 0xde:key_jianzhi=1;break;

case 0xbe:key_jianzhi=2;break;

case 0x7e:key_jianzhi=3;break;

case 0xed:key_jianzhi=4;break;

case 0xdd:key_jianzhi=5;break;

case 0xbd:key_jianzhi=6;break;

case 0x7d:key_jianzhi=7;break;

case 0xeb:key_jianzhi=8;break;

case 0xdb:key_jianzhi=9;break;

case 0xbb:key_jianzhi=10;break;

case 0x7b:key_jianzhi=11;break;

case 0xe7:key_jianzhi=12;break;

case 0xd7:key_jianzhi=13;break;

case 0xb7:key_jianzhi=14;break;

case 0x77:key_jianzhi=15;break;

}

return key_jianzhi; //得到被按下的键的键值}

void main()

{

uchar table[]=

{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

uchar key;

IO_init();

P1DIR=0xff;

while(1)

{

key=key_process(key_scan(key_putdown()));

P1OUT=table[key];

}

}

电子琴C程序代码,四乘四矩阵键盘输入

电子琴C程序代码,四乘四矩阵键盘输入#include #define uchar unsigned char #define uint unsigned int sbit duan=P 2八6; sbit wei=P 2八7; sbit bee=P 2八3; uchar code table[]={ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71}; uchar code tablewe[]={ 0x7f,0xbf,0xdf,0xef, 0xf7,0xfb,0xfd,0xfe}; uchar disp[16]={0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71}; // 在里面输入按下键值为0~15 对应要显示的第一位码值uchar disp1[16]={0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71,0x3f}; // 在里面输入按下键值为0~15 对应要显示的第二位码值unsigned char temp; unsigned char key; unsigned char i,j;

unsigned char STH0; unsigned char STL0; unsigned int code tab[]={ //63625, 63833, 64019, 64104, 64260, 64400, 64524 ,// 低音区:1 2 3 4 64580, 64685, 64778, 64820, 64898, 64968, 65030 ,// 中音区:1 2 3 4 5 65058, 65110, 65157, 65178, 65217, 65252, 65283 ,// 高音区:1 2 3 4 5 65297 ,// 超高音:1 }; // 音调数据表可改 void delay(uchar x) uchar y,z; for(y=x;y>0;y--) for(z=0;z<110;z++); void init() TMOD=0x01; ET0=1; EA=1; void display() { for(i=0;i<2;i++)

msp430g2553的矩阵按键程序

IAR环境下的程序! 矩阵按键在单片机设计中经常见到,下面给大家几个程序!如果有需求可以看看!矩阵按键,扫描 下面程序是淘来的! #include /***************全局变量***************/ unsigned char Key_V al; //存放键值 void CtrlKey(unsigned char sw); //控制键盘开关//sw=0关sw=1开 /******************************************* 函数名称:Init_Keypad 功能:初始化扫描键盘的IO端口 参数:无 返回值:无 ********************************************/ void Init_Keypad(void) { P1DIR = 0x0f; //P1.0~P1.3设置为输出状态,P1.4~P1.7输入状态(上拉H) P1OUT=0; P1IES =0xf0; //P1.4~P1.7允许中断 P1IE =0xf0; //P1.4~P1.7下降沿触发中断 P1IFG=0; //中断标志清0 Key_V al = 0; } /******************************************* 函数名称:Check_Key 功能:扫描键盘的IO端口,获得键值 参数:无 返回值:无 ********************************************/ //p14\5\6\7 接上拉电阻 /*************************************** key_V al 对应键值 列:[p14] [p15] [p16] [p17] ↓↓↓↓ 行: [p13]→ 1 2 3 4 [p12]→ 5 6 7 8 [p11]→9 10 11 12 [p10]→13 14 15 16 ***************************************/ void Check_Key(void) { unsigned char row ,col,tmp1,tmp2;

矩阵键盘电路设计

课程设计 题目矩阵键盘电路设计教学院计算机学院 专业计算机应用技术班级 姓名 指导教师 2010 年01 月12 日

前言.................................................................... 第一章需求分析......................................................... 功能描述......................................................... 功能分析......................................................... 第二章系统的原理及分析................................................. 用到的知识点的介绍,知识点使用的总体思路 第三章详细设计......................................................... 硬件设计 系统结构图,元器件的选择等 软件设计 所设计的软件关键模块的程序流程 第四章测试............................................................ 运行结果分析等 第五章总结............................................................. 参考文献................................................................ 附录 关键程序代码........................................................

基于MSP430G2553的按键测试程序

基于msp430G2系列的按键测试程序本程序有扫描和中断两种方式,代码均附后。 4、4×1独立按键实验 (1)4×1键盘1:扫描数码管显示 (2)4×1键盘2:中断数码管显示 (3)4×1键盘3:控制LED (4)4×1键盘4:控制蜂鸣器 5、4×4矩阵键盘实验 (1)4×4键盘1:行列扫描数码管显示 (2)4×4键盘2:行列扫描1602液晶显示 3)4×4键盘3:控制LED蜂鸣器 #include #define BUTTON BIT3 #define LED_RED BIT0 #define LED_GREEN BIT6 #define LED_DIR P1DIR #define BUTTON_DIR P1DIR #define BUTTON_OUT P1OUT #define LED_OUT P1OUT #define BUTTON_REN P1REN #define BUTTON_ON (P1IN&BIT3) #define BUTTON_OFF !(P1IN&BIT3) #define LED_RED_ON() P1OUT|=BIT0 #define LED_RED_OFF() P1OUT&=~BIT0 #define LED_GREEN_ON() P1OUT|=BIT6 #define LED_GREEN_OFF() P1OUT&=~BIT6 volatile unsigned char i=0,flag=0; void main(void) { WDTCTL = WDTPW + WDTHOLD; BUTTON_DIR &= ~BUTTON; LED_DIR |= LED_RED+LED_GREEN; BUTTON_REN |= BUTTON; BUTTON_OUT = BUTTON; while(1) { /*通过按键改变选择标志位*/

MSP430单片机的4X4矩阵键盘C语言程序

MSP430单片机的4X4矩阵键盘C语言程序 #include #define uchar unsigned char#define uint unsigned int uchar table[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; void delay(unsigned int i) //延时子程序{while(i--);} uchar keyvalue(){ uchar key; uchar np10,np11,np12,np13; P1DIR=0x0f;//第一排P1OUT=~BIT3; delay(10); np10=P1IN&BIT4; if(np10==0) { key=0; } np11=P1IN&BIT5; if(np11==0) { key=1; } np12=P1IN&BIT6; if(np12==0) { key=2; } np13=P1IN&BIT7; if(np13==0) { key=3; } //第二行P1OUT=~BIT2; delay(10); np10=P1IN&BIT4; if(np10==0) { key=4; } np11=P1IN&BIT5; if(np11==0) { key=5; } np12=P1IN&BIT6; if(np12==0) { key=6; } np13=P1IN&BIT7; if(np13==0) { key=7; } //第三行P1OUT=~BIT1; delay(10); np10=P1IN&BIT4; if(np10==0) { key=8; } np11=P1IN&BIT5; if(np11==0) { key=9; } np12=P1IN&BIT6; if(np12==0) { key=10; } np13=P1IN&BIT7; if(np13==0) { key=11; } //第四行P1OUT=~BIT0; delay(10); np10=P1IN&BIT4; if(np10==0) { key=12; } np11=P1IN&BIT5; if(np11==0) { key=13; } np12=P1IN&BIT6; if(np12==0) { key=14; } np13=P1IN&BIT7; if(np13==0) { key=15; } P1OUT=0X00; return key; while(1) { if((P1IN&0X0F)==0x0f) break; }} void main(){ uchar key_value; WDTCTL=WDTPW+WDTHOLD; P1DIR=0X0F; P2DIR=0XFF; P2OUT=0XFF; while(1) { if((P1IN&0XF0)!=0XF0) { delay(100); if((P1IN&0XF0)!=0XF0) { delay(100); if((P1IN&0XF0)!=0XF0) { key_value=keyvalue(); } } } P2OUT=~key_value; }} tips:感谢大家的阅读,本文由我司收集整编。仅供参阅!

基于MSP430实现的步进电机控制

作品概述 第一节基本情况 MSP430G2系列Launchpad是TI推出的一款低成本的开发平台。它适用于适用于TI 最新MSP430G2xx 系列产品,其基于USB 的集成型仿真器可提供为全系列MSP430G2xx 器件开发应用所必需的所有软、硬件。本作品选择MSP430G2231为Launchpad核心板的单片机,采用Launchpad核心板加底板的形式,实现了对步进电机的四相四拍和四相八拍控制,并实现了转动方向和转动速度的控制,并且用数码管显示转动方向和转动速度的百分比。 第二节软硬件总体设计方案 本作品选择MSP430G2231为Launchpad核心板的单片机,采用Launchpad 核心板加底板的形式,对步进电机进行控制。滑变,即滑动变阻器,用来控制电机的转速,本系统共有两个拨动按键,一个拨动按键用来选择步进电机的模式,如四相八拍或四相四拍,另一个拨动按键用来控制转动方向。数码管可用来显示模式和方向,以及转速的百分比。系统总体设计框图如下 图1.2.1 系统总体设计框图 在硬件设计时,只需设计外围电路,留出与Launchpad核心板的接口即可,既节约了设计时间,又节省了成本,而且无需额外购买仿真器,从而使设计成本

到达最低。 在软件设计方面,可充分利用G2系列单片机的各个功能模块,如时钟系统、TA定时器、ADC10模数转换器,看门狗,以及IO口中断等资源,设计出高效率、低功耗、结构紧凑而又功能强大的产品。

第一章作品硬件系统设计 第一节MSP430G2系列Launchpad开发板组成及硬件资源情况介绍MSP430G2系列Launchpad是TI推出的一款低成本的开发平台。它适用于适用于TI 最新MSP430G2xx 系列产品,其基于USB 的集成型仿真器可提供为全系列MSP430G2xx 器件开发应用所必需的所有软、硬件。LaunchPad 具有集成的DIP 目标插座,可支持多达20 个引脚,从而使MSP430 Value Line 器件能够简便地插入LaunchPad 电路板中。此外,其还可提供板上Flash 仿真工具,以直接连接至PC 轻松进行编程、调试和评估。LaunchPad 试验板还能够对eZ430-RF2500T 目标板、eZ430-Chronos 手表模块eZ430-F2012T/F2013T 目标板进行编程。此外,它还提供了从MSP430G2xx 器件到主机PC 或相连目标板的9600 波特UART 串行连接。其实物图如图2.1所示。 图2.1.1 MSP430G2系列Launchpad开发板实物图 MSP430G2系列Launchpad开发板硬件资源: ? USB 调试与编程接口无需驱动即可安装使用,且具备高达9600 波特的

矩阵键盘的工作原理和扫描确认方式

9.3.1 矩阵键盘的工作原理和扫描确认方式 来源:《AVR单片机嵌入式系统原理与应用实践》M16华东师范大学电子系马潮 当键盘中按键数量较多时,为了减少对I/O 口的占用,通常将按键排列成矩阵形式,也称为行列键盘,这是一种常见的连接方式。矩阵式键盘接口见图9-7 所示,它由行线和列线组成,按键位于行、列的交叉点上。当键被按下时,其交点的行线和列线接通,相应的行线或列线上的电平发生变化,MCU 通过检测行或列线上的电平变化可以确定哪个按键被按下。 图9-7 为一个 4 x 3 的行列结构,可以构成12 个键的键盘。如果使用 4 x 4 的行列结构,就能组成一个16 键的键盘。很明显,在按键数量多的场合,矩阵键盘与独立式按键键盘相比可以节省很多的I/O 口线。 矩阵键盘不仅在连接上比单独式按键复杂,它的按键识别方法也比单独式按键复杂。在矩阵键盘的软件接口程序中,常使用的按键识别方法有行扫描法和线反转法。这两种方法的基本思路是采用循环查循的方法,反复查询按键的状态,因此会大量占用MCU 的时间,所以较好的方式也是采用状态机的方法来设计,尽量减少键盘查询过程对MCU 的占用时间。 下面以图9-7 为例,介绍采用行扫描法对矩阵键盘进行判别的思路。图9-7 中,PD0、PD1、PD2 为3 根列线,作为键盘的输入口(工作于输入方式)。PD3、PD4、PD5、PD6 为4根行线,工作于输出方式,由MCU(扫描)控制其输出的电平值。行扫描法也称为逐行扫描查询法,其按键识别的过程如下。 √将全部行线PD3-PD6 置低电平输出,然后读PD0-PD2 三根输入列线中有无低电平出现。只要有低电平出现,则说明有键按下(实际编程时,还要考虑按键的消抖)。如读到的都是高电平,则表示无键按下。 √在确认有键按下后,需要进入确定具体哪一个键闭合的过程。其思路是:依

51单片机矩阵键盘的C语言程序与分析

51单片机矩阵键盘的C语言程序与分析 2009-10-17 19:25 学习51单片机矩阵键盘时,我有点迷乱了,不知道是怎样处理的,经过仔细分析电路,然后终于明白其中的原理,这样的话,再看程序,就是那样的简单了。。 首先看一下电路图是怎样连接的,我买的开发板上是AT89S52单片机,矩阵键盘在P3口。接法如下图: 当然上面的图的意思是P3.1~P3.3 跟P3.4~P3.7不一样的,他们是相互连接(当按下键时),组成4*4=16个键的。

如果给P3一个扫描初值的话:如0x0F ,则没有键按下时为: P3.1~P3.3为1,P3.4~P3.7为0。 如果有键按下,则情况发生变化:高电平接入低电平:如P3.3与P3.7连接的键按下,则P3.3与P3.7为0,即接地了。 则P3此时为:0000 0111,这时如果用P3&0x0F,则高四位为0,低四位保留,可以得到低四位的内容了。 通过去抖操作,即一个delay,可以得到低四位内容。这里设为:h=P3&0x0F; 如果再得到高四位内容,则可以组成一个数,来定位哪个键了。 用P3=h|0xF0;这会出现什么情况呢?1|0=1 1| 1 =1,这里难道高四位全置1 吗?不是的,当赋值后,如果有键按下的话,P3高四位不会全为1111,被拉到0了。如P3.3与P3.7连接的键按下,则P3.3与P3.7为0,即接地了。即:0111 0111,&F0之后,得到0111 0000,这样的话,我们得到高四位的值了, 用高四位+低四位,就可以得到一个数值,确定一个键。 下面看看人家编写的程序,相信不是太难了吧。 //keyboard.c 这里的行与列的扫描,也就是把字节的8位,高四位与低四位分开来,从而确定坐标。 //行列扫描程序,可以自己定义端口和扫描方式,这里做简单介绍 #include //包含头文件 #define uchar unsigned char #define uint unsigned int unsigned char const dofly[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f, 0x77,0x7c,0x39,0x5e,0x79,0x71};//0-F,数码管来显示按下键的值。 uchar keyscan(void); //主要的矩阵键盘扫描函数。 void delay(uint i); void main() { uchar key; P2=0x00;//1数码管亮按相应的按键,会显示按键上的字符 while(1) { key=keyscan();//调用键盘扫描,

msp430控制步进电机实验报告

计算机硬件应用课程设计

一、实验内容及要求 题目:步进电机控制设计 使用单片机为核心,设计一个步进电机控制器。 基本要求:使用单片机为控制核心,编写程序并设计硬件结构,实现对步进电机 的控制。步进电机按固定方向连续转动。对电机的运行方向进行控制,如:要求按下A 键时,能够控制步进电机正转;按下B键时,能够控制步进电机反转。 提高要求(选作):用LED数码管显示步进电机的转动状态;增加启动、停止控制按键。 二、小组成员 三、实验软硬件环境简介 硬件环境:MSP430G2553单片机一块,五线四相步进电机一个,驱动芯片ULN2003一块,开关三个,下载线一根。 软件设计:仿真软件PROTEUS 8.0 Professional;代码编写软件IAR;WINDOWS操作系统。 四、设计方案分析 步进电机是一种能够将电脉冲信号转换成角位移或线位移的机电设备,它实际上是一种单相或多相同步的步进电机。单相步进电机由单路电脉冲驱动,输出功率一般很小,故需要加一个驱动电路。当向脉冲分配器输入一个脉冲时,电动机各相的通电状态就会发生改变,转子会转过一定的角度(称为步距角)。正常情况下,步进电机转过的总角度和输入法的脉冲数成正比;连续输入一定频率的脉冲时,电动机的转速与输入脉冲的频率保持严格的对应关系,不受电压波动和负载变化的影响。 步进电机的不同驱动方式,都是在工作时,脉冲信号按一定顺序轮流加到三相绕组上,从而实现不同的工作状态。步进电机有三线式、五线式、六线式三种,但其控制方式均相同,都必须以脉冲电流来驱动。若每转一圈以20个励磁信号来计算,则每个励磁信号前进18°,其旋转角度与脉冲数成正比,正反转可以由脉冲顺序来控制。 步进电机的励磁方式可分为全部励磁及半步励磁,其中全部励磁又有1相励磁及2相励磁之分,而半步励磁又称为1-2相励磁。 1相励磁法:在每一瞬间只有一个线圈导通。消耗电力小,精确度良好,但转矩小,振动较大,每一励磁信号可走18°。若以1相励磁法控制步进电机正转,其励磁顺序表如下。若以励磁信号反响传送,则步进电机反转。本实验中采用这个方法。

矩阵键盘程序c程序,51单片机.

/*编译环境:Keil 7.50A c51 */ /*******************************************************/ /*********************************包含头文件********************************/ #include /*********************************数码管表格********************************/ unsigned char table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x 8E}; /**************************************************************************** 函数功能:延时子程序 入口参数: 出口参数: ****************************************************************************/ void delay(void) { unsigned char i,j; for(i=0;i<20;i++) for(j=0;j<250;j++); } /**************************************************************************** 函数功能:LED显示子程序 入口参数:i 出口参数: ****************************************************************************/ void display(unsigned char i) { P2=0xfe; P0=table[i]; } /**************************************************************************** 函数功能:键盘扫描子程序 入口参数: 出口参数: ****************************************************************************/ void keyscan(void) { unsigned char n; //扫描第一行 P1=0xfe;

msp430 按键控制LED 最基本程序

按键篇 经过一短时间的学习,下面,亲自动手编写一下程序吧。 程序的目的是:按下按键,控制LED的亮和灭。短按键,则小灯亮1秒,然后灭;长按键,小灯常亮。 首先,完成键盘的扫描程序。 第一点:如果是扫描,就要用到定时器。我想设计定时器每隔10ms扫描一次按键。 定时器,我选用定时器A。它的定时中断函数如下: 函数名称:TimerA_ISR 功能:定时器A的中断服务函数 参数:无 返回值:无 ********************************************/ #pragma vector = TIMERA0_VECTOR __interrupt void TimerA_ISR(void) { GetKey(); } 上面这个定时中断函数的意思就是:每当定时时间到了以后,就调用GetKey()函数一次。GetKey()函数就是扫描键盘按键的函数了。在GetKey()函数中,会根据按键类型(长按/短按)返回不同的数值。根据返回的数值,做小灯亮法的操作。那么,返回的这个值,我们需要保存在一个变量中,在这里定义一个变量ucharFlagLcd ; 来保存返回值。这个变量在全局变量中定义,以保证它的作用域。 那么定时函数就变为 #pragma vector = TIMERA0_VECTOR __interrupt void TimerA_ISR(void) { FlagLcd =GetKey(); } 定时器中断的时间间隔,我在主函数中定义。 这样写: CCTL0 = CCIE; //使能CCR0中断 CCR0 = 40; //设定周期0.01S TACTL = TASSEL_1 + ID_3 + MC_1; //定时器A的时钟源选择ACLK,增计数模式 这样,定时器这块就算完工了。那么,下面进行按键扫描程序。

实验一矩阵键盘检测

一、实验目的: 1、学习非编码键盘的工作原理和键盘的扫描方式。 2、学习键盘的去抖方法和键盘应用程序的设计。 二、实验设备: 51/AVR实验板、USB连接线、电脑 三、实验原理: 键盘接口电路是单片机系统设计非常重要的一环,作为人机交互界面里最常用的输入设备。我们可以通过键盘输入数据或命令来实现简单的人机通信。 1、按键的分类 一般来说,按键按照结构原理可分为两类,一类是触点式开关按键,如机械式开关、导电橡胶式开关等;另一类是无触点式开关按键,如电气式按键,磁感应按键等。前者造价低,后者寿命长。目前,微机系统中最常见的是触点式开关按键(如本学习板上所采用按键)。 按键按照接口原理又可分为编码键盘与非编码键盘两类,这两类键盘的主要区别是识别键符及给出相应键码的方法。编码键盘主要是用硬件来实现对键的识别,非编码键盘主要是由软件来实现键盘的识别。 全编码键盘由专门的芯片实现识键及输出相应的编码,一般还具有去抖动和多键、窜键等保护电路,这种键盘使用方便,硬件开销大,一般的小型嵌入式应用系统较少采用。非编码键盘按连接方式可分为独立式和矩阵式两种,其它工作都主要由软件完成。由于其经济实用,较多地应用于单片机系统中(本学习板也采用非编码键盘)。 2、按键的输入原理 在单片机应用系统中,通常使用机械触点式按键开关,其主要功能是把机械上的通断转换成为电气上的逻辑关系。也就是说,它能提供标准的TTL 逻辑电平,以便与通用数字系统的逻辑电平相容。此外,除了复位按键有专门的复位电路及专一的复位功能外,其它按键都是以开关状态来设置控制功能或输入数据。当所设置的功能键或数字键按下时,计算机应

单片机矩阵键盘检测程序并用数码管显示c语言程序

#include #define uint16 unsigned int #define uint8 unsigned char //控制数码管段选锁存口 sbit P3_7=P3^7; //共阴数码管显示 uint8 code table[]={0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71,0}; uint8 temp; uint16 num; //延时子函数 void delay(uint16 z) { uint16 x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } //子函数声明 uint8 keyscan(); void display(uint8);

void main() { num=17; while(1) { display(keyscan()); } } void display(uint8 num1) { P2=0xf8; P3_7=1; P0=table[num1-1]; P3_7=0; } uint8 keyscan() { P1=0xfe; temp = P1;

temp=temp&0xf0; while(temp!=0xf0) { delay(5); temp=P1; temp=temp&0xf0; while(temp!=0xf0) { temp=P1; switch(temp) { case 0xee:num=1;break; case 0xde:num=2;break; case 0xbe:num=3;break; case 0x7e:num=4;break; default:break; } while(temp!=0xf0)//检测按键是否放开 { temp=P1; temp=temp&0xf0; }

经典的矩阵键盘扫描程序

键盘是单片机常用输入设备,在按键数量较多时,为了节省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左移一位 } } } } //结束 这是一种比较经典的矩阵键盘识别方法,实现起来较为简单,程序短小精炼。

基于C51单片机矩阵键盘控制蜂鸣器的应用

学校代码 10126 学号科研创新训练论文 题目基于C51单片机的蜂鸣器和流水灯的 应用 院系内蒙古大学鄂尔多斯学院 专业名称自动化 年级 2013 级 学生姓名高乐 指导教师高乐奇 2015年06月20日

基于C51单片机的蜂鸣器和流水灯的应用 摘要 当今时代是一个新技术层出不穷的时代,在电子领域尤其是自动化智能控制领域,传统的分立元件或数字逻辑电路构成的控制系统,正以前所未见的速度被单片机智能控制系统所取代。单片机具有体积小、功能强、成本低、应用面广等优点,可以说,智能控制与自动控制的核心就是单片机。本文介绍了单片机的发展及应用,和基于单片机的蜂鸣器和流水灯的知识及应用,还介绍了此次我所设计的课题。 关键词:C-51单片机,控制系统,流水灯,蜂鸣器,程序设计

The application of buzzer and flowing water light based on C51 MCU Author:GaoLe Tutor:GaoLeQi Abstract This age is a new technology emerge in endlessly era, in the electronic field especially automation intelligent control field, the traditional schism components or digital logic circuit, is composed of control system with unprecedented speed was replaced by micro-controller intelligent control system. SCM has small, strong function, low cost, etc, it can be said that wide application, intelligent control and automatic control core is the micro-controller.This article introduces the MCU development and application,the knowledge and application of buzzer and flowing water light based on MCU,then introduces the task I have designed this time. Keyword:C51 micro-controller,control system,flowing water light,buzzer ,programming

STM32-矩阵键盘程序4×4

/*--------------------------------------------------------------------------------------* 矩阵键盘驱动 * 文件: keyboard.c * 编写人:LiuHui * 描述:扫描4x4 矩阵键盘输入,并返回键值 * 适用范围:驱动采用ST3.5 库编写,适用于STM32F10x 系列单片机 * 所用引脚:PA0-PA7 * 编写时间:2014 年5 月20 日 --------------------------------------------------------------------------------------*/ #include "stm32f10x.h" #include "keyboard.h" #include "dealy.h" /*--------------------------------矩阵键盘初始化----------------------------------------* 功能:初始化stm32 单片机GPIO //PA0-PA7 * 参数传递: * 输入:无 * 返回值:无 --------------------------------------------------------------------------------------*/ void KeyBoard_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_SetBits(GPIOA, GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3); GPIO_ResetBits(GPIOA, GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7); } /*------------------------------矩阵键盘扫描--------------------------------------------* 功能:扫描矩阵键盘,并返回键值 * 参数: * 输入:无 * 返回:有键按下返回该键值 * 无键按下时则返回0 --------------------------------------------------------------------------------------*/ u8 Read_KeyValue(void) { u8 KeyValue=0; if((GPIO_ReadInputData(GPIOA)&0xff)!=0x0f) {

STM32矩阵键盘实现方法收集

STM32用矩阵键盘,不带外部中断,可以多个按键同时按下 C代码: STM32用矩阵键盘,不带外部中断,可以多个按键同时按下 /**************矩阵键盘.h文件*********************************/ #ifndef __COMMON_H #define __COMMON_H #include "stm32f10x.h" /* 4*4矩阵键盘*/ void keyboard_init(void); void update_key(void); extern unsigned char key[4][4]; #endif /**************矩阵键盘.c文件*****************************/ #include "common.h" struct io_port { GPIO_TypeDef *GPIO_x; unsigned short GPIO_pin; }; static struct io_port key_output[4] = { {GPIOD, GPIO_Pin_0}, {GPIOD, GPIO_Pin_1}, {GPIOD, GPIO_Pin_2}, {GPIOD, GPIO_Pin_3} }; static struct io_port key_input[4] = { {GPIOD, GPIO_Pin_4}, {GPIOD, GPIO_Pin_5}, {GPIOD, GPIO_Pin_6}, {GPIOD, GPIO_Pin_7} }; unsigned char key[4][4]; void keyboard_init(void) { GPIO_InitTypeDef GPIO_InitStructure; unsigned char i; /* 键盘行扫描输出线输出高电平*/ /* PA0 PA1 PA2 PA3 输出*/ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

矩阵键盘单个数码管显示C语言程序

#include #define uchar unsigned char #define uint unsigned int uchar code_h,code_l; //定义行扫描码,列检测数据uchar tmp,keyvalue; //定义接收键值 /*函数说明*/ void delay(void); uchar keyscan(); /*主函数*/ void main () //键值处理 { while(1) { tmp=keyscan();//调用键盘扫描程序 switch(tmp) { case 0x11: P0=0x3f; break; //0 case 0x12: P0=0x06; break; //1 case 0x14: P0=0x5b; break; //2 case 0x18: P0=0x4f; break; //3 case 0x21: P0=0x66; break; //4 case 0x22: P0=0x6d; break; //5 case 0x24: P0=0x7d; break; //6 case 0x28: P0=0x07; break; //7 case 0x41: P0=0x7f; break; //8 case 0x42: P0=0x67; break; //9 case 0x44: P0=0x77; break; //a case 0x48: P0=0x7c; break; //b case 0x81: P0=0x39; break; //c case 0x82: P0=0x5c; break; //d case 0x84: P0=0x79; break; //e case 0x88: P0=0x71; break; //f case 0x00: ; break; default:P0=0x00; } delay(); } } /*延时函数*/ void delay(void) {uchar i; for(i=0;i<200;i++){} } /*键盘扫描函数*/ uchar keyscan(void)

相关文档
最新文档