赞
踩
数码管原理图:
共阳极数码管需要给低电平数码管才会点亮,共阴极数码管需要给高电平才会点亮。在数码管的中的字码a代表低位,dp代表高位,也就是a代表(2^0) dp代表(2^7)。
共阴极显示16进制所有数字代码:
0: 0x3F ( abcdef = 0011 1111 )
1: 0x06
2: 0x5B
3: 0x4F
4: 0x66
5: 0x6D
6: 0x7D
7: 0x07
8: 0x7F
9: 0x6F
A: 0x77
B: 0x7C
C: 0x39
D: 0x5E
E: 0x79
F: 0x71
(2)数码管锁存模块:
为了方便数据存储需要将数码管数据进行锁存,锁存分为2种:位锁存,段锁存。
位锁存:在单片机数码管中有8位,需要使用芯片来锁存中要显示的具体哪一位数码管。在上面的芯片中是用来锁存位的,WE1代表低位,WE8代表高位。在位锁存中低电平有效。
74HC537芯片介绍:芯片中锁存开关位LE引脚,高电平开启锁存,低电平锁住数据。芯片的其他功能还有中继信号等作用。
锁存使用第二行,中继信号使用第一行。
段锁存:下面那个芯片代表段锁存,段锁存作用是锁住具体要在数码管中显示的数据。列如:我们将位锁存锁住以后就要开启P2-6引脚下面的段锁存,虽然两个芯片D段引脚在单片机中使用的相同,但是位锁存已经被锁存在第一个芯片之中,修改引脚数据不会发生变化,但是段选与位选的锁存引脚是不相同的。
#include <REGX52.H> #define unsigned int uint; #define unsigned int uint; sbit duan = P2^6;//高电平有效,当开启段选以后可以控制数码管中那一根数码管 sbit wei = P2^7; //高电平有效,当开启位选可以控制8位数码管显示那一位 void main(){ //显示哪一个数码管 wei = 1; //打开位选,修改显示的数码管 P0 = 0xFD;// 1111 1101 低电平有效 让第二位数码管显示 wei = 0;//进行数据锁存 //数码管中具体显示的内容 duan = 1; P0 = 0x5B;//0-9:0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F duan = 0; }
动态数码管的思想是将静态数码管进行封装,然后修改显示的数据。
#include <REGX52.H> #define uint unsigned int #define uchar unsigned char sbit duan = P2^6; sbit wei = P2^7; //code代表不能被修改,共阴极数码管显示 0-9 uchar code LED[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; //毫秒级延时 void dely( uint z ){ uint x,y; for(x = z;x > 0;x--){ for(y = 114; y > 0;y--); } } void play(uint n){ uint ge,shi,bai; //输入3位数,分别得出百十个位 bai = n / 100; shi = n / 10 % 10; ge = n % 10; //第一位(百位) P0 = 0xFF;//清除断码 wei = 1; P0 = 0xFE;//显示第一位 wei = 0; duan = 1; P0 = LED[bai]; duan = 0; dely(5); //第二位(十位) P0 = 0xFF;//清除断码 wei = 1; P0 = 0xFD;//显示第二位 wei = 0; duan = 1; P0 = LED[shi]; duan = 0; dely(5); //第三位(个位) P0 = 0xFF;//清除断码 wei = 1; P0 = 0xFB;//显示第三数码管 wei = 0; duan = 1; P0 = LED[ge]; duan = 0; dely(5); } void main(){ while(1){ play(521); } }
这个主要使用的是使用独立按键来操控数码管的加减。
当按键被按下时,电路接口为0,此时可以检测哪一个电路引脚接口为0,说明哪一个接口被按下。
按键消抖:
if(K1 == 0){
dely(20); //延时20毫秒是将按键贴片来回跳动的部分给消除
if(KE1 == 0){//此时按键贴片不会出现来回跳动,只会平稳接触。
消抖完成。
}
}
松手检测:
if( KEY_S2 == 0){ //S2按键按下数值增加
dely(20);//按键延时消抖
if(KEY_S2 == 0){
while(!KEY_S2); //松手检测
}
}
松手检测的作用:是保持我们按键在处于按下的时候只执行代码块中的数据,如果不使用松手检测,
当按键一直按下的时候,执行完代码快中的数据就会跑到别的函数中
完整代码:
#include <REGX52.H> #define uint unsigned int #define uchar unsigned char sbit duan = P2^6; sbit wei = P2^7; sbit KEY_S2 = P3^0; sbit KEY_S3 = P3^1; uchar code LED[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; //毫秒延时 void dely( uint z ){ uint x,y; for(x = z;x > 0;x--){ for(y = 114; y > 0;y--); } } void play(uint n){ P0 = 0xFF;//显示第一位 wei = 1; P0 = 0xFE;// wei = 0; duan = 1; P0 = LED[n]; duan = 0; dely(5); } void main(){ uchar number = 0; while(1){ if( KEY_S2 == 0){ //S2按键按下数值增加 dely(20);//按键延时消抖 if(KEY_S2 == 0){ number++; if(number == 10){ number = 9; } while(!KEY_S2); //松手检测 } } if( KEY_S3 == 0){ //S3按键按下数值减少 dely(20);//按键延时消抖 if(KEY_S3 == 0){ if(number > 0){ number--; //注意如果到0在减就会变成255,因为char适0-255 } while(!KEY_S3); } } play(number); } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。