给你一个示例程序,0~F循环左移。
- #include<reg52.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit led138c=P2^4; //38译码器位选
- sbit led138b=P2^3; //38译码器位选
- sbit led138a=P2^2; //38译码器位选
- uchar code table[]={ //共阴极数码管段码0~F数组
- 0x3f,0x06,0x5b,0x4f,
- 0x66,0x6d,0x7d,0x07,
- 0x7f,0x6f,0x77,0x7c,
- 0x39,0x5e,0x79,0x71};
- uchar data dis_buf[9];//显示缓存
- /********************************
- ms延时程序
- ********************************/
- void delayms(uint k)
- {
- uint i,j;
- for(i=k;i>0;i--)
- for(j=110;j>0;j--);
- }
- /********************************
- 移位程序
- ********************************/
- void shift()
- {
- static uint count=0;
- static j=8;
- uchar i;
- if(++count>=500)//移动速度:计数0.5秒
- {
- count=0;
- dis_buf[8]=table[j]; //显示缓存第9位赋值
- for(i=0;i<8;i++) //显示缓存循序移位
- {
- dis_buf[i]=dis_buf[i+1];
- }
- j++;
- if(j>15)
- j=0;
- }
- }
- /********************************
- 数码管显示程序
- ********************************/
- void display()
- {
- static uchar i=0;
- P0=0x00; //消隐
- switch(i)
- {
- case 0:led138a=0;led138b=0;led138c=0;break;
- case 1:led138a=1;led138b=0;led138c=0;break;
- case 2:led138a=0;led138b=1;led138c=0;break;
- case 3:led138a=1;led138b=1;led138c=0;break;
- case 4:led138a=0;led138b=0;led138c=1;break;
- case 5:led138a=1;led138b=0;led138c=1;break;
- case 6:led138a=0;led138b=1;led138c=1;break;
- case 7:led138a=1;led138b=1;led138c=1;break;
- }
- P0=dis_buf[i];
- i++;
- i%=8;
- }
- /********************************
- 主程序
- ********************************/
- void main()
- {
- uchar i;
- for(i=0;i<8;i++)//缓存载入初始值
- {
- dis_buf[i]=table[i];
- }
- while(1)
- {
- shift();
- display();
- delayms(1);
- }
- }
复制代码
|