作业4:独立按键+数码管实操

1. 测试代码照片

2. 流水灯视频

#include <reg51.h>   // 包含51单片机的特殊功能寄存器定义
#define uchar unsigned char  // 定义 uchar 为 unsigned char 类型,方便使用

uchar a;  // 定义全局变量 a,用来保存当前灯的状态

// ------------------------------
// 函数:delay()
// 作用:实现简单的延时
// ------------------------------
void delay(unsigned int time) 
{
    unsigned int i, j;
    for (i = 0; i < time; i++)
    {
        for (j = 0; j < 120; j++);
    }       
}

// ------------------------------
// 主函数:main()
// 作用:以移位方式控制 P0 口实现流水灯
// ------------------------------
void main() 
{
    P1 = 0xfe;  // 初始化:P0 = 1111 1110(二进制),点亮第一个灯(假设低电平点亮)
    while (1) 
    {
        a = P1;        // 读取当前P0口的灯状态,1111 1110保存到变量a中
        a = a << 1;    // 左移一位,灯光往左移。例如:(1111 1110 << 1) = 1111 1100
        a = a | 0x01;  // 将最低位强制置为1,防止全0。例如:1111 1100 | 0000 0001 = 1111 1101
        delay(300);    // 延时一段时间,实现灯的停留视觉效果
        if (a == 0xff) // 如果所有灯都亮了(1111 1111),表示移到了尽头
        {
            a = 0xfe;  // 重置为初始值:1111 1110(只点亮第一个灯)
        }
        P1 = a;        // 输出新的灯状态到P0口
    }
}

3. 独立按键视频(点亮4个灯)

#include <REGX51.H>

// 定义按键
sbit KEY1 = P3^4;
sbit KEY2 = P3^5;
sbit KEY3 = P3^6;
sbit KEY4 = P3^7;

// 定义所有用到的LED(补上你没定义的)
sbit LED1 = P1^0;  // D1
sbit LED2 = P1^1;  // D2
sbit LED3 = P1^2;  // D3
sbit LED4 = P1^3;  // D4
sbit LED5 = P1^4;  // D5
sbit LED6 = P1^5;  // D6
sbit LED7 = P1^6;  // D7
sbit LED8 = P1^7;  // D8

// 延时函数
void delay_ms(unsigned int ms) {
    unsigned int i, j;
    for(i = 0; i < ms; i++)
        for(j = 0; j < 123; j++);
}

void main() {
    P1 = 0xFF;  // P1 口所有LED初始熄灭(低电平点亮)

    while(1) {
        // KEY1 控制 D1、D2 同时翻转
        if(KEY1 == 0) {
            delay_ms(20);
            if(KEY1 == 0) {
                while(KEY1 == 0);  // 等待按键松开
                LED1 = ~LED1;
            }
        }

        // KEY2 控制 D3、D4 同时翻转
        if(KEY2 == 0) {
            delay_ms(20);
            if(KEY2 == 0) {
                while(KEY2 == 0);
                LED3 = ~LED3;
            }
        }

        // KEY3 控制 D5、D6 同时翻转
        if(KEY3 == 0) {
            delay_ms(20);
            if(KEY3 == 0) {
                while(KEY3 == 0);
                LED5 = ~LED5;
            }
        }

        // KEY4 控制 D7、D8 同时翻转
        if(KEY4 == 0) {
            delay_ms(20);
            if(KEY4 == 0) {
                while(KEY4 == 0);
                LED7 = ~LED7;
            }
        }
    }
}

4. 独立按键视频(点亮8个灯)

5. 数码管显示“000000”或者“111111”

在这里插入图片描述

6. 数码管显示“123456”

在这里插入图片描述

7. 数码管显示“11.12.13”

在这里插入图片描述

8. 数码管显示“HH8800”

在这里插入图片描述

#include<reg52.h>

typedef unsigned int u16;
typedef unsigned char u8;

sbit dula = P2^6;
sbit wela = P2^7;

// 段码表:0~9 , H(0x76)
u8 code table[] = {
    0x3f, // 0
    0x06, // 1
    0x5b, // 2
    0x4f, // 3
    0x66, // 4
    0x6d, // 5
    0x7d, // 6
    0x07, // 7
    0x7f, // 8
    0x6f, // 9
    0x76  // H
};

void delay(u16 i)
{
    while(i--);
}

void main()
{
    while(1)
    {
        // 第1位 H
        wela=1; P0=0xfe; wela=0; P0=0xff;
        dula=1; P0=table[10]; dula=0; delay(100);

        // 第2位 H
        wela=1; P0=0xfd; wela=0; P0=0xff;
        dula=1; P0=table[10]; dula=0; delay(100);

        // 第3位 8
        wela=1; P0=0xfb; wela=0; P0=0xff;
        dula=1; P0=table[8]; dula=0; delay(100);

        // 第4位 8
        wela=1; P0=0xf7; wela=0; P0=0xff;
        dula=1; P0=table[8]; dula=0; delay(100);

        // 第5位 0
        wela=1; P0=0xef; wela=0; P0=0xff;
        dula=1; P0=table[0]; dula=0; delay(100);

        // 第6位 0.  带小数点 或运算 0x80
        wela=1; P0=0xdf; wela=0; P0=0xff;
        dula=1; P0=table[0] | 0x80; dula=0; delay(100);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值