使用汇编语言。用8051控制四位七段共阴极数码管。P2口控制段选(因为共阴,高电平有效,经74ls573锁存器拉高电流)。P00,P02,P03和P04分别控制四个位选(低有效),要显示的数据存在LED_1到LED_4中(需要转化成十进制)。
希望跟高手多交流。北京地区为佳。
详情请联系shuyingmu@sohu.com
QQ:70820244
ps:这个程序比较急,小弟先拜谢!
这位大哥 我现在急需啊 ~!~!~!
帮忙给我发过来好不好 QQ :83621422 多谢了
主程序中要设置一个时钟中断比如T0,中断程序比如下面这样:
timer_int () interrupt 1 /* T0中断 */
{ TH0=CON_MSH; /* 3.125mS时间常数 */
TL0=CON_MSL; /* 3.125mS时间常数 */
ms_timer++; /* 3.125mS计数器(320Hz) */
led_cur++;
if(led_cur> =led_bright) led_cur=0;
led_scan(); /* 12.5mS循环一次(80Hz) */
if((ms_timer&0x1f)==0) /* 每0.1S一次 */
{ clk_s++; /* 0.1S计数器 */
led_dis = (led_dis^0xff)&led_flash; /* LED闪烁 */
}
}
主程序中作T0的初始化,比如下面这样:
TMOD=0x21; /* 置定时器1工作方式2,定时器0工作方式1 */
TH0=CON_MSH; /* 31.25mS时间常数 */
TL0=CON_MSL; /* 31.25mS时间常数 */
TR0=1; /* 启动定时器0 */
ET0=1; /* 允许定时器0中断 */
EA=1; /* 允许中断 */
led_buf[0]=0xff;
led_buf[1]=0xff;
led_buf[2]=0xff;
led_buf[3]=0xff;
led_enable=1;
在要调用显示的程序中可以如下定义:
extern bit led_enable; /* 允许显示 */
extern unsigned char led_bright; /* LED显示亮度(最少为显示总位数,越大越暗) */
extern unsigned char led_flash; /* 显示闪烁控制(为1的位闪烁5Hz) */
extern unsigned char led_buf[4]; /* 显示缓冲(4字节) */
extern unsigned char led_dis; /* 当前显示标志(内部使用) */
extern unsigned char led_cur; /* 当前显示扫描(内部使用) */
extern void led_scan(void); /* LED显示扫描(应放入时钟中断内) */
extern char led_code(char); /* LED显示译码 */
显示时如下写就可以了:
led_buf[n]=led_code(c); /* n(0-3)是位数,c是要显示的字符 */
如果象这样写一个putchar函数,甚至可以在程序中使用printf来显示数据:
char putchar (unsigned char c)
{ bit btmp;
if(c <0x80)
{ if(c=='.')
led_buf[3]&=0x7f;
else
{ led_buf[0]=led_buf[1];
led_buf[1]=led_buf[2];
led_buf[2]=led_buf[3];
led_buf[3]=led_code(c);
}
}
}
下面是LED4.C的源代码:
/* 4位数码管显示操作接口函数
魏东 tonywei@tom.com */
#include "main.h"
bit led_enable; /* 允许显示 */
unsigned char led_bright=5; /* LED显示亮度(最少为显示总位数,越大越暗) */
unsigned char led_flash=0; /* 显示闪烁控制(为1的位闪烁5Hz) */
unsigned char led_buf[4]; /* 显示缓冲(4字节) */
unsigned char led_dis; /* 当前显示标志(内部使用) */
unsigned char led_cur; /* 当前显示扫描(内部使用) */
void led_scan(void); /* LED显示扫描(应放入时钟中断内) */
char led_code(char); /* LED显示译码 */
/* LED显示扫描(应放入时钟中断内) */
void led_scan(void)
{ unsigned char cseg;
LED_PSEG=0xff; /* 先关段显示 */
LED_PDN1=1; /* 所有的位都不选 */
LED_PDN2=1;
LED_PDN3=1;
LED_PDN4=1;
if(led_enable)
{ cseg = led_buf[led_cur&0x03]; /* 显示段 */
if((led_cur==0)&&((led_dis&1)==0))
{ LED_PDN1=0; /* 选通位1 */
LED_PSEG=cseg;
}
else if((led_cur==1)&&((led_dis&2)==0))
{ LED_PDN2=0; /* 选通位2 */
LED_PSEG=cseg;
}
else if((led_cur==2)&&((led_dis&4)==0))
{ LED_PDN3=0; /* 选通位3 */
LED_PSEG=cseg;
}
else if((led_cur==3)&&((led_dis&8)==0))
{ LED_PDN4=0; /* 选通位4 */
LED_PSEG=cseg;
}
}
}
/* LED显示译码 */
char led_code(char led_ci)
{ char code cd1[16] = { 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xa7,0xa1,0x86,0x8e };
if((led_ci> ='0')&&(led_ci <='9')) return cd1[led_ci-'0'];
if((led_ci> =0)&&(led_ci <=15)) return cd1[led_ci];
if((led_ci> =0x10)&&(led_ci <0x18)) return (1 < <(led_ci&0x07))^0xff;
switch(led_ci)
{ case 'a':
case 'A': return 0x88;
case 'b':
case 'B': return 0x83;
case 'c':
case 'C': return 0xa7;
case 'd':
case 'D': return 0xa1;
case 'e':
case 'E': return 0x86;
case 'f':
case 'F': return 0x8e;
case '.': return 0x7f;
case '!': return 0x7d;
case '=': return 0xb7;
case '-': return 0xbf;
case '(':
case '[': return 0xc6;
case ')':
case ']': return 0xf0;
case 'g':
case 'G': return 0xc2;
case 'h':
case 'H': return 0x89;
case 'i':
case 'I': return 0xcf;
case 'j':
case 'J': return 0xf1;
case 'l':
case 'L': return 0xc7;
case 'n':
case 'N': return 0xc8;
case 'o':
case 'O': return 0xa3;
case 'p':
case 'P': return 0x8c;
case 'r':
case 'R': return 0xaf;
case 's':
case 'S': return 0x92;
case 't':
case 'T': return 0x87;
case 'u':
case 'U': return 0xc1;
case 'y':
case 'Y': return 0x91;
default: return 0xff;
}
}