单片机数码管显示原理与实现方法详解
文章目录
前言:
本文章以B站江科大老师的视频而写,仅作为笔记,以便以后参考
数码管显示
1.静态数码管显示
#include <REGX52.H>
void main() {
//选中LED6(对应Y5)101
// P2_4 = 1;
// P2_3 = 0;
// P2_2 = 1;
//选中LED5(对应Y4)100
P2_4 = 1;
P2_3 = 0;
P2_2 = 0;
//0111 1101(显示6)
P0 = 0X7D;
while(1) {
}
}
实现了对应的数码管位置点亮对应的数字。
2.静态数码管显示Plus
#include <REGX52.H>
//0-9段码
unsigned char NixieTable[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x6F};
void Nixie(unsigned char loc, num){
switch(loc)
{
case 1:
P2_4 = 1;P2_3 = 1;P2_2 = 1;break;
case 2:
P2_4 = 1;P2_3 = 1;P2_2 = 0;break;
case 3:
P2_4 = 1;P2_3 = 0;P2_2 = 1;break;
case 4:
P2_4 = 1;P2_3 = 0;P2_2 = 0;break;
case 5:
P2_4 = 0;P2_3 = 1;P2_2 = 1;break;
case 6:
P2_4 = 0;P2_3 = 1;P2_2 = 0;break;
case 7:
P2_4 = 0;P2_3 = 0;P2_2 = 1;break;
case 8:
P2_4 = 0;P2_3 = 0;P2_2 = 0;break;
}
P0 = NixieTable[num];
}
void main()
{
Nixie(7,2);
while(1) {
}
}
静态数码管显示进阶版,可以实现直接输入数码管位置和显示的数字(但只能显示一个数码管数字,显示多个需要动态数码管)
3.动态数码管显示
#include <REGX52.H>
#include <INTRINS.H>
//0-9段码
unsigned char NixieTable[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x6F};
void Delay(unsigned int xms)
{
unsigned char i, j;
while(xms--) {
_nop_();
_nop_();
_nop_();
i = 11;
j = 190;
do
{
while (--j);
} while (--i);
}
}
void Nixie(unsigned char loc, num){
switch(loc)
{
case 1:
P2_4 = 1;P2_3 = 1;P2_2 = 1;break;
case 2:
P2_4 = 1;P2_3 = 1;P2_2 = 0;break;
case 3:
P2_4 = 1;P2_3 = 0;P2_2 = 1;break;
case 4:
P2_4 = 1;P2_3 = 0;P2_2 = 0;break;
case 5:
P2_4 = 0;P2_3 = 1;P2_2 = 1;break;
case 6:
P2_4 = 0;P2_3 = 1;P2_2 = 0;break;
case 7:
P2_4 = 0;P2_3 = 0;P2_2 = 1;break;
case 8:
P2_4 = 0;P2_3 = 0;P2_2 = 0;break;
}
P0 = NixieTable[num];
//防止错乱,清段选
Delay(1);
P0 = 0X00;
}
void main()
{
while(1) {
Nixie(1,1);
Delay(20);
Nixie(2,2);
Delay(20);
Nixie(3,3);
Delay(20);
Nixie(4,4);
}
}
可以实现显示多个数码管
加入记忆:
0001 1000 & 0000 1010 -> 0000 1000 //与运算
0001 1000 | 0000 1010 -> 0011 1010 //或运算
0001 1000 ^ 0000 1010 -> 0011 0010 //与或运算