玩了很久的动态扫描,有些感触,对于单一的显示而言,这和方法为首选。然而如果程序功能较多,占用资源较大,势必造成显示出现闪烁,不友好。这时候需要考虑用静态显示或液晶代替。这里给出一个简单的静态显示方法,供参考。
单片机源程序如下:
- #include<reg52.h>
- #include<intrins.h>
- typedef unsigned int u16;
- typedef unsigned char u8;
- sbit shcp = P2^0;
- sbit ds = P2^1;
- sbit stcp = P2^2;
- sbit start_key = P3^0;
- sbit record_key = P3^1;
- //共阴极数码管0-9,如果某位后面是小数点,则该位编码 | 0x80,即可加上小数点
- u8 code seg_tab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x40};
- //定义用于暂存数字的数组
- u8 num_code[8];
- u16 num = 135,tmp;
- u8 i,j;
- void delay(u16 num)
- {
- u16 x,y;
- for(x=num; x>0; x--)for(y=113; y>0; y--){}
- }
- void int2code(u16 inum)
- {
- u8 i=0, n;
- u16 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];
- }
- }
- }
- //LED显示函数
- void display()
- {
- u8 i,j,a;
- for(j=0;j<3;j++)
- {
- a = num_code[7-j];
- for(i=0;i<8;i++)
- {
- ds=(a<<i)&0x80;
- shcp=0;
- _nop_();
- _nop_();
- shcp=1;
- }
- }
- stcp=0;
- _nop_();
- _nop_();
- stcp=1;
- }
- void main(void)
- {
- while(1)
- {
- if(num!=tmp)
- {
- int2code(num);
- display();
- tmp = num;
- }
- if (start_key == 0)
- {
- delay(10);
- if (start_key == 0)
- {
- num++;
- }
- while(!start_key);
- }
- if (record_key == 0)
- {
- delay(10);
- if (record_key == 0)
- {
- num--;
- }
- while(!record_key);
- }
- }
- }
复制代码
全部资料51hei下载地址:
数码管静态显示.rar
(79.91 KB, 下载次数: 15)
|