16LED摇摇棒
#include <reg52.h>/*********外部接口定义**********/
#define out P1 //数据输出端口
sbit led1=P3^0; //第1组LED
sbit led2=P3^1; //第2组LED
sbit p3_3=P3^3;//滚珠开关
sbit key1=P3^7;//切换开关
/*********全局变量定义**********/
unsigned long int TimeCount=0; //定时器单位时间计数
unsigned int DelayN=80, //延时临时计数
DelayTime=80; //每次延时的周期个数
unsigned char key; //按键输入
/*********图片点阵数据表**********/
unsigned char code pic1[]=
{
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xDF,
0xF7,0xDF,0xF7,0xDF,0xF7,0xDF,0x07,0xC0,
0x07,0xC0,0xF7,0xDF,0xF7,0xDF,0xF7,0xDF,
0xFF,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF //I
};
unsigned char code pic2[]=
{
0xFF,0xFF,0xFF,0xFF,0x0F,0xFF,0x07,0xFE,
0x03,0xFC,0x07,0xF8,0x0F,0xF0,0x1F,0xE0,
0x1F,0xE0,0x0F,0xF0,0x07,0xF8,0x03,0xFC,
0x07,0xFE,0x0F,0xFF,0xFF,0xFF,0xFF,0xFF //爱心
};
unsigned char code pic3[]=
{
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x03,0xF0,
0x03,0xE0,0xFF,0xC7,0xFF,0xCF,0xFF,0xCF,
0xFF,0xCF,0xFF,0xCF,0xFF,0xC7,0x03,0xE0,
0x03,0xF0,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF //U
};
/*0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xCF,
0xFF,0xCF,0xE7,0xCF,0xE3,0xCF,0x01,0xC0,
0x01,0xC0,0xFF,0xCF,0xFF,0xCF,0xFF,0xCF,
0xFF,0xCF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF*///1
/*0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xFB,0xEF,
0xFB,0xEF,0x1B,0xE0,0xFB,0xEF,0xFB,0xEF,
0x03,0xE0,0x7B,0xEF,0x7B,0xEF,0xFB,0xEF,
0xFF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF*/ //正
/*0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xCF,
0xFF,0xCF,0xFF,0xCF,0xFF,0xCF,0x01,0xC0,
0x01,0xC0,0xE3,0xCF,0xE7,0xCF,0xFF,0xCF,
0xFF,0xCF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF*///1
/* (16 X 16 ) */
/*********子程序声明**********/
void delay(unsigned char n); //延时子程序
void display_pic(unsigned char code *pic); //图片显示子程序
/********* 主 程 序 **********/
void main()
{
unsigned int i;
EX1=1; //开放外部中断1
IT1=0; //中断1为边沿触发方式
IP=0x08; //设置中断嵌套
TMOD=0x20; //定时器1方式2,8位重装载
TH1=0x80; //设定定时器初值
TL1=0x80;
EA=1; //开放中断
ET1=1; //开放定时器1中断
TR1=1; //启动定时器0,开始计时
key=0; //初始化显示第一组文字
// out=0xff;
//led1=0x00;
//led2=0x00;
while(1)
{
//等待中断
if(key1==0)
{
for(i=0;i<6000;i++); //按键去抖处理
if(key1==0)
{ //有键按下
key++; //更换下一幅图片
if(key==4) key=0; //图片循环显示
while(key1==0); //等待按键释放
}
}
};
}
/*********图片显示子程序**********/
void display_pic(unsigned char code *pic) //显示16*16点阵图
{ unsigned char i,n;
n=0; //初始化数据表计数
for(i=0;i<16;i++){ //共显示16*3=48列
out=0xff; //清显示
led2=1; //关闭第2组LED
led1=0; //开启第1组LED
out=*(pic+n++); //输出数据到LED
delay(1); //延时
out=0xff; //清显示
led1=1; //关闭第1组LED
led2=0; //开启第2组LED
out=*(pic+n++); //输出数据到LED
delay(1); //延时
}
}
/*********显示内容选择子程序**********/
void display(unsigned char i)
{
switch (i){ //通过按键选择显示内容
case 0: display_pic(pic1);break;
case 1: display_pic(pic2);break;
case 2: display_pic(pic3);break;
}
}
/*********延时子程序**********/
void delay(unsigned char n)
{
for(;n>0;n--)
{
DelayN=DelayTime;
while (DelayN);
}
}
/*********中断子程序**********/
void int1() interrupt 2 //使用外部中断1
{
if(TimeCount<800) return; //中断去抖4500
out=0xff; //清显示
DelayTime=TimeCount/200;//设定每次延时时钟周期数=总时间/(16列*2组*1个字)640
TimeCount=0; //延时周期计数清零
delay(70); //延时20列
display(key);
//display_pic(pic1); //显示图片
out=0xff;
while(p3_3==0);
}
void timer1() interrupt 3 //定时器1中断子程序
{
TimeCount++;
if (DelayN!=0)
DelayN--;
} 回复【楼主位】rickly_hzy
-----------------------------------------------------------------------
http://cache.amobbs.com/bbs_upload782111/files_47/ourdev_688308TDG5ZD.jpg
自己焊接的电路 (原文件名:20111024568.jpg)
看看效果ourdev_688309A2EG4J.avi视频文件大小:7.00M) (原文件名:20111022032.avi) 这个不错 我在做。少几个10k的电阻。。。少一个水银开关。。。买不到啊。。。什么情况? 598439837 发表于 2013-1-26 12:08
我在做。少几个10k的电阻。。。少一个水银开关。。。买不到啊。。。什么情况? ...
我的开关是用滚珠自制的,也还凑合用,不知你用10K电阻做什么 5612404 发表于 2013-1-27 10:36 static/image/common/back.gif
我的开关是用滚珠自制的,也还凑合用,不知你用10K电阻做什么
这图上很多10k电阻啊。。我照这个做的。。。 在做,新手,第一次做东西。求QQ,求指点。。 不错,有时间我也试试 挺好不错 598439837 发表于 2013-1-27 11:38 static/image/common/back.gif
这图上很多10k电阻啊。。我照这个做的。。。
不用10k的也应该可以,和10k接近,复位电路还是用10k吧
挺不错的 598439837 发表于 2013-1-27 11:38 static/image/common/back.gif
这图上很多10k电阻啊。。我照这个做的。。。
淘宝搜索“排阻”吧少年,那东西用起来真TM爽…… 清雨影 发表于 2013-2-1 14:04 static/image/common/back.gif
淘宝搜索“排阻”吧少年,那东西用起来真TM爽……
好吧。。。 我也做过,挺好玩的。。 PCB打样做了个小的,52mm*17mm,用的是STM8l101f3,送妹子了。 F:\电子小组\摇摇帮 终极精简美化版(附程序 取模软件) 摇摇棒STC89C52
页:
[1]