MCU 51-2 LED and Digital tube Test

点亮LED实验:

#include <reg52.h>
sbit LED1 = P1^0;
sbit LED2 = P1^1;
sbit LED8 = P1^7;
void main()
{
    LED1 = 0;
    LED2 = 0;
    LED8 = 0;
    while(1);    
}

流水:

#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint  unsigned int

//How to use the header file intrins.h 
//_crol_ 字符循环左移
//_cror_ 字符循环右移
//_nop_ 空操作8051 NOP 指令
//LED = _crol_(LED,1)执行一次后的结果为0x1111 1101
sbit LED1 = P1^0; uchar i; uchar temp; void delay(uint z) { uint x,y; for(x = z; x > 0; x--) for(y = 120; y > 0 ; y--); } void main() { temp = 0x7f;// 0111 1111 P1 = temp; while(1) { for(i = 0; i < 8; i++) { temp = _cror_(temp,1);//循环右移 P1 = temp; delay(1000); } } }

数码管静态显示:

LED显示器工作方式:静态显示与动态显示

静态显示的特点是每个数码管的段选必须接一个8位数据线来保持显示的字形码。当送入一次字形码后,显示字形可一直保持,直到送入新字形码为止。

动态显示的特点是将所有位数码管的段选线并联在一起,由位选线控制是哪一位数码管有效。选亮数码管采用动态扫描显示。所谓动态扫描显示即轮流向各位数码管送出字形码和相应的位选,利用发光管的余辉和人眼视觉暂留作用,使人的感觉好像各位数码管同时都在显示。

数码管外部结构:

数码管内部结构:

 

74HC573真值表:

#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint  unsigned int
sbit we = P2^7;//位选
sbit du = P2^6;//段选

//共阴极 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, //熄灭 0x00 //自定义 }; void delay(uint z) { uint x,y; for(x = z; x > 0; x--) for(y = 114; y > 0 ; y--); } void main() {
//将要显示的数值锁存在锁存器中 du
= 1; //打开段选 P0 = leddata[1]; du = 0; //关闭段选 //delay(5); //位选 we = 1;//打开位选 P0 = 0;//8位全部静态显示 we = 0; //关闭位选 while(1); }

uchar aa[5];
uchar code bb[5];
在以上语句中,数组aa[5]中的内容是存放在数据存储区(RAM)中的,在程序运行工程中各个数组元素的值可以被修改,掉电后aa[5]中的数据无法保存。
而数组bb[5]中的内容是存放在程序存储区(如flash)中的,只有在烧写程序时,才能改变bb[5]中的各元素的值,在程序运行工程中无法修改,并且掉电后bb[5]中的数据不消失。

数码管动态显示:

/*数码管循环显示0-9间隔500毫秒*/
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint  unsigned int
sbit we = P2^7;
sbit du = P2^6;

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,  //熄灭
                0x00  //自定义
                
                         };

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

void main()
{
                
        while(1)
        {
            we = 1;//打开位选
            P0 = 0xfe;//1111 1110 只选通第一位数码管
            we = 0;    //关闭位选

            du = 1;    //打开段选
            P0 = leddata[1];
            du = 0;    //关闭段选
            delay(5);//延时5毫秒
            
            we = 1;    //打开位选
            P0 = 0xfd;//1111 1101  只选通第二位数码管
            we = 0;    //关闭位选
            
            du = 1;//打开段选
            P0 = leddata[2]; //显示2
            du = 0;    //关闭段选
            delay(5);//延时5毫秒    
        }
}
//人眼的视觉停留效果,使人误以为两个同时亮

原文地址:https://www.cnblogs.com/darren-pty/p/13282972.html