提供一个正整数的数码管解决方案,供参考。- /*
- 本程序是在数码管上显示正整数的例程,显示数字长度不超过8位(需要定义无符号长整型变量)
- */
- #include <reg52.h>
- #include <math.h>
- #include <stdlib.h>
- #include <stdio.h>
- typedef unsigned char uint8; //8位无符号型
- typedef unsigned char uchar; //8位无符号型
- typedef unsigned int uint16;
- typedef unsigned long uint32;
- #define DATA P0
- sbit KEY_S2 = P3^0; //S2独立按键
- sbit KEY_S3 = P3^1; //S3独立按键
- sbit seg_sel = P2^6;
- sbit bit_sel = P2^7;
- //共阴极数码管0-9编码
- uchar code seg_tab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
- uchar code bit_tab[] = {0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};
- //将要被显示的数字(只要不是大于8位的正整数均可)
- uint32 birthday = 508;
- //用于保存数字对应数码管编码的数组
- uchar num_code[8] = {0};
- void delay(uint16 num)
- {
- uint16 x,y;
- for(x=num; x>0; x--) for(y=110; y>0; y--){}
- }
- //拆分整数到num_code数组
- void int2code(uint32 inum)
- {
- uint8 i=0, n;
- uint32 tmp = inum;
- for(i=0; i<8; i++)
- {
-
- if(tmp>0)
- {
- n = tmp % 10;
- tmp = (tmp-n) / 10;
- num_code[7-i] = seg_tab[n];
- }else{
- num_code[i] = 0x00;
- }
- }
- }
- //8位数码管显示函数
- void display(void)
- {
- uint8 j = 0;
- for (j=0; j<8; j++)
- {
- //移位
- bit_sel = 1;
- DATA = bit_tab[j];
- bit_sel = 0;
- //显数
- seg_sel = 1;
- DATA = num_code[j];
- delay(1);
-
- //消影(共阳极则为0xff,就是让所有数码管暂时不亮)
- DATA = 0x00;
- seg_sel = 0;
- }
- }
- void main(void)
- {
- while(1)
- {
- int2code(birthday);
-
- display();
-
- if (KEY_S2==0)
- {
- delay(10);
- if (KEY_S2==0){
- birthday++;
- }
- while(!KEY_S2);
- }
- }
- }
复制代码
|