小白求程序!请大神过来看看!led3216点阵显示
时间:10-02
整理:3721RD
点击:
前段时间做了一个led3216显示系统,硬件初步完成了,程序却毫无头绪。
在网上找了一段单片机奏出生日快乐歌的c程序,我想和我现有的显示程序结合到一块,求大神帮忙!
两个程序如下:
显示程序:/*********************************************************
程序名称:LED3216点阵拉幕显示图片
简要说明:可显示分辨率为32X16的图片
P0口接上行线,P2口接下行线,P3口接扫描线
P1.6接左屏译码器使能端(CS1)
P1.7接右屏译码器使能端(CS2)
编 写:JiangX.net
*********************************************************/
#include<AT89X52.h>
#define uchar unsigned char //宏定义
#define hang1 P0 //上半屏行线
#define hang2 P2 //下半屏行线
#define lie P1 //扫描列线
#define CS1 P1_6 //接左屏译码器使能端,低电平使能
#define CS2 P1_7 //接右屏译码器使能端,低电平使能
#define num sizeof(pic)/64 //自动计算图片总数
uchar m=0,n=0; //m为扫描过程中的中间变量,n为显示指针
uchar a,b; //a、b分别为左半屏、右半屏的扫描变量 /*****参数调整项*****/
#define light 100 //显示亮度调节,数值不可过大,以不感到屏幕闪烁为准
#define speed 5 //卷动速度调节 /*******************************
图片取模:纵向取模,字节倒序
图片大小:32*16
*******************************/
uchar code pic[]={
0x00,0x00,0x08,0xF8,0xF8,0x08,0x00,0x00,0xF0,0xF8,0xFC,0xFC,0xFC,0xFC,0xF8,0xF0,
0xF8,0xFC,0xFC,0xFC,0xFC,0xF8,0xF0,0x00,0xF8,0xF8,0x00,0x00,0x00,0xF8,0xF8,0x00,
0x00,0x00,0x10,0x1F,0x1F,0x10,0x00,0x00,0x00,0x01,0x03,0x07,0x0F,0x1F,0x3F,0x7F,
0x3F,0x1F,0x0F,0x07,0x03,0x01,0x00,0x00,0x0F,0x1F,0x18,0x18,0x18,0x1F,0x0F,0x00,//I LOVE YOU 0xC0,0x40,0xC0,0x00,0xF0,0x08,0x00,0x00,0xF0,0x08,0x08,0x08,0xF0,0x00,0x00,0x00,
0x00,0x00,0x00,0xF0,0x08,0x08,0x08,0xF0,0x00,0x00,0x08,0xF0,0x00,0xC0,0x40,0xC0,
0x01,0x01,0x01,0x00,0x07,0x08,0x00,0x00,0x0F,0x00,0x00,0x00,0x0F,0x00,0x08,0x08,
0x08,0x08,0x00,0x0F,0x00,0x00,0x00,0x0F,0x00,0x00,0x08,0x07,0x00,0x01,0x01,0x01,//o(∩_∩)o 0xFC,0x04,0x04,0x04,0xFC,0x02,0xF2,0x12,0x12,0x12,0xF2,0x02,0x02,0xFE,0x02,0x00,
0xFC,0x04,0x04,0x04,0xFC,0x02,0xF2,0x12,0x12,0x12,0xF2,0x02,0x02,0xFE,0x02,0x00,
0x0F,0x02,0x02,0x02,0x07,0x00,0x07,0x02,0x02,0x02,0x27,0x40,0x80,0x7F,0x00,0x00,
0x0F,0x02,0x02,0x02,0x07,0x00,0x07,0x02,0x02,0x02,0x27,0x40,0x80,0x7F,0x00,0x00 //呵呵 }; /*****延时子程序*****/
void delay(void) //专门设置的延时程序用来改变扫描速度以方便调节亮度
{
uchar i;
for(i=0;i<light;i++);
} /*****初始化子程序*****/
void init(void) //定时器初始化,设置定时器0工作方式1,定时时间5ms
{
TMOD=0x1;
TH0=0xec;
TL0=0x78;
} /*****计数器中断程序*****/
void timer0(void) interrupt 1 //中断处理
{
uchar k; //定义变量k
TH0=0xec;
TL0=0x78;
k++; //定时时间到,初始变量加1
if(k>speed) {m++;k=0;} if(m<=16) {a=m;b=0;} //扫描左半屏,不扫描右半屏
else {a=16;b=m-16;} //全屏扫描左半屏,扫描右半屏 if(m>32) b=16; //全屏扫描右半屏
//中间这段时间是为了看清楚整屏画面内容,稍作停顿
if(m==48) {m=0;n++;} //一幅图片卷动显示过程结束,载入下一幅图片 if(n>num-1) n=0; //所有图片显示完毕,回到第一幅图片
} /*****显示子程序*****/
void display(void)
{
uchar i,j;
for(i=0;i<a;i++) //变量a决定了一次扫描左半屏列数
{
lie=i|0xB0; //左屏列扫描信号输出
hang1=pic[i+64*n];
hang2=pic[i+64*n+32]; //行信号输出
delay();
hang1=0;
hang2=0;
}
for(j=0;j<b;j++) //变量b决定了一次扫描右半屏列数
{
lie=j|0x70; //右屏列扫描信号输出
hang1=pic[j+64*n+16];
hang2=pic[j+64*n+48]; //行信号输出
delay();
hang1=0;
hang2=0;
}
} /*****主程序*****/
void main(void)
{
init();
TR0=1;
ET0=1;
EA=1; //开中断
while(1)
{
display();
}
}
生日快乐歌程序:/* 名称:播放音乐
说明:程序运行时播放生日快乐歌, 未使用定时器中断,所有频率完全用延时实现
*/
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit BEEP=P3^7;
//生日快乐歌的音符频率表,不同频率由不同的延时来决定
uchar code SONG_TONE[]={212,212,190,212,159,169,212,212,190,212,142,159,
212,212,106,126,159,169,190,119,119,126,159,142,159,0};
//生日快乐歌节拍表,节拍决定每个音符的演奏长短
uchar code SONG_LONG[]={9,3,12,12,12,24,9,3,12,12,12,24,
9,3,12,12,12,12,12,9,3,12,12,12,24,0};
//延时
void DelayMS(uint x)
{
uchar t;
while(x--) for(t=0;t<120;t++);//播放函数
void PlayMusic()
{
uint i=0,j,k;
while(SONG_LONG[i]!=0||SONG_TONE[i]!=0)
{ //播放各个音符,SONG_LONG 为拍子长度
for(j=0;j<SONG_LONG[i]*20;j++)
{
BEEP=~BEEP;
//SONG_TONE 延时表决定了每个音符的频率for(k=0;k<SONG_TONE[i]/3;k++);
}
DelayMS(10);
i++;
}
}
void main()
{
BEEP=0;
while(1)
{
PlayMusic(); //播放生日快乐
DelayMS(500); //播放完后暂停一段时间
}
}
怎么才能将两个程序和在一起既能显示图片又能播放音乐?不胜感谢!
在网上找了一段单片机奏出生日快乐歌的c程序,我想和我现有的显示程序结合到一块,求大神帮忙!
两个程序如下:
显示程序:/*********************************************************
程序名称:LED3216点阵拉幕显示图片
简要说明:可显示分辨率为32X16的图片
P0口接上行线,P2口接下行线,P3口接扫描线
P1.6接左屏译码器使能端(CS1)
P1.7接右屏译码器使能端(CS2)
编 写:JiangX.net
*********************************************************/
#include<AT89X52.h>
#define uchar unsigned char //宏定义
#define hang1 P0 //上半屏行线
#define hang2 P2 //下半屏行线
#define lie P1 //扫描列线
#define CS1 P1_6 //接左屏译码器使能端,低电平使能
#define CS2 P1_7 //接右屏译码器使能端,低电平使能
#define num sizeof(pic)/64 //自动计算图片总数
uchar m=0,n=0; //m为扫描过程中的中间变量,n为显示指针
uchar a,b; //a、b分别为左半屏、右半屏的扫描变量 /*****参数调整项*****/
#define light 100 //显示亮度调节,数值不可过大,以不感到屏幕闪烁为准
#define speed 5 //卷动速度调节 /*******************************
图片取模:纵向取模,字节倒序
图片大小:32*16
*******************************/
uchar code pic[]={
0x00,0x00,0x08,0xF8,0xF8,0x08,0x00,0x00,0xF0,0xF8,0xFC,0xFC,0xFC,0xFC,0xF8,0xF0,
0xF8,0xFC,0xFC,0xFC,0xFC,0xF8,0xF0,0x00,0xF8,0xF8,0x00,0x00,0x00,0xF8,0xF8,0x00,
0x00,0x00,0x10,0x1F,0x1F,0x10,0x00,0x00,0x00,0x01,0x03,0x07,0x0F,0x1F,0x3F,0x7F,
0x3F,0x1F,0x0F,0x07,0x03,0x01,0x00,0x00,0x0F,0x1F,0x18,0x18,0x18,0x1F,0x0F,0x00,//I LOVE YOU 0xC0,0x40,0xC0,0x00,0xF0,0x08,0x00,0x00,0xF0,0x08,0x08,0x08,0xF0,0x00,0x00,0x00,
0x00,0x00,0x00,0xF0,0x08,0x08,0x08,0xF0,0x00,0x00,0x08,0xF0,0x00,0xC0,0x40,0xC0,
0x01,0x01,0x01,0x00,0x07,0x08,0x00,0x00,0x0F,0x00,0x00,0x00,0x0F,0x00,0x08,0x08,
0x08,0x08,0x00,0x0F,0x00,0x00,0x00,0x0F,0x00,0x00,0x08,0x07,0x00,0x01,0x01,0x01,//o(∩_∩)o 0xFC,0x04,0x04,0x04,0xFC,0x02,0xF2,0x12,0x12,0x12,0xF2,0x02,0x02,0xFE,0x02,0x00,
0xFC,0x04,0x04,0x04,0xFC,0x02,0xF2,0x12,0x12,0x12,0xF2,0x02,0x02,0xFE,0x02,0x00,
0x0F,0x02,0x02,0x02,0x07,0x00,0x07,0x02,0x02,0x02,0x27,0x40,0x80,0x7F,0x00,0x00,
0x0F,0x02,0x02,0x02,0x07,0x00,0x07,0x02,0x02,0x02,0x27,0x40,0x80,0x7F,0x00,0x00 //呵呵 }; /*****延时子程序*****/
void delay(void) //专门设置的延时程序用来改变扫描速度以方便调节亮度
{
uchar i;
for(i=0;i<light;i++);
} /*****初始化子程序*****/
void init(void) //定时器初始化,设置定时器0工作方式1,定时时间5ms
{
TMOD=0x1;
TH0=0xec;
TL0=0x78;
} /*****计数器中断程序*****/
void timer0(void) interrupt 1 //中断处理
{
uchar k; //定义变量k
TH0=0xec;
TL0=0x78;
k++; //定时时间到,初始变量加1
if(k>speed) {m++;k=0;} if(m<=16) {a=m;b=0;} //扫描左半屏,不扫描右半屏
else {a=16;b=m-16;} //全屏扫描左半屏,扫描右半屏 if(m>32) b=16; //全屏扫描右半屏
//中间这段时间是为了看清楚整屏画面内容,稍作停顿
if(m==48) {m=0;n++;} //一幅图片卷动显示过程结束,载入下一幅图片 if(n>num-1) n=0; //所有图片显示完毕,回到第一幅图片
} /*****显示子程序*****/
void display(void)
{
uchar i,j;
for(i=0;i<a;i++) //变量a决定了一次扫描左半屏列数
{
lie=i|0xB0; //左屏列扫描信号输出
hang1=pic[i+64*n];
hang2=pic[i+64*n+32]; //行信号输出
delay();
hang1=0;
hang2=0;
}
for(j=0;j<b;j++) //变量b决定了一次扫描右半屏列数
{
lie=j|0x70; //右屏列扫描信号输出
hang1=pic[j+64*n+16];
hang2=pic[j+64*n+48]; //行信号输出
delay();
hang1=0;
hang2=0;
}
} /*****主程序*****/
void main(void)
{
init();
TR0=1;
ET0=1;
EA=1; //开中断
while(1)
{
display();
}
}
生日快乐歌程序:/* 名称:播放音乐
说明:程序运行时播放生日快乐歌, 未使用定时器中断,所有频率完全用延时实现
*/
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit BEEP=P3^7;
//生日快乐歌的音符频率表,不同频率由不同的延时来决定
uchar code SONG_TONE[]={212,212,190,212,159,169,212,212,190,212,142,159,
212,212,106,126,159,169,190,119,119,126,159,142,159,0};
//生日快乐歌节拍表,节拍决定每个音符的演奏长短
uchar code SONG_LONG[]={9,3,12,12,12,24,9,3,12,12,12,24,
9,3,12,12,12,12,12,9,3,12,12,12,24,0};
//延时
void DelayMS(uint x)
{
uchar t;
while(x--) for(t=0;t<120;t++);//播放函数
void PlayMusic()
{
uint i=0,j,k;
while(SONG_LONG[i]!=0||SONG_TONE[i]!=0)
{ //播放各个音符,SONG_LONG 为拍子长度
for(j=0;j<SONG_LONG[i]*20;j++)
{
BEEP=~BEEP;
//SONG_TONE 延时表决定了每个音符的频率for(k=0;k<SONG_TONE[i]/3;k++);
}
DelayMS(10);
i++;
}
}
void main()
{
BEEP=0;
while(1)
{
PlayMusic(); //播放生日快乐
DelayMS(500); //播放完后暂停一段时间
}
}
怎么才能将两个程序和在一起既能显示图片又能播放音乐?不胜感谢!
还有用蜂鸣器播放生日快乐歌用中断方式怎么实现?用延时的方法效果太差了