执行25次大约为1秒
for(words=0;words<4;words++)
{
for(times=0;times<25;times++)
{
dis_play(point[words]);
}
}
}
////////////////////////////////////文件 光笔扫描.c//////////////////////////////////////////////////////////////////////
#include"myself.h"
#include<reg52.h>
#include<intrins.h>
void saomiao()
{
uchar tempsave,mod_save;
uchar N_times;
TR1=0;//关闭定时器1
OUT_EN=1; //先让锁止LED点阵显示
mod_save&=0XF0;
TMOD|=0X06; //TMOD=XXXX 0110,计数器,八位自动重载
TH0=0XFF-N;
TL0=0XFF-N;
TR0=1; //开始对外负跳变脉冲进行计算,此时OUT_EN还是锁止输出
for(ROW_TEMP=0;ROW_TEMP<32;ROW_TEMP++)
{tempsave=P2&0XE0; //保存P2高三位数据,低五位置零
P2=tempsave|ROW_TEMP; //P2口低五位输出行选数据,高三位保持不变
P0=0X00; //全亮
P1|=0X78; //P1|=0111 1000,573锁存全部打开
_nop_();_nop_();
for(N_times=0;N_times<N;N_times++)
{
OUT_EN=0; //亮
delay_us(5); //亮5us的延时
P1&=0X87; //P1&=1000 0111关闭锁存允许
OUT_EN=1; //灭
delay_us(5); //5us的延时
}
}
TR0=0;
OUT_EN=1;
TR1=1; //开启定时器1
}
void Timer0() interrupt 1 //定时器0中断服务程序
{uchar templine,line,i,data_sav,result=0x00;
LED_ROW=ROW_TEMP; //保存光笔行坐标
for(i=0;i<5;i++)
{ OUT_EN=1;
for(line=0;line<4;line++)
{
templine=0X08; //0000 1000 p1.3=1,p1.4,p1.5,p1.6=0 只打开第一个锁存器的锁存使能,P1.3接第一个锁存器
//0X08=0000 1000B
P1=P1&0X87; //P1&10000111
P1=P1|_crol_(templine,line); //保存了P1的0、1、2、7位,对3/4/5/6进行左移位。
P0=LED_CODE[i][line]; //输出八位数据并锁存
_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_(); //延时500ns,让数据能顺利进入74HC573
}
OUT_EN=0; //573输出数据
delay_us(5); //延时5us,让光笔数据稳定
data_sav=P3&0X10; //0001 0000保存P3.4数据,准备移位
result|=_cror_(data_sav,5-i); //顺序得出5位数据,刚好当光笔所在列为0时(列选通),光笔数据为0;所在列为1时,光笔数据为1
}
LED_LINE=result;
}
////////////////////////////////////END///////////////////////////////////////////////////////////////////////////
////////////////////////////////////文件 对象拖移.c///////////////////////////////////////////////////////////////////
#include "myself.h"
#include <intrins.h>
#include<reg52.h>
#define CLICK P3^3
#define X LED_ROW
#define Y LED_LINE
void enkey(uchar
led_data[32][4],uchar x,uchar y); //将第x行第y列反显
void mov(uchar a,uchar b,uchar c,uchar d);//a^b->c^d
void obj_move(uchar led_data[32][4