先上代码:
/*****************************************************************************
*         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)  ;
    }
 
 }
下载程序有点周折,STC比较挑剔,原有的USB转串口线不能用,开始以为串口部分有问题,经反复检查没发现问题,后拿到台式机上试,可以下载,从新买了一条HL-340芯片的,可以下载了。下载时要先点程序中的下载按钮,再上电,否则不易成功。
按键扫描实验代码:
/*****************************************************************************
程序名称:矩阵键盘扫描显示键值
简要说明: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)  ;
    }
 
 }
回复
| 有奖活动 | |
|---|---|
| 硬核工程师专属补给计划——填盲盒 | |
| “我踩过的那些坑”主题活动——第002期 | |
| 【EEPW电子工程师创研计划】技术变现通道已开启~ | |
| 发原创文章 【每月瓜分千元赏金 凭实力攒钱买好礼~】 | |
| 【EEPW在线】E起听工程师的声音! | |
| 高校联络员开始招募啦!有惊喜!! | |
| 【工程师专属福利】每天30秒,积分轻松拿!EEPW宠粉打卡计划启动! | |
| 送您一块开发板,2025年“我要开发板活动”又开始了! | |
			
			
			
						
			
 我要赚赏金
