导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→诚征单片机高手,内详[geikie]

 *第31842篇: 诚征单片机高手,内详

  
楼 主:geikie 2005年5月29日15:23
 诚征单片机高手,内详
求一个很简单的程序:

使用汇编语言。用8051控制四位七段共阴极数码管。P2口控制段选(因为共阴,高电平有效,经74ls573锁存器拉高电流)。P00,P02,P03和P04分别控制四个位选(低有效),要显示的数据存在LED_1到LED_4中(需要转化成十进制)。

希望跟高手多交流。北京地区为佳。

详情请联系shuyingmu@sohu.com

QQ:70820244

ps:这个程序比较急,小弟先拜谢!

  
2楼:雾风 2005年5月30日18:36
 主程序:
……
显示子程序DISP:

主程序:
……
显示子程序DISP:MOV R1,#03H
               MOV R0,#LED_1
          DI1: MOV A,@R0
               DA A
               MOV DPTR,#7FFFH
               MOVX @DPTR,A
               ACALL DELAY
               INC R0
               MOV A DPH
               RR A
               MOV DPH A
               DJNZ R1,DI1
               RET
延时程序DELAY:MOV R2,#0AH
          DL1:MOV R3,+18H
          DL2:NOP  
              NOP 
              DJNZ R3,DL1
              DJNZ R2,DL2
              RET
  
3楼:eric393 2005年6月17日14:41
 [求助] 主程序~!~
使用汇编语言。用8051控制四位七段共阴极数码管。P2口控制段选(因为共阴,高电平有效,经74ls573锁存器拉高电流)。P00,P02,P03和P04分别控制四个位选(低有效),要显示的数据存在LED_1到LED_4中(需要转化成十进制)。

这位大哥  我现在急需啊  ~!~!~!
帮忙给我发过来好不好  QQ :83621422  多谢了

  
4楼:tonywei 2005年6月2日16:18
 一定要汇编吗?这里给你keil-C的源代码,可处理闪烁还可调整亮度,原创且超级好用。
在main.h中要有如下定义:
/* 定义使用的端口 */
//P_DAT EQU P0 ;显示7段码
sfr LED_PSEG = 0x80; /* 定义LED显示段a-g端口(P0) */
sbit LED_PDN1 = P1^0; /* LED显示位1 */
sbit LED_PDN2 = P1^1; /* LED显示位2 */
sbit LED_PDN3 = P1^2; /* LED显示位3 */
sbit LED_PDN4 = P1^3; /* LED显示位4 */
#define OSC_FREQ 7372800L  /* 根据实际晶体频率修改 */
#define CON_MSH ( 65536 - OSC_FREQ / 12 / 320 ) / 256 /* 3.125mS时间常数高字节 */
#define CON_MSL ( 65536 - OSC_FREQ / 12 / 320 ) % 256 /* 3.125mS时间常数低字节 */

主程序中要设置一个时钟中断比如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;  
 }
}


>>>>>>对该主题发表你的看法

本主题贴数4,分页: [第1页]


[上一篇主题]:look look

[下一篇主题]:Keil 模拟仿真行  硬件仿真就不行。为什么呢?