本帖最后由 清风兑酒 于 2019-3-27 10:36 编辑
32颗灯摇摇棒(PCB+制作资料+元件清单+源程序+上位机)
一、说明:8个IO驱动32颗高亮发光二极管,程序对上一版本有做改进,显示效果更好,自适应的更好。另外增加了上位机改字的功能,从而大大减少了改动源程序的麻烦。也使得改字很方便,上位机功能可支持输入文字,大小任意,只要在32*64这个区域内就行。支持画图,导入BMP格式图片及保存图片,一共可以配置8张图片,每个图片独立,软件自带各种图案,也可从Word里导出图案,显示图案在范围内随便定义大小。 二、所有资料截图 三、原理图
四、PCB截图
五、上位机软件说明请看:“64x32摇摇棒取模软件帮助文档” 下载波特率:2400 8-N-1 下载字幕数据: 请正确连接4P下载线,如下图: 下载时请这样放置,让摇摇棒竖着放,意在不让滚珠开关导通,这样会导致下载不了。上电后有些LED会亮,指示可以下载字幕数据,如果不亮请重新上电。 软件配置:生成方式配置 串口设置中:请务必选择2400波特率,串口选择对应的串口号。或者从设备管理器COM管理看对应串口号。一般软件会自动搜索,前提是先插了USB转串口再打开软件。
六、程序 #include <NEW_8051.H> #include <task.h> //缓存 #define uchar unsigned char
#define uint unsigned int //宏定义
#define KEY P3^0 //定义画面切换按键
uchar KY; //KY作用在后面说明
uchar disp=0; //显示汉字指针,该参数+1的话,显示的字符多4个,同时要给要显示的汉字取模加到汉字数组中。
uchar pic=0,num=0; //pic为按键次数;num为中断次数
uchar code xinjiaxin[]={
0x00,0x0E,0x11,0x21,0x42,0x84,0x42,0x21,0x11,0x0E,0x00,0x08,0x08,0x3E,0x08,0x08, 0x00,0x00,0x0E,0x1E,0x3C,0x78,0x3C,0x1E,0x0E,0x00,0x14,0x14,0x14,0x14,0x00,0x0E, 0x1F,0x3F,0x7E,0xFC,0x7E,0x3F,0x1F,0x0E,/*"xinjiaxin*/
};
unsigned char code miss[] = {
0x00,0x00,0x00,0x81,0xFF,0x81,0x00,0x00,0x00,0x00,0x04,0x7C,0x04,0x7C,0x04,0x7C, 0x00,0x7D,0x00,0x5C,0x54,0x54,0x74,0x00,0x5C,0x54,0x54,0x74,0x00,0x00,0x00,0x7F, 0x80,0x80,0x80,0x7F,0x00,0x00,0x00,0x00,/*I miss U*/
};
/*****函数声明*****/
void display2(void);
void display5(void);
/*****n(单位us微秒)延时子程序*****/
void DelayUs(uint N)
{
uint x;
for(x=0; x<=N;x++);
}
/*****主函数*****/
void main(void)
{
IT0=1;
EX0=1;
EA=1; //开中断,下降沿中断
KY=0;
while(1) //主程序中只检测按键
{
if(KEY==0) //图案切换键按下
{
DelayUs(20000); //去除按键抖动
if(KEY==0);
{
pic++;
disp=0;
num=0;
} //endif
} //endif
} //endwhile
} //endmain
/*****中断服务程序*****/
void intersvr0(void) interrupt 0 using 1
{
KY=~KY; //每个摇动来回水银开关会在摆幅两端分别产生下降沿中断,只提取其中一次(从左向右摇才显示)
if(KY==0)
{
if(pic>1)pic=0;//总共有6个图案
num++; //计算中断次数
switch(pic) //选择显示图案
{
case 1:{display2();}break;
case 2:{display5();}break;
default:{display2();}
}
}
}
/*****显示子程序3(汉字)*****/
void display2(void)
{
uchar i;
DelayUs(5000);
for(i=0;i<40;i++)
{
P1=~miss[i*1];
DelayUs(75); }
}
/*****显示子程序6(汉字)*****/
void display5(void)
{ uchar i;
DelayUs(5000);
for(i=0;i<40;i++)
{
P1=~xinjiaxin[i*1];
DelayUs(65);
}
}
/*****END*****/
|