点亮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毫秒 } }
//人眼的视觉停留效果,使人误以为两个同时亮