按键数码管数值前移

简介: #include typedef unsigned char uchar; typedef unsigned int uint;void delay(unsigned int i); //函数声名char DelayCNT;//定义变量...
 #include <reg51.h> 
 typedef unsigned char uchar;
 typedef unsigned int uint;
void delay(unsigned int i);      //函数声名
char DelayCNT;//定义变量
 
sbit P10=P1^0;
uint Count=0;
uchar n=0;
 
uchar Key_Value;//获取键盘码
uint i=0;
uint flag=0;
 
//此表为 LED 的字模, 共阴数码管 0-f
unsigned char code   Disp_Tab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71};  //段码控制
 
//此表为8个数码管位选控制, 共阴数码管 1-8个  - 
unsigned char code   dispbit[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdF,0xbF,0x7F};    //位选控制   查表的方法控制 从左边开始
 
//显示缓冲区
uchar led_buf[8]={8,1,2,3,4,5,6,7};  //存放八个数
 
//计算每一位
void ADcal()
{
 led_buf[0]=Count/100;//百位
    led_buf[1]=Count/10%10;//十位
    led_buf[2]=Count%10;//个位
}
 
//开时间中断
void initTime(){
  IE=0x83;
  TR0=1;
}
//开外部中断
void initOut(){
    IE=0x83;
    IT0=1;
}
 //时间中断0
 void timer0() interrupt 1
{
    TH0=(65535-50000)/256;
    TL0=(65535-50000)%256;
 
    n++;
    if(n==2)
    {
 
    P10=1;
    delay(20);
    P10=0;
    delay(20);
    Count++;
    if(Count>=999)
    {
        Count=0;
    }
    }
}
 //外部中断0
void out0() interrupt 0
{
    Count++;
    if(Count>=999)
    {
        Count=0;
    }
}
/**********键盘**************************/
//返回0-15
 uchar Keyscan(void)
{
uchar i,j, temp, Buffer[4] = {0xfe, 0xfd, 0xfb, 0xf7};//让矩阵键盘的每行分别为低电平
for(j=0; j<4; j++)
{
P1 = Buffer[j];
temp = 0x10;                                                                                                                                                                    
for(i=0; i<4; i++)
{
if(!(P1 & temp)) //判断P1口高4位某一行为低电平
{
return (i+j*4);//返回键码
}
temp <<= 1;
}
}
}
 
uint Key()
{
P1 = 0xf0;
if(P1 != 0xf0)//判断有无按键按下
{
delay(10);//按键消抖
if(P1 != 0xf0)//第二次判断有无按键按下
{
delay(10);  //按键消抖
if(P1 != 0xf0)//第三次判断有无按键按下
{
Key_Value = Keyscan();
if(flag == 1)
return 0;
else
return 1;
}
}
}
flag = 0;
return 0;
}
/****************************************/
 //将数组中的数右移
void Mov()
{
 
  uint j=7;
 for(j;j>0;j--)
 {
  led_buf[j]=led_buf[j-1];
 }
 
}
 
/************主函数**********************/ 
main()
{ 
/* 
   unsigned int i,LedNumVal=1 ;   //变量定义
   unsigned int LedOut[10];   //变量定义
   
   DelayCNT=0;
   */
   /*
    unsigned int i=0;
     initOut(); //打开外部中断'
     initTime();
     TH0=(65535-50000)/256;
     TL0=(65535-50000)%256;
     */
     delay(10);
  
 
  while(1)
  {/* 
     if(++DelayCNT>=20)  //控制数字变化速度
 {
 DelayCNT=0;  //20个扫描周期清零一次
    ++LedNumVal;  //每隔20个扫描周期加一次
 }
 
 LedOut[0]=Disp_Tab[LedNumVal%10000/1000];
     LedOut[1]=Disp_Tab[LedNumVal%1000/100]|0x80;
     LedOut[2]=Disp_Tab[LedNumVal%100/10];
     LedOut[3]=Disp_Tab[LedNumVal%10];
 
 LedOut[4]=Disp_Tab[LedNumVal%10000/1000];   //千位
     LedOut[5]=Disp_Tab[LedNumVal%1000/100]|0x80;  //百位带小数点
     LedOut[6]=Disp_Tab[LedNumVal%100/10];   //十位
     LedOut[7]=Disp_Tab[LedNumVal%10];             //个位 
 
   
 
 for( i=0; i<8; i++) 
  { 
  P0 = LedOut[i];
  P1 = dispbit[i];   //使用查表法进行位选 
  
delay(150); //扫描间隔时间  太长会数码管会有闪烁感
  }
   */
 //ADcal();
 /*
 if(i==2)//百位
        {
           P0=Disp_Tab[led_buf[i]];
        }
        if(i==1)  //十位
        {
           P0=Disp_Tab[led_buf[i]];
        }
        if(i==0)//个位
        {
           P0=Disp_Tab[led_buf[i]];
        }
        P2=dispbit[i];//将P2连接位选
        i++;
        i=i%3;
*/
 
 
if(Key())
{
   Mov();//数组值右移
   
   flag = 1;
   led_buf[0]=Key_Value;//将当前值存到数组第一位
   
}
 
    
//P0=Disp_Tab[Key_Value];  
P0=Disp_Tab[led_buf[i]];   //数码管段选
P2=dispbit[i];//将P2连接位选
i++;
        i=i%8;
if(i==64)
{
 i=0;
}
        delay(150);
  }   
}
 
