这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » blueapple2的DIY进程贴-按键扫描显示实验(视频)

共24条 2/3 1 2 3 跳转至
助工
2011-11-29 12:15:16     打赏
11楼
元件收到:

助工
2011-11-29 13:34:52     打赏
12楼
板子基本焊好,不用的元件暂不焊。下一步开始做实验。

助工
2011-12-02 08:46:20     打赏
13楼
本周事情实在太多了,没时间搞。

助工
2011-12-04 16:04:34     打赏
14楼
实验1:LED数码管数字、字母显示,视频怎么上?

助工
2011-12-04 16:17:39     打赏
15楼

先上代码:
/*****************************************************************************
*         LED数码管显示演示程序                                                *
*         在8个LED数码管上依次显示1,2,3,4,5,6,7,8                              *
          P2口(片选位):(采用的P2.0-P2.2控制三线八线译码器74HC138)
          0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07
           位1  位2  位3  位4  位5  位6  位7  位8

          P0口(数据位):
          0x3f 0x06 0x5b 0x4f 0x66 0x6d 0x7d 0x07 0x7f 0x6f
            0    1    2    3    4    5    6    7    8    9
          0x77 0x7c 0x39 0x5e 0x79 0x71
            A    B    C    D    E    F
*******************************************************************************/
#include <reg51.h>         //包含头文件
#include <intrins.h>        //包含移位函数头文件
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long

uchar code segment[]={0x3f ,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77 ,0x7c ,0x39 ,0x5e ,0x79 ,0x71 };//此数组为 0-f
uchar code select[]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07};//位选代码


void delay(uint t)
{
  uint x,y;
 for(x=t;x>0;x--)
   for(y=110;y>0;y--);
}

/****************************************************
函数:display()
功能:动态显示数码管0-F
参数:duan段选,wei位选,time延时时间设定
说明:无
时间2011.12.3
****************************************************/

void display(uint duan,wei,time)
 {
   P2=select[wei];
     P0=segment[duan];
      delay(time); 
      P0=0x00;
 }
void display_num(ulong num)
 {
     uint i;
  ulong curnum;
  ulong tmpnum;
  uint k=5;
  i=8 ;
  tmpnum=num;
  do
  {
      curnum=tmpnum % 10;
   tmpnum=tmpnum / 10;
   display(curnum,i-1,k) ;
      i--  ;
        }
  while(i>0 && tmpnum>0);
 }

 

 void main()
 {
   uint i, k,d,t=5;
   ulong l;
   while(1) 
   {
      for (k=0;k<2;k++)
      {
         for (d=0;d<8;d++)
   {
            for (i=0;i<500;i++)  //持续一定时间
            {
               display(7*k+d,d,t) ;
         }
       }
    }
    delay(1000)  ;
       l=12345678;
       for (i=0;i<500;i++)
       {
           display_num(l) ;
    }
    delay(1000)  ;
       l=23456789;
       for (i=0;i<500;i++)
       {
          display_num(l) ;
    }
       delay(1000)  ;

    }
 
 }

 


助工
2011-12-04 16:37:11     打赏
16楼

下载程序有点周折,STC比较挑剔,原有的USB转串口线不能用,开始以为串口部分有问题,经反复检查没发现问题,后拿到台式机上试,可以下载,从新买了一条HL-340芯片的,可以下载了。下载时要先点程序中的下载按钮,再上电,否则不易成功。


助工
2011-12-05 13:25:10     打赏
17楼

LED数码管显示


院士
2011-12-05 14:43:20     打赏
18楼
不错

助工
2011-12-11 17:32:49     打赏
19楼

助工
2011-12-11 17:40:14     打赏
20楼

按键扫描实验代码:
/*****************************************************************************
程序名称:矩阵键盘扫描显示键值
简要说明:P3口接矩阵键盘:低四位行,高四位列
          LED数码管                             *
          P2口(片选位):(采用的P2.0-P2.2控制三线八线译码器74HC138)
          0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07
           位1  位2  位3  位4  位5  位6  位7  位8

          P0口(数据位):
          0x3f 0x06 0x5b 0x4f 0x66 0x6d 0x7d 0x07 0x7f 0x6f
            0    1    2    3    4    5    6    7    8    9
          0x77 0x7c 0x39 0x5e 0x79 0x71
            A    B    C    D    E    F
*******************************************************************************/
#include <reg51.h>         //包含头文件
#include <intrins.h>        //包含移位函数头文件
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long

uchar code segment[]={0x3f ,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77 ,0x7c ,0x39 ,0x5e ,0x79 ,0x71 };//此数组为 0-f
uchar code select[]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07};//位选代码
uchar key_val=0;   //定义键值,初始默认为0


void delay(uint t)
{
  uint x,y;
 for(x=t;x>0;x--)
   for(y=110;y>0;y--);
}
 
/****************************************************
函数:display()
功能:动态显示数码管0-F
参数:duan段选,wei位选,time延时时间设定
说明:无
时间2011.12.3
****************************************************/

void display(uint duan,wei,time)
 {
   P2=select[wei];
     P0=segment[duan];
      delay(time); 
      P0=0x00;
 }
void display_num(ulong num)
 {
     uint i;
  ulong curnum;
  ulong tmpnum;
  uint k=5;
  i=8 ;
  tmpnum=num;
  do
  {
      curnum=tmpnum % 10;
   tmpnum=tmpnum / 10;
   display(curnum,i-1,k) ;
      i--  ;
        }
  while(i>0 && tmpnum>0);
 }

/*****按键扫描*****/
void Check_Key(void)
{
 unsigned char row,col,tmp1,tmp2;
    tmp1 = 0x01;            //tmp1用来设置P3口的输出,取反后使P3.0~P3.3中有一个为0
    for(row=0;row<4;row++)   // 行检测
 {
        P3 = 0x0f;            // 先将P3.0~P3.3置高
        P3 =~tmp1;            // 使P3.0~P3.3中有一个为0
        tmp1*=2;             // tmp1左移一位
        if ((P3 & 0x0f) < 0x0f)    // 检测P1.0~P1.3中是否有一位为0,只要有,则说明此行有键按下,进入列检测
  {
      tmp2 = 0x10;     // tmp2用于检测出哪一列为0
      for(col =0;col<4;col++)   // 列检测
      {
       if((P3 & tmp2)==0x00)  // 该列如果为低电平则可以判定为该列
       {
         key_val = row*4 +col; // 获取键值,识别按键
         return;     // 退出循环
       }
       tmp2*=2;      // tmp2左移一位
            }
        }
    }
}         


 void main()
 {
//   uint i;
//   ulong l;
   while(1) 
   {
        Check_Key();
//       l=key_val;
  //     for (i=0;i<5;i++)
  //     {
           display_num(key_val) ;
//    }
//    delay(1000)  ;

    }
 
 }

 


共24条 2/3 1 2 3 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]