|
内容:循环显示十六进制数0~F- #include "reg52.h"
- sbit EnWei =P2^7; //位码锁存器使能端
- sbit EnSeg =P2^6; //段码锁存器使能端
- #define DATAPORT (P0) //段/位码输出端口
- #define WEICODE (0x7f) //位码初始值
- #define OFFCODE (0xff) //定义熄灭码
- #define INCSPEED (10) //显示内容变化速度
- unsigned char code SegTab[]={ //定义段码表(共阴极)
- 0x3f,0x06,0x5b,0x4f,
- 0x66,0x6d,0x7d,0x07,
- 0x7f,0x6f,0x77,0x7c,
- 0x39,0x5e,0x79,0x71
- };
- unsigned char DispBuf[8]={ //定义显示缓冲区
- 0x00,0xff,0xff,0xff,
- 0xff,0xff,0xff,0xff
- };
- //延时函数
- //x为延时时间,范围1~65535
- void xDelay(unsigned int x)
- {
- unsigned char y;
- for(;x>0;x--)
- for(y=110;y>0;y--);
- }
- //数值分离函数,将要显示的数各数值位分离到DispBuf数组中
- //x为要显示的数,范围0~4294967295
- void GetDispBufValue(unsigned long x)
- {
- unsigned char Temp,i;
- i=0; //作为DispBuf数组的下标
- while(x>0)
- {
- Temp=x%10; //使x对10求余,取出最低位
- x/=10; //更改x的值,为下一轮作准备
- DispBuf[i++]=Temp; //将取出的数值位存入显示缓冲
- }
- while(i<8) //如果x不足8位,将其余的位填上熄灭码
- {
- DispBuf[i++]=OFFCODE;
- }
- }
- //显示函数
- //x要显示的值,范围0~4294967295
- void Display(unsigned long x)
- {
- unsigned char WeiCode=WEICODE,i;
- GetDispBufValue(x); //先将显示值的数值位分离出来
- for(i=0;i<8;i++) //循环刷新每一位数码管
- {
- if(DispBuf[i]!=OFFCODE)
- {
- DATAPORT=SegTab[DispBuf[i]]; //输出段码并锁存
- EnSeg=1;
- EnSeg=0;
- DATAPORT=WeiCode; //输出位码并锁存
- EnWei=1;
- EnWei=0;
- }
- WeiCode>>=1; //为下一位数值准备位码
- WeiCode|=0x80;
- xDelay(5); //延时一会,使刚被点亮的位稳定
- }
- DATAPORT=0x00; //熄灭最后一位被点亮的数码管
- EnSeg=1;
- EnSeg=0;
- }
- void main(void)
- {
- unsigned char IncSpeed=INCSPEED;
- unsigned long x=76543210;
- P2=0x00;
- while(1){
- Display(x); //调用显示函数
- //if(--IncSpeed==0) //减到0时,为显示数值加1
- //{
- // IncSpeed=INCSPEED; //恢复初值,为下一轮作准备
- //x++; //显示数值加1
- //}
- }
- }
复制代码
|
|