/*******************延时函数**********************************************/
void delay(unsigned int i)
{
    char j;
    for(i; i > 0; i--)
        for(j = 200; j > 0; j--);
}

相关文章
|
传感器 芯片
数码管显示原理及应用实现介绍1
数码管是一种能够显示数字和简单的字母的显示设备,它由LED(Light Emitting Diode,发光二极管)组成。LED是一种半导体器件,当电流通过它时,会产生光。数码管的每个LED都对应一个数字或字母的形状,通过开启或关闭LED,可以显示所需的数字或字母。 数码管可以分为共阳极和共阴极两种类型。共阳极数码管的所有LED的阳极连接在一起,通过控制每个LED的阴极点亮或熄灭来显示不同的数字或字母。共阴极数码管则相反,将所有LED的阴极连接在一起,通过控制每个LED的阳极点亮或熄灭来显示不同的数字或字母。在实际应用中,常用的是共阳极数码管。 数码管的控制是通过给定不同的输入信号来实现的。
332 0
|
4月前
【51单片机】独立按键,每个按键不同功能,数码管数值的加减,控制流水灯模式,包含按键消抖,数码显示,流水灯
【51单片机】独立按键,每个按键不同功能,数码管数值的加减,控制流水灯模式,包含按键消抖,数码显示,流水灯
297 1
|
4月前
【51单片机】开发板上矩阵键盘键码在数码管上的显示,按下键盘在数码管上显示对应段码
【51单片机】开发板上矩阵键盘键码在数码管上的显示,按下键盘在数码管上显示对应段码
117 0
【51单片机】Kn独立按键控制【LED亮灭】【LED状态】【LED二进制式显示】【LED不断移位】(4)
【51单片机】Kn独立按键控制【LED亮灭】【LED状态】【LED二进制式显示】【LED不断移位】(4)
|
存储 编译器
单片机原理及其应用——单片机外部中断实验(八段数码管通过按键依次显示0~9数字)
单片机原理及其应用——单片机外部中断实验(八段数码管通过按键依次显示0~9数字)
单片机原理及其应用——单片机外部中断实验(八段数码管通过按键依次显示0~9数字)
|
传感器 芯片
数码管显示原理及应用实现介绍2
继续介绍数码管的应用实现。 7. 数字测量仪表:数码管可以用来显示各种物理量的测量结果,如电压、电流、功率等。传感器可以将被测量的物理量转换为电信号,并通过微控制器进行处理,并将结果显示在数码管上。 8. 运动计时器:数码管可以用来显示比赛或训练的时间、轮次、分数等信息。通过微控制器或计时器芯片,可以精确地控制和显示各项计时数据。 9. 信号状态指示:数码管可以用来显示开关、按钮或传感器等的状态。通过微控制器或逻辑电路,可以将不同的输入状态映射到数码管的显示状态,方便用户了解和判断设备的工作状态。 10. 售货机显示:数码管可以用来显示售货机的产品信息、价格和投币金额等。通过微控制器进
112 0
使用STM32CubeMX实现按下按键,电平反转
使用STM32CubeMX实现按下按键,电平反转
227 0
使用STM32CubeMX实现按下按键,电平反转
【单片机】数码管矩阵显示
【单片机】数码管矩阵显示
88 0
【STC15单片机】按键&静态数码管显示0~9
【STC15单片机】按键&静态数码管显示0~9
416 0
【51单片机】数码管显示
【51单片机】数码管显示
120 0