本帖最后由 yuchengze 于 2016-12-27 12:11 编辑
先上代码:
#include <STC15F2K60S2.H>
#include "intrins.h"
// LED字模表
unsigned char code LED_0F[] =
{// 0 1 2 3 4 5 6 7 8 9 A b C d E F -
0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x8C,0xBF,0xC6,0xA1,0x86,0xFF,0xbf
};
//-----------------------------------------------------------------------------
// 函数原形定义
#define uchar unsigned char
void main (void); // 主函数
void LED4_Display (void); // LED显示
void LED_OUT(uchar X); // LED单字节串行移位函数
uchar xs,haom,hm;
unsigned int num;
sbit DIO = P3^4; //串行数据输入
sbit RCLK = P3^3; //时钟脉冲信号——上升沿有效
sbit SCLK = P3^2; //打入信号————上升沿有效
//-----------------------------------------------------------------------------
// 全局变量
uchar LED[8]; //用于LED的8位显示缓存
void Timer0Init(void) //5毫秒@6.000MHz
{
AUXR |= 0x80; //定时器时钟1T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0xD0; //设置定时初值
TH0 = 0x8A; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0=1;
EA=1;
}
//*****************************************************************************
// 主程序
//
void main (void)
{
Timer0Init();
while(1)
{
}
}
void LED4_Display (void)
{
uchar qian,bai,shi,ge;
qian=num%10000/1000;
bai=num%1000/100;
shi=num%100/10;
ge=num%10;
switch(xs)
{
case 0:
//显示第1位
LED_OUT(LED_0F[ge]);
LED_OUT(0x01);
RCLK = 0;
RCLK = 1;
xs=1;
break;
case 1:
//显示第2位
LED_OUT(LED_0F[shi]);
LED_OUT(0x02);
RCLK = 0;
RCLK = 1;
xs=2;
break;
case 2:
//显示第3位
LED_OUT(LED_0F[bai]);
LED_OUT(0x04);
RCLK = 0;
RCLK = 1;
xs=3;
break;
case 3:
//显示第4位
LED_OUT(LED_0F[qian]);
LED_OUT(0x08);
RCLK = 0;
RCLK = 1;
xs=0;
break;
}
}
void LED_OUT(uchar X)
{
uchar i;
for(i=8;i>=1;i--)
{
if (X&0x80) DIO=1; else DIO=0;
X<<=1;
SCLK = 0;
SCLK = 1;
}
}
void tm0_isr() interrupt 1 using 1
{
LED4_Display ();
haom++;
if(haom==200)
{
num++; haom=0;
hm=~hm;
}
}
现在是》显示第1位,也就是“ge”一直是0,其他位正常,如果把其他位的数据也换成“ge”就两位都可以正常显示,不知道哪出问题啊? |