//===========================================================
//拉幕式数码显示技术(可用于项目)
//P0段码,P2扫描字
//使用P10-P12,74HC138输出扫描字,P0输出段码
//本程序为原创,数组法使用74HC138
//关键算法是控制循环次数及拉幕实现
//程序员:舒杰刚 2009年9月17日
//=============================================================
//反思:
//检查自已是不是做错了,(没错是不可能的)从别人的角度想
//是不是自负,是不是瞧不起人.不讲合作什么事也干不了.
//反思:某人看我,我看他人,
//不给别人面子,就难沟通.一定要给别人留面子
//争吵是解决不了问题的,只会增加仇恨.
//不公开反对别人意见,激烈的更不可取.
//低调,言多必失,多做少说.
//有礼貌,勤打招呼
//专业无好坏,你不能代表你的专业,更不能看不起别人的专业.
//嘲笑别人对你专业的无知,更不可取.
//忍耐是一门很难的学问
//老板识人多,老板重视的人一定有可用的道理.
//不要背后议论人,好话是到不了他耳朵的.
//不要急下结论,凡事要弄清原委.
//千招会不如一招熟.通才只有在专才的基础上才有意义.
//不要跟别人斗法.
//做事不如做人.(韦小宝有什么本事?),大公司做事,小公司做人
//要有平常心.
//自负的根源是不自信,是想表现自我.
//===========================================================
#include "reg51.h" //文件包含命令
#define uchar unsigned char //定义一下方便输入
#define uint unsigned int //定义一下方便输入
//------------------------------------------------------------
uchar code disp_dm[]={ //定义段码共阴
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};
//定义扫描字
uchar disp_smz[]={0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfe,0xff};
//------------------------------------------------------------
uchar dispbuf[8]; //显示缓存
uchar cyc_count; //循环次数控制
bit run_bz;
//=============================================================
//主函数
//=============================================================
void main(void)
{ static uchar i;
TMOD=0x02; //定时器工作方式2
TH0=0x06;TL0=0x06; //定时器赋初值
TR0=1;ET0=1;EA=1; //R0开始运行,开T0中断,总中断
while(1)
{ //拉幕实现-------------------------------------------------
if(run_bz==1)
{ run_bz=0;
for(i=0;i<8;i++){dispbuf[i]=16;} //作用是消隐
for(i=0;i!=cyc_count;i++) //核心语句1
{ dispbuf[i]=cyc_count-i; } //核心语句2
}
}
}
//=============================================================
//定时器0中断程序
//=============================================================
void t0() interrupt 1
{
uint t_count;
uchar tmp;
static uchar disp_count;
TH0=0x06;TL0=0x06; //定时器赋初值
//动态扫描显示------------------------------------------------
tmp=disp_smz[disp_count]; //根据当前的计数值取位值
P1=P1|0x07; //P1或00000111B相或,将低3位置1
P1=P1&tmp; //低三位输出扫描字
P0=disp_dm[dispbuf[disp_count]]; //取段码
disp_count++;
if(disp_count>7){disp_count=0;}
//拉幕速度-----------------------------------------------------
t_count++; //延时计数器
if(t_count==2000) //
{ t_count=0; run_bz=1; //计数器归0,
cyc_count++; //循环次数
if(cyc_count>8){cyc_count=0;} //等于0有全黑效果,等于1时,最低位常在
}
} |