单片机驱动矩阵按键与独立按键源代码

发布者:婉如Chanel最新更新时间:2015-04-29 来源: 51hei关键字:单片机  矩阵按键  独立按键 手机看文章 扫描二维码
随时随地手机看文章
本程序所用的原理图下载: 点这里 ,单片机芯片使用的stc89c52;找到相应部分即可.这是一整个单片机开发板的电路图其他的忽略.

hex文件及其工程文件下载:http://www.51hei.com/f/pingfc.rar  下面是程序源码:

/*
*功能:使用矩阵按键使得按键按下时数码管上显示各自对应的数字的立方数
*       优化显示,只显示有效位;
*   且使用独立按键实现key1清零,key2加数,key3减数;
*日期:2013-05-07-10:20
*作者:徐冉
*特别说明:本程序代码已经通过调试,仅供学习使用;
*
*/
/***********AT89C52-RC 单片机-51hei实验板***********/
/*****************51hei开发板*********************/


#include
typedef unsigned int  uint;
typedef unsigned char uchar;
sbit wela = P2^7;
sbit dula = P2^6;
sbit key1 = P3^4;
sbit key2 = P3^5;
sbit key3 = P3^6;
sbit fm = P2^3;
uint temp;
uchar code table[] = {      
      0x3F,  //"0"
                0x06,  //"1"
                0x5B,  //"2"
                0x4F,  //"3"
                0x66,  //"4"
                0x6D,  //"5"
                0x7D,  //"6"
                0x07,  //"7"
                0x7F,  //"8"
                0x6F,  //"9"
                0x77,  //"A"
                0x7C,  //"B"
                0x39,  //"C"
                0x5E,  //"D"
                0x79,  //"E"
                0x71,  //"F"
                0x76,  //"H"
                0x38,  //"L"
                0x37,  //"n"
                0x3E,  //"u"
                0x73,  //"P"
                0x5C,  //"o"
                0x40,  //"-"
                0x00,  //熄灭
                0x00  //自定义
 };
// uchar key; Error!!! 此时的key值大于258 超出了uchar 故错误!!
uint key;
void display(num);
void delay(uint xms);
void max_kanscan();
void keyscan();
void main(void)
{
 while(1)
 { 
  keyscan();
  max_kanscan();
  display(key);
 }  
}


void display(num)
{
 uchar qian, bai, shi, ge;
 qian = num / 1000 % 10;
 bai  = num / 100 % 10;
 shi  = num / 10 % 10;
 ge   = num % 10;
 
 if(num < 10)
 {
  dula = 1;
  P0 =table[ge];
  dula = 0;
  P0 = 0xff;
  wela = 1;
  P0 = 0xfe;
  wela = 0;
 }
 else if(num < 100)
 {
  dula = 1;
  P0 =table[shi];
  dula = 0;
  P0 = 0xff;
  wela = 1;
  P0 = 0xfe;
  wela = 0;
  P0 = 0x00;
  delay(1);


  dula = 1;
  P0 =table[ge];
  dula = 0;
  P0 = 0xff;
  wela = 1;
  P0 = 0xfd;
  wela = 0;
  P0 = 0x00;
  delay(1);
 }
 else if(num < 1000)
 {
  dula = 1;
  P0 =table[bai];
  dula = 0;
  P0 = 0xff;
  wela = 1;
  P0 = 0xfe;
  wela = 0;
  P0 = 0x00;
  delay(1);


  dula = 1;
  P0 =table[shi];
  dula = 0;
  P0 = 0xff;
  wela = 1;
  P0 = 0xfd;
  wela = 0;
  P0 = 0x00;
  delay(1);


  dula = 1;
  P0 =table[ge];
  dula = 0;
  P0 = 0xff;
  wela = 1;
  P0 = 0xfb;
  wela = 0;
  P0 = 0x00;
  delay(1);
 }
 else if(num < 10000)
 {
  dula = 1;
  P0 =table[qian];
  dula = 0;
  P0 = 0xff;
  wela = 1;
  P0 = 0xfe;
  wela = 0;
  P0 = 0x00;
  delay(1);


  dula = 1;
  P0 =table[bai];
  dula = 0;
  P0 = 0xff;
  wela = 1;
  P0 = 0xfd;
  wela = 0;
  P0 = 0x00;
  delay(1);


  dula = 1;
  P0 =table[shi];
  dula = 0;
  P0 = 0xff;
  wela = 1;
  P0 = 0xfb;
  wela = 0;
  P0 = 0x00;
  delay(1);


  dula = 1;
  P0 =table[ge];
  dula = 0;
  P0 = 0xff;
  wela = 1;
  P0 = 0xf7;
  wela = 0;
  P0 = 0x00;
  delay(1);
 }
   
}

