- #include <reg51.h>
- sbit P00 = P0 ^ 0;
- sbit P01 = P0 ^ 1;
- sbit P02 = P0 ^ 2;
- sbit P03 = P0 ^ 3;
- int DATA_LED[11] =
- {
- //0~9的数码管段码 A0H,BBH,62H,2AH,39H,2CH,24H,BAH,20H,28H 根据具体电路而定,不通用
- 0xA0, //0
- 0xBB, //1
- 0x62, //2
- 0x2A, //3
- 0x39, //4
- 0x2C, //5
- 0x24, //6
- 0xBA, //7
- 0x20, //8
- 0x28, //9
- 0xFF
- };
- void delay(int m) //延时程序,延时m*0.5毫秒
- {
- unsigned int i;
- unsigned int j;
- for (i = 0; i < m; i++)
- {
- for (j = 0; j < 500; j++){}
- }
- }
- void led(int n) //数码管显示及数据处理程序
- {
- P1 = 0xFF;
- P1 = DATA_LED[n % 10]; //个位
- P00 = 0;
- delay(1);
- P00 = 1;
- P1 = 0xFF;
- P1 = DATA_LED[n / 10 % 10]; //十位
- P01 = 0;
- delay(1);
- P01 = 1;
- P1 = 0xFF;
- P1 = DATA_LED[n / 100 % 10]; //百位
- P02 = 0;
- delay(1);
- P02 = 1;
- P1 = 0xFF;
- P1 = DATA_LED[n / 1000 % 10]; //千位
- P03 = 0;
- delay(1);
- P03 = 1;
- }
- void main(void)
- {
- while (1)
- {
- led(404); //显示数字404,实际显示的是0404,需要在led()函数中判断,没有千位的情况,不是让显示成0
- }
- }
原理很简单,这是LED动态显示方式, 当P1为高电平,P0为低电平是,灯就亮。显示写成了函数led(),调用很方便,这个还没有解决小数的问题,不过,把原理弄懂了,其他的理解起来就会很快了。
我这里是给P1赋值, 例如P1=0xBB,换成二进制,P1=10111011,可以看出刚好是八位,那P1^0=1;P1^1=1,P1^2=0…… ,不用分别给每个口赋值,把这个理解了就懂了。
P1 = 0xFF; //每次一定要重新赋值,不然可能会出现显示全是8的情况
P1 = DATA_LED[n / 1000 % 10]; //千位的数字对应的数码管段码
P03 = 0; //前面有定义 sbit P03 = P0 ^ 3,就是把P0.3接低电平
delay(1); //采用空循环执行延时1*0.5毫秒,再关闭显示下一位,利用人眼的视觉滞留,这种动态变换就感觉不到了,12MHz的晶体振荡器
P03 = 1; //每次显示完了一定要接高电平,不然会显示成全是8
wb_chen_387386550 2018-8-18 07:57