导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→一定要汇编吗?这里给你keil-C的源代码,可处理闪烁还可调

* 78865: 诚征单片机高手,内详

   tonywei 
tonywei发表的帖子 

 一定要汇编吗?这里给你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;  
 }
}

发表时间:2005年6月2日16:18:12

  
回复该帖

本主题共有 4 帖,分页:>>>>>该主题的所有内容[4]条

 *树形目录 只列出部分跟帖的标题以及简单的摘要信息 该主题的部分跟帖如下:

  80014.[详细][求助] 主程序~!~
摘要:使用汇编语言。用8051控制四位七段共阴极数码管。P2口控制段选(因为共阴,高电平有效,经74ls573锁存器拉高电流)。P00,P02,P03和P04分别控制四个位选(低有效),要显示的数据存在LED_1到LED_4中(需要转化成十进制)......(293字)
- [eric393][904次] 2005年6月17日

[上一篇帖子]:急聘嵌入式系统软/硬件开发人员急聘嵌入式系统软/硬件开发人员 本公司因发展需要,现招聘若干名
[下一篇帖子]:我觉得能够在485基础上通过数据协议解决。我觉得能够在485基础上通过数据协议解决, 只是不