[page]
void delay(uint xms)
{
 uint i, j;
 for(i = xms; i > 0; i--)
  for(j = 125; j > 0; j--);
}


void keyscan()
{
 if(key1 == 0)
 {
  delay(5);
  if(key1 == 0)
  {
   fm = 0;
   key = 0;
   while(!key1);
   delay(5);
   while(!key1);
   fm =  1;
  }
 }


 if(key2 == 0)
 {
  delay(5);
  if(key2 == 0)
  {
   fm = 0;
   key++;
   while(!key2);
   delay(5);
   while(!key2);
   fm = 1; 
  }
 }


 if(key3 == 0)
 {
  delay(5);
  if(key3 == 0)
  {
   fm = 0;
   key--;
   while(!key3);
   delay(5);
   while(!key3);
   fm = 1; 
  }
 }

 


}
void max_kanscan()
{
 
 P3 = 0xfe;
 temp = P3;
 temp &= 0xf0;
 if(temp != 0xf0)
 {
  delay(5);
  temp = P3;
  temp &= 0xf0;
  if(temp != 0xf0)
  { //按键检测
   temp = P3;
   fm = 0;
   switch(temp)
   {
     case 0xee: key = 1 * 1 *1;
    break;
     case 0xde: key = 2 * 2 *2;
    break;
     case 0xbe: key = 3 * 3 *3;
    break;
     case 0x7e: key = 4 * 4 *4;
    break;
    default: 
    break;
   }
   //按键释放
   while(temp != 0xf0)
   {
    temp = P3;
    temp &= 0xf0;
   }
   delay(5);
   while(temp != 0xf0)
   {
    temp = P3;
    temp &= 0xf0;
   }
   fm = 1;
  }
 }


 P3 = 0xfd;
 temp = P3;
 temp &= 0xf0;
 if(temp != 0xf0)
 {
  delay(5);
  temp = P3;
  temp &= 0xf0;
  if(temp != 0xf0)
  { //按键检测
   temp = P3;
   fm = 0;
   switch(temp)
   {
     case 0xed: key = 5 * 5 *5;
    break;
     case 0xdd: key = 6 * 6 *6;
    break;
     case 0xbd: key = 7 * 7 *7;
    break;
     case 0x7d: key = 8 * 8 *8;
    break;
    default: 
    break;
   }
   //按键释放
   while(temp != 0xf0)
   {
    temp = P3;
    temp &= 0xf0;
   }
   delay(5);
   while(temp != 0xf0)
   {
    temp = P3;
    temp &= 0xf0;
   }
   fm = 1;
  }
 }


 P3 = 0xfb;
 temp = P3;
 temp &= 0xf0;
 if(temp != 0xf0)
 {
  delay(5);
  temp = P3;
  temp &= 0xf0;
  if(temp != 0xf0)
  { //按键检测
   temp = P3;
   fm = 0;
   switch(temp)
   {
     case 0xeb: key = 9 * 9 *9;
    break;
     case 0xdb: key = 10 * 10 *10;
    break;
     case 0xbb: key = 11 * 11 *11;
    break;
     case 0x7b: key = 12 * 12 *12;
    break;
    default: 
    break;
   }
   //按键释放
   while(temp != 0xf0)
   {
    temp = P3;
    temp &= 0xf0;
   }
   delay(5);
   while(temp != 0xf0)
   {
    temp = P3;
    temp &= 0xf0;
   }
   fm = 1;
  }
 }


 P3 = 0xf7;
 temp = P3;
 temp &= 0xf0;
 if(temp != 0xf0)
 {
  delay(5);
  temp = P3;
  temp &= 0xf0;
  if(temp != 0xf0)
  { //按键检测
   temp = P3;
   fm = 0;
   switch(temp)
   {
     case 0xe7: key = 13 * 13 *13;
    break;
     case 0xd7: key = 14 * 14 *14;
    break;
     case 0xb7: key = 15 * 15 *15;
    break;
     case 0x77: key = 16 * 16 *16;
    break;
    default: 
    break;
   }
   //按键释放
   while(temp != 0xf0)
   {
    temp = P3;
    temp &= 0xf0;
   }
   delay(5);
   while(temp != 0xf0)
   {
    temp = P3;
    temp &= 0xf0;
   }
   fm = 1;
  }
 }
 
}

