实验程序:让数码管第一秒第一位亮1,过一秒第二位亮2,如此类推。
程序如下:
#include                                     //定义头文件
#define uint unsigned int                             //定义变量类型
#define uchar unsigned char                       //定义变量类型
uchar aa,numdu,numwe;                            //变量声明
sbit dula=P2^6;                        //定义段选
sbit wela=P2^7;                                         //定义位选
 
uchar code table[]={                   //段选数组
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,
};                                                     
uchar code tablewe[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};   //位选数组
 
void main()                                                                           //主函数开始
{
       numdu=0;                           //段选清零
       numwe=0;                           //位选清零
       aa=0;                   //变量aa清零
       TMOD=0x01;                             //规定定时器工作方式
       TH0=(65536-50000)/256;
       TL0=(65536-50000)%256;       //给定时器赋初值50毫秒
    EA=1;                        //总中断开
       ET0=1;                       //定时器0中断开
       TR0=1;                       //定时器0开始工作
 
 
 
 
       while(1)                       //主循环开始
       {
              if(aa==20)                  //如果aa进行了20次中断也就是延时了1秒钟
              {
                     aa=0;
                     numdu++;               //段选加1,从1开始变化
                     if(numdu==7)            //如果段选从1变到6
                            numdu=1;                     //段选变回1
                            dula=1;              //段选开
                            P0=table[numdu];     //讲段选值1送给P0口显示
                            dula=0;                         //段选关
                            wela=1;              //位选开
                            P0=tablewe[numwe];   //讲位选0位送P0口,只让第一位亮
                            wela=0;                        //位选关
                            numwe++;                    //一秒后位选加1
                            if(numwe==6)
                                   numwe=0;        //位选变到第6位后回到第一位显示
              }
       }
}
 
void time0() interrupt 1                 //中断函数
{
       TH0=(65536-50000)/256;                  
       TL0=(65536-50000)%256;                  //中断函数初值
       aa++;
             
}
 
此程序完成的功能就是让数码管间隔一秒从左往右显示1~6的数字
间隔的1秒钟时间采用了定时器延时
如果将间隔的时间调短,当时间短到人眼的余晖24MS内时,看到的就是固定不变的123456了
其实数字在不停的闪烁移动。这就是所谓的动态扫描
可能是因为显示器刷新率的原因 间隔时间调的非常短以后仿真会因为速度太快而无法显示。

实验程序:让数码管显示12 动态扫描用延时函数延时
程序:
#include                                     定义头文件
 
#define uint unsigned int
#define uchar unsigned char                       定义变量
 
uchar numdu,temp,shi,ge;                          声明变量
 
sbit dula=P2^6;
sbit wela=P2^7;                                         定义段选、位选
 
uchar code table[]={                                  数码显示表
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,
};
 
void delay(uint z);                                      子程序声明
 
 
void main()                                               主函数
{
       temp=12;                                           让变量temp等于12
       numdu=0;                        段选清零
    while(1)                                            主循环
       {
              shi=temp/10;
              ge=temp%10;                             十位、个位分离
 
              dula=1;
              P0=table[shi];                             把十位数对应的编码送给P0口
              dula=0;
 
              wela=1;
              P0=0xfe;                                    让十位的数码管亮
              wela=0;
              delay(40);                                   延时一会
 
             dula=1;
              P0=table[ge];                 把个位数对应的编码送给P0口
              dula=0;
 
              wela=1;
              P0=0xfd;                                    让个位的数码管亮
              wela=0;
              delay(40);                                   延时一会
       }
    
}
 
void delay(uint z)                            延时子程序
{
       uint x,y;
       for(x=z;x>0;x--)
              for(y=110;y>0;y--);      
}
PROTEUS视频演示
 
注意:由于temp定义成了uchar型变量所以他的最高取值范围是255 。
 
还可以把显示函数做成子程序用来调用
实验程序:让数码管显示152
程序如下:
#include                                     定义头文件
 
#define uint unsigned int
#define uchar unsigned char                       定义变量
 
uchar numdu,temp,shi,ge;                          声明变量
 
sbit dula=P2^6;
sbit wela=P2^7;                                         定义位选、段选
 
uchar code table[]={                                  数码管显示表
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,
};
 
void delay(uint z);                                            声明延时子程序
void display (uchar bai,uchar shi,uchar ge);         声明显示子程序
 
 
void main()                                                      主程序
{
       temp=152;                                                让temp等于152
       numdu=0;                                                 段选清零
bai=temp/100;
       shi=temp%100/10;
       ge=temp%10;                                           将百位、十位、个位清零
    while(1)                                                   开始主循环
       {  
         display(bai,shi.ge);                              调用显示子程序
 
       }
    
}
 
void delay(uint z)                                   延时子程序
{
       uint x,y;
       for(x=z;x>0;x--)
              for(y=110;y>0;y--);      
}
void display (uchar bai,uchar shi,uchar ge);         显示子程序
{
           dula=1;
              P0=table[bai];
              dula=0;
 
              wela=1;
              P0=0xfe;
              wela=0;
              delay(5);
 
             dula=1;
              P0=table[shi];
              dula=0;
 
              wela=1;
              P0=0xfd;
              wela=0;
              delay(5);
 
              dula=1;
              P0=table[ge];
              dula=0;
 
              wela=1;
              P0=0xfb;
              wela=0;
              delay(5);
}
实验程序:让数码管显示个、十、百位,从0~200隔一秒加一
程序如下:
#include               定义头文件
 
#define uint unsigned int
#define uchar unsigned char        定义变量
 
uchar  aa,temp,bai,shi,ge;                  声明变量
 
sbit dula=P2^6;
sbit wela=P2^7;                                  定义段选、位选
 
uchar code table[]={                           数码管显示表
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,
};
 
void delay(uint z);                                   延时子程序声明
void display(uchar bai,uchar shi,uchar ge);    显示子程序声明
void init();                              初始化子程序声明
 
void main()                                              
{
       init();//初始化子程序
 
       while(1)
       {
              if(aa==20)                        如果aa=20进行了20次中断也就是1秒钟
                     {     aa=0;
                            temp++;                              temp值加1
                            if(temp==200)            加到200返回
                                   {
                                   temp=0;
                                   }
                            bai=temp/100;
                            shi=temp%100/10;
                            ge=temp%10;              个十百位分离
                     }
         display(bai,shi,ge);                    调用显示子程序
       }
}
 
void delay(uint z)              延时子程序
{
       uint x,y;
       for(x=z;x>0;x--)
              for(y=110;y>0;y--);      
}
 
void display(uchar bai,uchar shi,uchar ge)      显示子程序
{
       dula=1;
       P0=table[bai];
       dula=0;
 
       wela=1;
       P0=0xfe;
       wela=0;
       delay(5);
 
    dula=1;
       P0=table[shi];
       dula=0;
 
       wela=1;
       P0=0xfd;
       wela=0;
       delay(5);
 
       dula=1;
       P0=table[ge];
       dula=0;
 
       wela=1;
       P0=0xfb;
       wela=0;
       delay(5);
}
void init()        初始化子程序
{
       temp=0;
       TMOD=0x01;
       TH0=(65536-50000)/256;
       TL0=(65536-50000)%256;
       EA=1;
       ET0=1;
       TR0=1;
}
void timer0() interrupt 1     定时器中断子程序
{
       TH0=(65536-50000)/256;
       TL0=(65536-50000)%256;
       aa++;
}
 
 阅读全文>>