main.c
#include "system.h"
#include "led.h"
#include "dz.h"
extern uchar flag_1ms; //在其他模块中寻找其定义。另外,extern也可用来进行链接指定。
void main(void) //程序的主函数
{
Timer0_Init(); ////定时器0函数调用
while(1) //大括号里面的东西,被不停的循环执行
{
//1ms进入一次
if(flag_1ms==1) //加了我之后,我的大括号里面的东西,被定期的1ms执行一次,反复执行
{
flag_1ms=0;
Led_Move(); //led移位函数 定时
dis_yigezi(); //显示1个字的函数
dis_poll(); //播放字体函数
}
}
}
DZ.C
#include "dz.h" //把led.h文件包含进来
#include "system.h" //把timer0.h文件包含进来
#include <intrins.h>
uchar code duan0[3][8]={
{0x00,0x3C,0x42,0x42,0x42,0x3C,0x00,0x00},//数字0的段选
{0x00,0x49,0x49,0x7f,0x49,0x49,0x00,0x00},//王
{0x08,0x10,0x3f,0x49,0x2d,0x7f,0x2d,0x09} //佳
};
uchar code wei[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//?位选
void sandbyte(uchar dat)//给74hc595发送段选的数据
{
uchar i;
SCLK=0;
RCK=0;
for(i=0;i<8;i++)
{
SER=dat>>7;
dat<<=1;
SCLK=1;
_nop_();
_nop_();
SCLK=0;
}
RCK=1;
_nop_();
_nop_();
RCK=0;
}
uchar index =0;
//最低层,点阵屏的驱动,让它不停显示一个字
//这个函数,用在让点阵屏,不停的显示一个字
//这个字是什么,由index来决定,index初始化为0,就是显示第0个字,就是0
void dis_yigezi(void) //显示1个字的函数
{
//index表示要显示哪个字,在duan0二维数组里面有解释
//i表示要显示第几行
static unsigned char i=0; //定时变量
sandbyte(0x00); //消影
P0=wei[i]; //打开第1行 每1毫秒打开1行
sandbyte(duan0[index][i]); //显示字index的第i行
i++;
if(i>7){i=0;} //定时大于7清零
}
//次低层,播放
//这个函数,用来改变要显示的内容
//它每1秒钟修改一下index,所以修改了要显示的内容
void dis_poll(void) //播放字体函数
{
static unsigned int timer=0; //播放字体变量
timer++;
if(timer>=1000) //定时1秒钟
{
timer=0;
index++;
if(index>2){index=0;} //轮流播放3个字,最后清0从第一个开始显示
}
}
DZ.H
#include "system.h" //把timer0.h文件包含进来
sbit SCLK=P3^6; //管脚定义
sbit RCK=P3^5;
sbit SER=P3^4;
void sandbyte(uchar dat);
void dis_yigezi(void);
void dis_poll(void);
LED.C
#include "led.h" //把led.h文件包含进来
#include "system.h" //把timer0.h文件包含进来
uchar data1=0xfe; //先点亮第一个LED灯
void Led_Move(void) //led移位函数 定时
{
static unsigned int timer=0;
LED = data1;
timer++;
if(timer==500)
{
data1 = data1<<1|0x01;
timer=0;
if(data1==0xff)
{
data1=0xfe;
}
}
}
LED.H
#include "system.h" //把timer0.h文件包含进来
#define LED P2 //led管脚
void Led_Init(void);
void Led_Move(void);
system.c
#include "system.h"
uchar flag_1ms=0;
/*
void Delay_us(uint xus)
{
for(;xus>0;xus--);
}
void Delay_ms(uint xms)
{
for(;xms>0;xms--)
{
Delay_us(1000);
}
}
*/
void Timer0_Init(void)
{
TH0 = T1MS>>8; //赋初值
TL0 = T1MS; //赋初值
TMOD = 0x01; //设置定时器0用十六位定时器方式
EA = 1; //打开总中断
ET0 = 1; //打开定时器0中断
TR0 = 1; //启动定时器0
}
void Timer0() interrupt 1 //中断号1
{
TH0 = T1MS>>8; //赋初值
TL0 = T1MS; //赋初值
flag_1ms=1;
}
system.h
#include "reg51.h"
#define uchar unsigned char //定义无符号字符
#define uint unsigned int //定义无符号整形
#define FOSC 12000000L //定义晶振频率
#define T1MS (65536-FOSC/12/1000) //定时1毫秒的时候,计数器要写入的值
//void Delay_us(uint xus); //us级延时
//void Delay_ms(uint xms); //ms级延时
void Timer0_Init(void); //定时器初始化