关键字:单片机  矩阵按键  独立按键 引用地址:单片机驱动矩阵按键与独立按键源代码

上一篇:51单片机矩阵键盘与左右流水灯控制C程序
下一篇:单片机I2C通信及LCD1602显示C程序

推荐阅读最新更新时间:2024-03-16 14:00

基于51单片机的微波脉冲功率测试系统
1工作原理   本系统充分利用89C51单片机的控制和计算能力,采用MCS-51汇编语言,设计了一种基于平均功率法的微波脉冲测试系统。   平均功率法测量的是射频脉冲复重周期的平均功率,并采用辅助方法测出脉冲的占空系数。设脉冲为矩形,宽度为τ,重复周期为T。则脉冲峰值功率为: 上式中,Q=τ/T是射频脉冲的占空系数。   测量时,用示波器显示其脉冲波形,并测量脉冲重复周期T和宽度τ。用测量连续波功率的方法测出脉冲的平均功率Pav。   当使用衰减器和定向耦合器时,若衰减器两端匹配时的衰减量为A(dB),定向耦合器的过渡衰减量为C(dB),方向性为无穷大,则脉冲峰值功率为     当脉冲为非理想矩形时,须乘以修正系数K进行修
[单片机]
基于51<font color='red'>单片机</font>的微波脉冲功率测试系统
基于8051内核MCU的满足物联网应用需求的通信接口选择浅析
0 引言 对于基于flash控制器的8051的芯片结构,一般在进行数据传输时,都是先通过串口将数据传送到flash控制器的buffer中。由于buffer的大小为512 bytes,所以每次传输的最大数据量为512bytes。本文中所讨论的三种检错方法的传输数据量均为512 bytes。 1 检错方式 基于8051的串口数据通信系统的硬件开发平台框图如图1所示。利用该平台进行数据传输时,通常有三种数据检错方式。 1.1 奇偶校验 奇偶校验是检错中比较常见的一种方法。它利用数据中的1的个数作为检错的标志位,若1的个数为奇数个,则错误检测的标志位为1,若1的个数为偶数,则错误检测的标志位为0。在发送端和接收端同时检测奇偶位,若得
[单片机]
基于8051内核<font color='red'>MCU</font>的满足物联网应用需求的通信接口选择浅析
MSP430单片机中断详解
中断是MSP430微处理器的一大特色,有效地利用中断可以简化程序和提高执行效率。MSP430的几乎每个外围模块都能够产生中断,为MSP430针对事件(即外围模块产生的中断)进行的编程打下基础。MSP430在没有事件发生时进入低功耗模式,事件发生时,通过中断唤醒CPU,事件处理完毕后,CPU再次进入低功耗状态。由于CPU的运算速度和退出低功耗的速度很快,所以在应用中,CPU大部分时间都处于低功耗状态。 MSP430的中断分为3种:系统复位、不可屏蔽中断、可屏蔽中断。 (1)系统复位的中断向量为0xFFFE。 (2)不可屏蔽中断的中断向量为0xFFFC。响应不可屏蔽中断时,硬件自动将OFIE、NMIE、ACCVIE复位。软
[单片机]
STM32的启动过程如何分析
本文分析STM32单片机从上电到运行的过程,目的在于了解STM32单片机从启动到运行的整个过程。 一般我们在使用STM32单片机的时候,都是使用官方提供的驱动文件,移植到自己即将要使用的工程中,移植完成之后再编写自己的逻辑代码,放到main( )函数中,就可以完美的运行起来了。相信很多的人都没有去关注过STM32从启动到运行这个过程都发生了什么,现在就简单分析一些这个过程。 本文以STM32F103为例进行分析。在官方给我们提供的启动文件中,将整个单片机的启动过程要做的事情都已经帮我们做好了,以至于我们在使用这款单片机的时候,几乎可以不会吹灰之力就可以运行起来。STM32F103的启动文件形如: 根据不同的芯片容量,都
[单片机]
STM32的启动过程如何分析
车规级MCU相关知识科普
一辆传统燃油车需要大约500到600颗芯片,轻混汽车大约需要1000颗,插电混动和纯电动汽车则需要至少2000颗芯片。 这就意味着在智能电动汽车快速发展的过程中,不仅对先进制程芯片需求不断增加,而且对传统芯片需求也会持续增加。MCU就是这样,除了单车搭载的数量在不断增长,域控制器也带来了对高安全、高可靠、高算力MCU的新需求增长。 MCU,Microcontroller Unit,中文称单片微型计算机/微控制器/单片机,将CPU、存储器、外围功能整合在单一芯片上,形成具有控制功能的芯片级计算机,主要用于实现信号处理和控制,是智能控制系统的核心。 MCU和汽车电子,工业,计算机和网络,消费电子,家电和物联网等我们生活和工
[嵌入式]
车规级<font color='red'>MCU</font>相关知识科普
基于51单片机的半导体激光器电源控制系统的设计
半导体激光器(LD)体积小,重量轻,转换效率高,省电,并且可以直接调制。基于他的多种优点,现已在科研、工业、军事、医疗等领域得到了日益广泛的应用,同时其驱动电源的问题也更加受到人们的重视。使用单片机对激光器驱动电源的程序化控制,不仅能够有效地实现上述功能,而且可提高整机的自动化程度。同时为激光器驱动电源性能的提高和扩展提供了有利条件。 1总体结构框图 本系统原理如图1所示,主要实现电流源驱动及保护、光功率反馈控制、恒温控制、错误报警及键盘显示等功能,整个系统由单片机控制。本系统中选用了C8051F单片机。C8051F单片机是完全集成的混合信号系统级芯片(SOC),他在一个芯片内集成了构成一个单片机数据采集或控制系统所需要的几乎
[单片机]
基于51<font color='red'>单片机</font>的半导体激光器电源控制系统的设计
关于PL2303用于STC单片机下载的讨论
测试的STC单片机:STC12LE5A60S2 USB转串口芯片:PL2303HX(E版或F版) 测试环境:win7为主 相信很多人用USB转串口芯片PL2303都会遇到问题,如波特率较低,不能下载之类的,我也是,搞了好久,虽然还是不知其所以然,但是总算可以用了。下面分享下自己的经验吧。不足之处还请大家多多指教。 首先, 我是这么分析的: 1、PL2303电路的发送接收是否正常?这个很容易,直接用串口调试程序查了一下,一般照着网上的电路接,都是没有问题的。 2、PL2303输出电平和STC的电平是否匹配。看了很多资料,PL2303的D版以后的输出电平都是高电平5V,低电平小于0.5V。所以电平是匹配的。网上有人说电平不
[单片机]
单片机抢答器的设计资料详细说明
在知识比赛中, 特别是做抢答题目的时候, 在抢答过程中,为了知道哪一组或哪一位选手先答题,必须要设计一个系统来完成这个任务。如果在抢答中,靠视觉是很难判断出哪组先答题。利用单片机系统来设计抢答器,使以上问题得以解决,即使两组的抢答时间相差几微秒,也可分辨出哪组优先答题。本文主要介绍了单片机抢答器设计及工作原理,以及它的实际用途。 ! 系统工作原理本系统采用8051单片机作为核心。控制系统的四个模块分别为:存储模块、显示模块、语音模块、抢答开关模块。该抢答器系统通过开关电路四个按键输入抢答信号;利用语音芯片ISD1420 完成语音的录放功能; 利用存储程序; 利用一个数码管来完成显示功能。工作时,用按键通过开关电路输入各路的抢答信号
[单片机]
<font color='red'>单片机</font>抢答器的设计资料详细说明
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved