|
#include <reg52.h> /* special function register declarations */
#include <absacc.h> /* for the intended 8051 derivative */
#include <stdio.h> /* prototype declarations for I/O functions */
/***************************************************
* A型板,定义 model 为 1,B型板,定义 model 为 2。*
***************************************************/
#define model 2
#if model == 1
sbit SCC=P3^2;
#else
sbit SCC=P1^7;
#endif
sbit SCR=P3^3;
sbit SCI0=P3^5;
sbit SCI1=P3^4;
unsigned int i;
char j;
unsigned char k=0;
unsigned char timer1=0;
unsigned char dis[6];
/* a */
/* ------------ */
/* | | */
/* f | | b */
/* | g | */
/* ---------- */
/* | | */
/* e | | c */
/* | d | */
/* ---------- 。dp */
/* dp g f e d c b a */
unsigned char tab[]={ 0x3f, /* 0: 0 0 1 1 1 1 1 1 */
0x06, /* 1: 0 0 0 0 0 1 1 0 */
0x5b, /* 2: 0 1 0 1 1 0 1 1 */
0x4f, /* 3: 0 1 0 0 1 1 1 1 */
0x66, /* 4: 0 1 1 0 0 1 1 0 */
0x6d, /* 5: 0 1 1 0 1 1 0 1 */
0x7d, /* 6: 0 1 1 1 1 1 0 1 */
0x27, /* 7: 0 0 1 0 0 1 1 1 */
0x7f, /* 8: 0 1 1 1 1 1 1 1 */
0x6f, /* 9: 0 1 1 0 1 1 1 1 */
0x77, /* a: 0 1 1 1 0 1 1 1 */
0x7c, /* b: 0 1 1 1 1 1 0 0 */
0x39, /* c: 0 0 1 1 1 0 0 1 */
0x5e, /* d: 0 1 0 1 1 1 1 0 */
0x79, /* e: 0 1 1 1 1 0 0 1 */
0x71, /* f: 0 1 1 1 0 0 0 1 */
0x00, /* : 0 0 0 0 0 0 0 0 */
0x40 /* -: 0 1 0 0 0 0 0 0 */
};
/***************************************************
* 主程序入口。 *
***************************************************/
void main (void)
{
/***************************************************
* 设置 T0 定时器的工作模式为16位计数 *
***************************************************/
TMOD |= 0x01;
/***************************************************
* 设置 TH0 寄存器的初值,因为在中断处理程序里还要 *
* 对其付值,所以这里所付的数值对定时长度没有影响。*
***************************************************/
TH0 = 0xff;
/***************************************************
* 起动 T0 定时器。 *
***************************************************/
TR0 = 1;
/***************************************************
* 允许 T0 定时器中断,并将全局中断控制位置为允许。*
***************************************************/
IE |= 0x82;
for(i=0;i<6;i++){
dis[i] = i;
}
while(1){
/***************************************************
* k是用来记录位置的变量,表明第一个数码管显示的数 *
* 字是几。 *
***************************************************/
k++;
if(k>=16) k=0;
/***************************************************
* 向显存里填写数字,从 k 的值开始,依次加1。加到 *
* 15 就又从 0 开始。 *
***************************************************/
j = 0;
for(i=0;i<6;i++){
if(k+j>15) j-=16;
dis[i] = tab[k+j];
j++;
}
/***************************************************
* 延时1秒钟。T0 定时器每1毫秒中断一次,每中断一次 *
* 给变量 timer1 加 1,累计 1000 次,就是 1 秒钟。 *
***************************************************/
i = 0;
timer1 = 0;
while(i<10){
if(timer1>=100){
i++;
timer1 = 0;
}
}
/***************************************************
* 返回到上面的 while(1)。 *
***************************************************/
}
}
/***************************************************
* T0 的中断处理程序,每1毫秒执行一次,做LED数码管 *
* 扫描,给变量 timer1 加 1。 *
***************************************************/
dir() interrupt 1
{
static unsigned char i;
/***************************************************
* 给定时器T0重付初值。 *
***************************************************/
TL0=0x67;
TH0=0xfc;
/***************************************************
* 向 XDATA 空间的 0xb000 地址写数据0x00,关闭数码 *
* 管显示,以便消除影子显示。 *
***************************************************/
XBYTE[0xb000]=0x00;
/***************************************************
* i 代表数码管的位号,加1使其指向下一个数码管。 *
***************************************************/
i++;
if(i>=6){
/***************************************************
* 如果i的值超过了5,要对其归0。同时要复位4017,使 *
* 其选通第1个数码管。 *
***************************************************/
i=0;
SCR=1;
SCR=0;
}else{
/***************************************************
* 如果i的值没有超过5,则向4017的时钟引脚发一个高脉*
* 冲,使其选通下一个数码管。 *
***************************************************/
SCC=1;
SCC=0;
}
/***************************************************
* 将段码写到 XDATA 空间的 0xb0000 地址,以驱动数码*
* 管的各个段。 *
***************************************************/
XBYTE[0xb000]=dis[i];
/***************************************************
* 给时间变量timer1加1。该变量用于定时。 *
***************************************************/
timer1++;
}
|