独立按键控制LED数码管

前言

通过1个独立按键,控制LED数码管显示字符。

结合之前我的两篇文章

效果

原理

提前在程序里存储共阴极数码管的编码表,能表示的字符范围为

0-9,A,B,C,D,E,F,H,L,N,U,P,O,-

用数组存储这些字符对应的 P0 的编码

然后根据独立按键,改变数组下标,就可以达到改变数码管显示的字符的效果了。

共阴极数码管编码表

uchar code leddata[]={
	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  //熄灭
	};


遇到点问题

报错是说找不到 nop 这个指令的声明
其实 nop 空操作 8051 NOP 指令 是定义在 INTRINS.H 这个头文件里的
加上头文件 #include <INTRINS.H> 就OK了

完整代码

#include <REGX52.H>
#include <INTRINS.H>

unsigned char data_total = 23;
unsigned char led_data[]={
	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  
	};


void Delay1ms()		//@11.0592MHz
{
	unsigned char i, j;

	_nop_();
	i = 2;
	j = 199;
	do
	{
		while (--j);
	} while (--i);
}

void Delay(int t){
    int i = 0;
    for(i=0;i<t;i++){
        Delay1ms();
    }
}

void main()
{
    unsigned char data_pos = 0;
    P2_2 = 0;
    P2_3 = 0;
    P2_4 = 0;
    
     P0 = led_data[data_pos];
     while(1){

        if(0 == P3_1){

            Delay(10);

            while(0 == P3_1){
                //nop
            }
            Delay(10);  

            data_pos++;
            if(data_total == data_pos){
                data_pos = 0;
            }
            P0 = led_data[data_pos];
        }
       
        
        Delay(500);
    }
}
posted @ 2025-03-28 21:19  lucky_doog  阅读(76)  评论(0)    收藏  举报