/*数码显示总是有一些不是很亮的块出现,实在找不到原因,单独显示一个数码管正常,超过两个显示就出问题,什么重影、消隐都试过了就是找不到问题原因,已经困扰我3天了!!!*/
- #include <reg52.h>
- #define uchar unsigned char
- void show_num(uchar num,uchar wela_num);//数数码管显示指定数字【0-9】,参数二为位选数值
- int num;
- uchar code num_table[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//数字编码表
- uchar code wela_tab[6] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf};//位选表
- uchar aa = 0x80;//数码管编码与本变量位或,则增加小数点
- uchar min, sec,ten_ms;//分、秒、10毫秒
- sbit dula = P2^6;
- sbit wela = P2^7;
- int main(void)
- {
- uchar i,j;
- int a=100; //延时用
- uchar min_temp,sec_temp,ten_temp;
- dula = 0;
- wela = 0;
- EA = 1;
- TMOD = 0x01;//使用16位定时器
- ET0 = 1;
- TR0 = 1;
- TH0 = (65536-9174)/256;//定时器初始值,,11.0592MHz晶振,定时10毫秒
- TL0 = (65536-9174)%256;
- while(1)
- {
- min_temp = min;
- sec_temp = sec;
- ten_temp = ten_ms;
- a=800;
- while(a--)
- {
- i=min_temp/10;
- j=min_temp%10;
- show_num(num_table[i],wela_tab[0]);
- show_num(num_table[j]|aa,wela_tab[1]);
- i=sec_temp/10;
- j=sec_temp%10;
- show_num(num_table[i],wela_tab[2]);
- show_num(num_table[j]|aa,wela_tab[3]);
- i=ten_temp/10;
- j=ten_temp%10;
- show_num(num_table[i],wela_tab[4]);
- show_num(num_table[j]|aa,wela_tab[5]);
- }
- }
- }
- void show_num(uchar num,uchar wela_num)//数数码管显示指定数字【0-9】,参数二为位选数值
- {
- /*P0 = 0xff;
- wela = 1;
- P0 = wela_tab[0];//wela_num;
- wela = 0;
- P0 = 0x00;
- dula = 1;
- P0 = num_table[0];//num;
- dula = 0; */
- P0 = 0xff;
- wela = 1;
- P0 = wela_num;
- wela = 0;
- P0 = 0x00;
- dula = 1;
- P0 = num;//num;
- dula =0;
- }
- void svtime(void) interrupt 1 //定时器0中断服务程序
- {
- TH0 = (65536-9174)/256;//定时器初始值,,11.0592MHz晶振,定时10毫秒
- TL0 = (65536-9174)%256;
- ten_ms++;
- if(ten_ms == 100)
- {
- ten_ms = 0;
- sec++;
- }
- if(sec == 60)
- {
- min++;
- sec = 0;
- }
- if(min == 60)
- {
- sec = 0;
- ten_ms = 0;
- min = 0;
- }
- }
复制代码 |