51单片机矩阵键盘与左右流水灯控制C程序

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

hex文件及其工程文件下载:http://www.51hei.com/f/jzzyou.rar  以下是测试ok的源代码:

/*
*功能:使用矩阵按键使得按键按下时数码管上显示各自对应的数字的平方数;
*    且使用定时器0中断使得彩色流水灯先以20毫秒的速度左移流动4秒后,
*    然后使得彩色流水灯以20毫秒的速度右移流动;
*日期:2013-05-02-16:46
*作者:徐冉
*特别说明:本程序代码已经通过调试,仅供学习使用;
*
*/
/***********AT89C52-RC 单片机- 51hei-5 实验板***********/
/*****************51hei开发板*********************/
#include
typedef unsigned int uint;
typedef unsigned char uchar;
sbit wela = P2^7;
sbit dula = P2^6;
sbit FM = P2^3;
uchar code table[] = {
                0x3F,  //"0"
                0x06,  //"1"
                0x5B,  //"2"
                0x4F,  //"3"
                0x66,  //"4"
                0x6D,  //"5"
                0x7D,  //"6"
                0x07,  //"7"
                0x7F,  //"8"
                0x6F  //"9"
    };
uint key1 = 0;
uchar counter = 0, x = 0, flag = 0;
void display(uint num);
void delay(uint xms);
void Marix_keyscan();
void init();
//主程序
void main()
{
 init();//定时器0初始化
 while(1)
 {
  if(counter == 200)//定时器定时左移流动4秒
  {
   counter = 0;
   flag = 1;
   TR0 = 0;
   TH0 = 0xB8;
   TL0 = 0X00;
   TR0 = 1;
   x = 0;
  }
  Marix_keyscan();
  display(key1);
 } 
}
//定时器0初始化子程序
void init()
{
 TMOD = 0x01;
 TH0 = 0xB8;
 TL0 = 0X00;
 EA = 1;
 ET0 = 1;
 TR0 = 1;
}
//数码管优化显示子程序
void display(uint num)
{
 uchar bai, shi, ge;
 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;
  P0 = 0x00;
  delay(1);
 }
  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
 {
  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);
 }
}
//延时子程序
void delay(uint xms)
{
 uint i, j;
 for(i = xms; i > 0; i--)
   for(j = 125; j > 0; j--);
}
//矩阵按键检测子程序
void Marix_keyscan()
{
 uchar temp;  //定义一个变量存放P3口的值
 //第一次矩阵按键检测
 P3 = 0xfe;  //给P3口赋一个值,使得矩阵按键的第一行置为低电平,其余口置为高电平;
 temp = P3;  //将P3口的值赋给temp
 temp &= 0xf0;  //通过与0xf0&来检测矩阵按键的各列通过行列检测与检测矩阵按键
 if(temp != 0xf0)
 {
  //检测有矩阵按键按下
  delay(5);//消抖
  temp = P3;//再次将P3口的值赋给temp,即再次赋初值检测矩阵按键;
  temp &= 0xf0; //再次按位与检测矩阵按键行列
  if(temp != 0xf0)
  { //确认有键按下
   FM = 0;//蜂鸣器发声
   temp = P3; //将此时的P3口的值赋给temp
   switch(temp)
   {
    case 0xee: key1 = 1 * 1;
     break; //检测到key1按下
     case 0xde: key1 = 2 * 2;
        break; //检测到key2按下
     case 0xbe: key1 = 3 * 3;
        break; //检测到key3按下
     case 0x7e: key1 = 4 * 4;
        break; //检测到key4按下
     default: 
     break;
   }
   //按键释放
   while(temp != 0xf0)
   { 
    //重新赋初值检测矩阵按键
    temp = P3;
    temp &= 0xf0;
   }
   delay(5);//释放去抖
    //按键释放
   while(temp != 0xf0)
   { 
    //重新赋初值检测矩阵按键
    temp = P3;
    temp &= 0xf0;
   }
   //按键释放关闭蜂鸣器
   FM = 1;
  }
 }[page]
 //第二次矩阵按键检测
 P3 = 0xfd; //给P3口赋初值,使得矩阵按键的第二行置0,其余行为高电平;
 temp = P3;//将用于检测的值赋给变量temp
 temp &= 0xf0;
 if(temp != 0xf0)
 {
  delay(5);//消抖
  //重新装入待于检测的初值;
  temp = P3;
  temp &= 0xf0;
  if(temp != 0xf0)
  {  
    //确定矩阵按键有键被按下
   //将此时的P3口的值赋给temp
   FM = 0;
   temp = P3;
   //开始检测
   switch(temp)
   {
    case 0xed: key1 = 5 * 5;
    break;
     case 0xdd: key1 = 6 * 6;
    break;
     case 0xbd: key1 = 7 * 7;
    break;
     case 0x7d: key1 = 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)
  {
   //将此时P3口的值赋给temp
   temp = P3;
   FM = 0;//蜂鸣器发声
   //检测按下的是哪一个按键,行列检测
   switch(temp)
   {
    case 0xeb: key1 = 9 * 9;
    break;
    case 0xdb: key1 = 10 * 10;
    break;
    case 0xbb: key1 = 11 * 11;
    break;
    case 0x7b: key1 = 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;
 temp &= 0xf0;
 if(temp != 0xf0)
 {
  delay(5); //消抖
  //重新装入检测初值
  temp = P3;
  temp &= 0xf0;
  if(temp != 0xf0)
  {
   //确认有按键按下
   //将此时的P3口的实际值赋给temp;
   temp = P3;
   FM = 0;
   //开始检测
   switch(temp)
   {
    case 0xe7: key1 = 13 * 13;
    break;
    case 0xd7: key1 = 14 * 14;
    break;
    case 0xb7: key1 = 15 * 15;
    break;
    case 0x77: key1 = 16 * 16;
    break;
    default:
    break;
   }
   //检测按键释放
   while(temp != 0xf0)
   { //重新装入初值
    temp = P3;
    temp &= 0xf0;
   }
   delay(5);
   while(temp != 0xf0)
   {
    temp = P3;
    temp &= 0xf0;
   }
   //关闭蜂鸣器
   FM = 1;
  }
 }
}
//定时器0中断服务子程序
void int_time0() interrupt 1
{
 TH0 = 0xB8;
 TL0 = 0X00;
 counter++;
 if(flag == 0)
 {  //流水灯左移流动
  if(counter % 1 == 0)
  {
   P1 = ~(1 << x++);
   if(x == 8)
   {
    x = 0;
   }
  
  }
 }
 else
 { //流水灯右移流动
  if(counter % 1 == 0)
  {
   P1 = ~(0x80 >> x++);
   if(x == 8)
   {
    x = 0;
   }
  }
 }
}

关键字:51单片机  矩阵键盘  流水灯控制 引用地址:51单片机矩阵键盘与左右流水灯控制C程序

上一篇:单片机左右流水灯与数码管动态显示C程序
下一篇:单片机驱动矩阵按键与独立按键源代码

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

51单片机的最小化应用系统
本文我们来谈一谈51单片机的最小化应用系统的问题,相信你做了这个简单的最小系统试验以后,会对单片机逐渐感兴趣起来的,单片机要正常运行,必须具备一定的硬件条件,其中最主要的就是三个基本条件:1.电源正常;2.时钟正常;3.复位正常。下面就以我们实验用的51单片机AT89S51为例介绍其硬件连接方法。 下图就是AT89S51单片机构成的最小系统(仅驱动1个发光二极管)的电路,在AT89S51单片机的40个引脚中:电源引脚2根,晶振引脚2根,控制引脚4根,可编程输入输出引脚32根。 《51单片机的最小化应用系统电路图》 1、工作电源:电源是单片机工作的动力源泉,废话!没有电源当然不能工作啦:),对应的接线方法
[单片机]
<font color='red'>51单片机</font>的最小化应用系统
51单片机实验9:外部中断
实验:按下按键,使led状态反转。 开发板独立按键,led,mcu电路图如下: 对于中断系统的介绍参考:https://blog.csdn.net/cax1165/article/details/86633086 #include reg52.h #define uc unsigned char sbit led=P2^0; sbit k3=P3^2; void delay(uc x) { uc i,j; for(i=1;i =x;i++) for(j=1;j =110;j++); } void int0init() { IT0=1; EX0=1; EA=1; } void int0() int
[单片机]
<font color='red'>51单片机</font>实验9:外部中断
51单片机-遥控器控制舵机
1.题目要求 我们在第九章第2讲第一个例程“按键控制舵机桨”的基础上,实现用红外遥控器的前三行按键控制舵机桨停留在我们想要的位置,这样就实现了无线遥控控制机械结构运动的简单功能。 2.main.c测试代码 #include reg52.h #include function.h //详见第六章第8讲 #include timer.h //详见第八章第11讲 #include infrared.h //详见第十三章第2讲 sbit PWMOUT=P1^7; u8 highval = 10; void main() { LED_Init(); //初始化LED硬件模块 EA = 1; Ini
[单片机]
51单片机中断机制(定时器/计数器)
单片机中断简介 52单片机一共有6个中断源,它们的符号,名称以及各产生的条件分别如下: INT0 - 外部中断0,由P3.2端口线引入,低电平或下降沿引起 INT1 - 外部中断1,由P3.3端口线引入,低电平或下降沿引起 T0 - 定时器/计数器0中断, 由T0计数器计满回零引起 T1 - 定时器/计数器1中断, 由T1计数器计满回零引起 T2 - 定时器/计数器2中断, 由T2计数器计满回零引起 TI/RI - 串行口中断,串行端口完成一帧字符发送/接收后引起 其中T2是52单片机特有的。 中断允许寄存器IE 中断优先级寄存器IP 定时器中断 51单片机内部共有两个16位可编程的定时器/计
[单片机]
慎用51单片机中的RET指令
题目:已知有四个按键依次连接单片机中的P3口的0到3的IO口,有四个LED灯连接P1的0到3 IO口,写一程序,满足以下条件:当按下按一个按键,对应的LED会发亮,比如 按下P3.0的按键,连接P1.0的LED就发亮。y 以下是我同学编写的程序: org 0000h mov P1,#0ffh loop: jnb P3.0,led1;* jnb P3.1,led2;* jnb P3.2,led3;* jnb P3.3,led4;* ljmp loop led1: clr P1.0 ret led2: clr P1.1 ret led3: clr P1.2 ret led4: clr P1.3 ret end 程序的意图是,制造
[单片机]
如何创建51单片机KEIL工程步骤
1. 什么是Keil软件 Keil软件是一款专为嵌入式系统开发而设计的集成开发环境(IDE),常用于51、STM32单片机软件开发的编程软件。Keil编程软件不仅支持多种工具和扩展程序,还能够处理多种文件格式和数据交换方式;可支持单片机程序的在线仿真,或通过仿真器进行实物仿真,大大方便开发人员的工作。 其中,我们常用的Keil软件有两种,分别为Keil C51以及Keil MDK,前者主要用于51单片机等8051内核单片机的开发工具(不支持32位单片机),Keil MDK主要用于ARM架构单片机的开发工具,主要用于STM32单片机等32单片机。所以在使用Keil软件时需要主要这一点。 2.如何创建51单片机KEIL工程步骤
[单片机]
如何创建<font color='red'>51单片机</font>KEIL工程步骤
8051单片机端口结构—P1口
P1口也是一个准双向口,作通用I/O使用。 从P1口的结构上可以看出,P1口输出驱动部分与P0口不同,内部有上拉负载与电源相连。实质上电阻是两个场效应管FET并在一起,一个FET为负载管,其电阻固定;另一个FET可工作在导通或截止两种状态,使其总电阻值变化近为0或阻值很大两种情况。当阻值近似为0时,可将引脚快速上拉至高电平,当阻值很大时,P1口为高阻输入状态。当P1口输出高电平时,能向外提供拉电流负载,所以不必再接上拉电阻。在端口用作输入时,也必须先向对应的锁存器写入“1”,使FET截止。由于片内负载电阻较大,约20-40K欧。所以不会对输入的数据产生影响。
[单片机]
80<font color='red'>51单片机</font>端口结构—P1口
51单片机 4个独立按键控制LED灯 (protues仿真)(C语言版)
一、思路及相关问题 1、逻辑思路: 当按下key1时 led1亮起来 因为按下去具有瞬时性不用while,用if语句,当松开时,用while(!key1) ,函数调用。 先在脑海里想象它的大致运行过程,其次在仿真软件protues上摆好元器件并连接,最后用keil4写对应代码。 需注意keil4软件上的设置如波特率,添加文件,勾选等等。 至少要了解C语言程序设计的基本功。 2、关于消抖: 通常的按键所用开关为机械性开关,当机械触电断开、闭合时、由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定的接通,在断开时也不会一下子断开、因而在闭合及断开的瞬间均伴随有一连串的抖动,为了不产生这种现象而作的措施就是按键消抖 按
[单片机]
<font color='red'>51单片机</font> 4个独立按键<font color='red'>控制</font>LED灯 (protues仿真)(C语言版)
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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