目录
0、工程建立
1、流水灯
2、数码管
2019.01.22最新更新
昨天写了一会程序,感觉之前说的那种建立工程的方法虽然有序,但是很麻烦,每个头文件都需要在设置里设置包含文件夹,经过考虑,现在将其改为整个工程就只使用一个头文件 sys.h ,单独存放在INC文件夹中
然后再设置
包含头文件所在的文件夹就好了,这样的话,每个C文件都包含同一个H文件。
流水灯很好实现,相信每个人入门单片机写的第一个程序都是流水灯,之前我们写流水灯大多使用delay程序,但是在这里我建议所有的延时均使用定时器实现,尽可能不使用delay。
我们使用定时器0作为定时器,初始化定时器0
//定时器0初始化
void Time0_Init(void)
{
AUXR |= 0x80; //定时器时钟1T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0x00; //设置定时初值5ms
TH0 = 0x28; //设置定时初值5ms
TF0 = 0; //清除TF0标志
ET0 = 1; //允许定时器0中断
TR0 = 1; //定时器0开始计时
EA = 1; //开总中断
}
流水灯实现使用 intrins.h 中的循环移位函数实现
//main.c
uchar Led_dat;
void main(void)
{
All_Init();
Time0_Init();
Led_dat = 0xfe;
while(1)
{
Led_illume(Led_dat);
}
}
//led.c
//点亮LED
void Led_illume(uchar dat)
{
P2 = (P2 & 0x1f) | 0x80; //打开Y4C(LED)
P0 = dat; //点亮LED
}
//sys.c
//定时器0中断程序
void Time0(void) interrupt 1
{
static uint t0 = 0;
t0 ++;
if(t0 == 200)
{
Led_dat = _cror_(Led_dat,1);
t0 = 0;
}
}
以上就是最简单的流水灯实现。
开发板所使用的数码管为共阳数码管,所以数码管的码字一定要知道,不知道也要会推。
uchar code Nixie[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
0x88,0x83,0xc6,0xa1,0x86,0x8e}; //共阳数码管码字
共阳数码管0~F的码字如上代码所示。
比如我现在使用定时器写一个时钟,用数码管显示的程序。
//Nixie.c
uchar code Nixie[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
0x88,0x83,0xc6,0xa1,0x86,0x8e}; //共阳数码管码字
uchar NixieBuff[] = {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}; //数码管显示缓冲区,初值0xff确保启动时都不亮
uchar code Symbol[] = {0xff,0xbf}; //全灭,-
uchar smg1,smg2,smg3,smg4,smg5,smg6,smg7,smg8;
//数码管显示
void Nixie_Scan(void)
{
static uchar index = 0;
P2 = (P2 & 0x1f) | 0xe0; //数码管消隐
P0 =0xff;
P2 = (P2 & 0x1f) | 0xc0; //数码管片选
P0 = 0x01 << index;
P2 = (P2 & 0x1f) | 0xe0; //数码管段选
P0 = NixieBuff[index];
P2 &= 0x1f;
index ++;
index &= 0x07;
}
//数码管显示
void Nixie_Show(void)
{
NixieBuff[0] = Nixie[smg1];
NixieBuff[1] = Nixie[smg2];
NixieBuff[2] = Symbol[smg3];
NixieBuff[3] = Nixie[smg4];
NixieBuff[4] = Nixie[smg5];
NixieBuff[5] = Symbol[smg6];
NixieBuff[6] = Nixie[smg7];
NixieBuff[7] = Nixie[smg8];
}
//时钟处理
void Deal_time(void)
{
if(sec == 60)
{
min ++;
sec = 0;
if(min == 60)
{
hour ++;
min = 0;
if(hour == 24)
hour = 0;
}
}
smg1 = hour / 10;
smg2 = hour % 10;
smg4 = min / 10;
smg5 = min % 10;
smg7 = sec / 10;
smg8 = sec % 10;
if(smg8 % 2 == 0)
{
smg3 = 1;
smg6 = 1;
}
else
{
smg3 = 0;
smg6 = 0;
}
}
//sys.c
//定时器0初始化
void Time0_Init(void)
{
AUXR |= 0x80; //定时器时钟1T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0xcd; //设置定时初值1ms
TH0 = 0xd4; //设置定时初值1ms
TF0 = 0; //清除TF0标志
ET0 = 1; //允许定时器0中断
TR0 = 1; //定时器0开始计时
EA = 1; //开总中断
}
//定时器0中断程序
void Time0(void) interrupt 1
{
static uint t0 = 0;
t0 ++;
if(t0 == 1000)
{
Led_dat = _cror_(Led_dat,1);
t0 = 0;
sec ++;
}
Deal_time();
Nixie_Show();
Nixie_Scan();
}