2011_11_3单片机(四)

来源:互联网 发布:淘宝能申请信用卡吗 编辑:程序博客网 时间:2024/05/20 05:25
 

动态数码管显示
目的:同时显示多个不同字符串
原理:延时时间设为5ms(利用人眼反映时间差)
注意事项:
1.proteus调试,需设置系统-》设置动画选项
将原来默认的25 50m 50m 20 设置为50 5m 10u 12M 4[没单位的默认设置为1s]
2.实际应用时段选位选都需加锁存器,否则容易跳乱码。
duan=1;
P0=table_d[i];
duan=0;
wei=1;
P1=table_w[j];
wei=0;
3.设计如下代码时,注意将数限定在一定范围内,否则容易发生溢出。
j=(j+1)%3;
if(3==j)
{
  j=0;
}
动态数码管显示字符串的代码如下:
#include<reg52.h>
#include<intrins.h>

#define uchar unsigned char
#define uint unsigned long

void init();
void delay(uint a);
void display(uint num);

uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳
uchar code table_w[]={0x01,0x02,0x04};

uint num=998; 
uchar j=0;

sbit LE=P3^5;

uchar tt=0;

void main()
{
 init();
 while(1)
 {
  display(num);
  delay(5);//5ms
 }  
}

void delay(uint a)
{
 uint i,j;
 for(i=a;i>0;i--)
  for(j=20;j>0;j--);
}

void display(uint num)
{
 uchar i=0;
 uchar bai,shi,ge;
 P2=table_w[j]; //段选开关,负责给当前led灯加高电平(共阳极)
 //i=(i+1)%8;
 switch(j)
 {
  case 0:bai=num/100;i=bai;break;
  case 1:shi=num%100/10;i=shi;break;
  case 2:ge=num%10;i=ge;break;
  default:break; 
 }
 LE=1;  //段选加锁存器
 P0=table[i];//位选开关,负责给led灯显示数字
 LE=0;
 j=(j+1)%3;
 if(3==j)
 {
  j=0;
 }
}

void init()
{
 //设置定时器50ms中断一次,中断后,需将TH0、TL0置0
 TH0=(65536-50000)/256; //高8位50ms产生溢出
 TL0=(65536-50000)%256; //低8位50ms产生溢出

 //设置中断工作方式为模式1(16位自加器)
 TMOD=0x01; 

 EA=1;   //开总中断控制开关
 ET0=1;   //开定时器控制中断开关

 TR0=1;   //设置定时器0开启 
}

void timer0()interrupt 1
{
 if(20==tt)
 {
  tt=0;
  num++;
  if(1000==num)
  {
   num=0;
  }
 }
 tt++;
 
 //将TH0、TH1置0
 TH0=(65536-50000)/256;
 TL0=(65536-50000)%256;
}
//备注:实际应用时段选位选都需加锁存器,否则容易跳乱码
/*
duan=1;
P0=table_d[i];
duan=0;
wei=1;
P1=table_w[j];
wei=0;
*/