标题:
求教单片机点阵LED程序问题
[打印本页]
作者:
舞月惊鸿
时间:
2022-2-23 23:15
标题:
求教单片机点阵LED程序问题
请问大佬们,做点阵led流动字体精确延时移动时,无意间发现设置变量flag1s 与TF0下延时时间不相同,不太明白,求教各位啦
单片机源程序如下:
用TF0时
#include <reg52.h>
sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;
unsigned char code image[]={
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0x7D,0x01,0x01,0x7D,0xFF,0xFF,0xE3,0xC1,
0x81,0x03,0x03,0x81,0xC1,0xE3,0xFF,0xFF,
0x81,0x01,0x3F,0x3F,0x3F,0x01,0x81,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};
void main()
{
ENLED = 0;
ADDR3 = 0;
EA = 1;
TMOD = 0x01;
TH0 = 0xFC;
TL0 = 0x67;
TR0 = 1;
ET0 = 1;
while(1)
{
if(TF0 == 1)
{
TF0 =0;
}
}
}
void interrupttime0() interrupt 1
{
static unsigned char index = 0;
static unsigned char i = 0;
static unsigned int tmr = 0;
TH0 = 0xFC;
TL0 = 0x67;
P0 = 0xFF;
switch(i)
{
case 0:ADDR2 = 0;ADDR1 = 0;ADDR0 = 0;i++;P0=image[index+0];break;
case 1:ADDR2 = 0;ADDR1 = 0;ADDR0 = 1;i++;P0=image[index+1];break;
case 2:ADDR2 = 0;ADDR1 = 1;ADDR0 = 0;i++;P0=image[index+2];break;
case 3:ADDR2 = 0;ADDR1 = 1;ADDR0 = 1;i++;P0=image[index+3];break;
case 4:ADDR2 = 1;ADDR1 = 0;ADDR0 = 0;i++;P0=image[index+4];break;
case 5:ADDR2 = 1;ADDR1 = 0;ADDR0 = 1;i++;P0=image[index+5];break;
case 6:ADDR2 = 1;ADDR1 = 1;ADDR0 = 0;i++;P0=image[index+6];break;
case 7:ADDR2 = 1;ADDR1 = 1;ADDR0 = 1;i=0;P0=image[index+7];break;
}
if(TF0 == 0)
{
TF0 =1;
tmr++ ;
if(tmr>=1000)
{
tmr =0;
index ++;
if(index >=32)
{
index = 0;
}
}
}
}
控制flag1s条件时
#include <reg52.h>
sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;
unsigned char code image[]={
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0x7D,0x01,0x01,0x7D,0xFF,0xFF,0xE3,0xC1,
0x81,0x03,0x03,0x81,0xC1,0xE3,0xFF,0xFF,
0x81,0x01,0x3F,0x3F,0x3F,0x01,0x81,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};
unsigned char flag1s = 0;
void main()
{
ENLED = 0;
ADDR3 = 0;
EA = 1;
TMOD = 0x01;
TH0 = 0xFC;
TL0 = 0x67;
TR0 = 1;
ET0 = 1;
while(1)
{
if(flag1s == 1)
{
flag1s =0;
}
}
}
void interrupttime0() interrupt 1
{
static unsigned char index = 0;
static unsigned char i = 0;
static unsigned int tmr = 0;
TH0 = 0xFC;
TL0 = 0x67;
P0 = 0xFF;
switch(i)
{
case 0:ADDR2 = 0;ADDR1 = 0;ADDR0 = 0;i++;P0=image[index+0];break;
case 1:ADDR2 = 0;ADDR1 = 0;ADDR0 = 1;i++;P0=image[index+1];break;
case 2:ADDR2 = 0;ADDR1 = 1;ADDR0 = 0;i++;P0=image[index+2];break;
case 3:ADDR2 = 0;ADDR1 = 1;ADDR0 = 1;i++;P0=image[index+3];break;
case 4:ADDR2 = 1;ADDR1 = 0;ADDR0 = 0;i++;P0=image[index+4];break;
case 5:ADDR2 = 1;ADDR1 = 0;ADDR0 = 1;i++;P0=image[index+5];break;
case 6:ADDR2 = 1;ADDR1 = 1;ADDR0 = 0;i++;P0=image[index+6];break;
case 7:ADDR2 = 1;ADDR1 = 1;ADDR0 = 1;i=0;P0=image[index+7];break;
}
if(flag1s == 0)
{
flag1s =1;
tmr++ ;
if(tmr>=1000)
{
tmr =0;
index ++;
if(index >=32)
{
index = 0;
}
}
}
}
作者:
wulin
时间:
2022-2-24 07:35
两种定时方式的基本架构
//查询方式
void main()
{
TMOD = 0x01;
TH0 = 0xFC;
TL0 = 0x67;
TR0 = 1;
while(1)
{
if(TF0 == 1)//查询
{
TF0 =0;//需要软件复位
TH0 = 0xFC;
TL0 = 0x67;
//需要定时的任务
}
//其它任务
}
}
//中断方式
void main()
{
EA = 1;
TMOD = 0x01;
TH0 = 0xFC;
TL0 = 0x67;
TR0 = 1;
ET0 = 1;
while(1)
{
//其他任务
}
}
void interrupttime0() interrupt 1
{
//TF0由内部硬件自动复位
TH0 = 0xFC;
TL0 = 0x67;
//需要定时的任务
}
复制代码
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1