概述
关于驱动函数的书写,是液晶显示的基础,整个液晶驱动主要有四个函数组成:
1、写命令函数;
2、写数据函数;
3、读状态函数;
4、读数据函数;
这四个函数并不是必须全部写的,具体要看你实现的功能,如果只是单纯的显示汉字和字符,写命令、写数据、读状态这三个函数就够了,如过你还需要进行一些绘图的操作,那读数据函数也必须书写。
另外关于读状态函数,其实也就是用于判忙操作,原则上每次对控制器进行读写操作之前,都必须进行读写检测,由于单片机的操作速度慢于液晶控制器的反应速度,因此可不进行读写检测,或者只进行简短的延时即可。因此,读状态函数也可以不写,只用简短的延时函数替换即可。
单片机用于控制LCD的管脚主要为RS、RW和E管脚,分别的功能是RS为0时,对应单片机访问的是命令寄存器,为1时对应数据寄存器;RW为1时,对应单片机操作为读操作,为0时对应单片机为写操作;E是使能信号。
初始化操作如下:
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
LCD液晶屏初始化过程如图所示为:
打点函数
打点函数是创建GUI的基础,打点函数的书写分为以下几个步骤:
1.
2.
3.
4.
5.
6.
GDRAM地址分布情况,需要注意的是横纵坐标的起始地址都是0x80,还有上下半屏的横坐标是不一样的,下半屏的横坐标要加上0x08,而纵坐标跟对应的上半屏的纵坐标是一样的。GDRAM地址分布图,如图所示。
下面的函数是12864与FFT算法的一个结合,里面设置了一个门函数,12864上显示的结果则是一个sinc函数,证明结果是正确的。
#include <iom16v.h>
#include <macros.h>
#include<math.h>
#define N 128
#define PI 3.141592653589
#define uchar unsigned char
#define uint unsigned int
#define RS (1<<4)
#define RW (1<<5)
#define EN (1<<6)
//
typedef struct
{
int real;
int img;
}complex;
void initw();
void bitReverse();
void FFT();
complex x[N];
uchar vis[N];
void delayms(uint ms)
{
}
//此处定义字符串
//写数据
void WriteDataLCM(unsigned char WDLCM)
{
// ReadStatusLCM(); //检测忙
delayms(1);
PORTA|=RS;
delayms(1);
PORTA&=~RW;
delayms(1);
PORTA|=EN;
delayms(1);
PORTB=WDLCM;
delayms(1);
PORTA&=~EN;
delayms(1);
}
//写指令
void WriteCommandLCM(unsigned char WCLCM) //写命令函数
{
// ReadStatusLCM(); //根据需要检测忙
delayms(1);
PORTA&=~RS;
delayms(1);
PORTA&=~RW;
delayms(1);
PORTA|=EN;
delayms(1);
PORTB=WCLCM;
delayms(1);
PORTA&=~EN;
delayms(1);
}
//读状态:检测忙
void ReadStatusLCM()
{
uchar temp;
{
PORTB=0xff;
delayms(1);
delayms(1);
PORTA&=~RS;
delayms(1);
PORTA|=RW;
delayms(1);
PORTA|=EN;
delayms(10);
temp = PINB;
delayms(10);
DDRB=0xff;
delayms(10);
PORTA&=~EN;
delayms(1);
if(temp>>7==0)
flag = 0;
}
}
uchar read_data() //读数据函数
{
}
void point(uchar x,uchar y) //打点函数,最重要的函数,GUI的基础
{
}
}
}
//LCM初始化
void LCMInit(void)
{
WriteCommandLCM(0x30);
delayms(10);
WriteCommandLCM(0x30);
delayms(10);
WriteCommandLCM(0x30);
delayms(10);
WriteCommandLCM(0x30);
WriteCommandLCM(0x08);
WriteCommandLCM(0x01);
WriteCommandLCM(0x06);
WriteCommandLCM(0x0C);
}
void clear(uchar dat)
{
}
}
}
}
void heng(uchar a)
{
}
void su(uchar a)
{
}
void FFT()
{
int i,j,k,t,P,B,m;
complex up,down,product;
for (i=0;i<7;i++)
{
B=1<<i;
for (j=0;j<B;j++)
{
t=1<<(6-i);
P=t*j;
for (k=j;k<N;k=k+2*B)
{
complex product;
product.real=x[k+B].real*cos(2*PI*P/N)+x[k+B].img*sin(2*PI*P/N);
product.img=x[k+B].real*(-1)* sin(2*PI*P/N)+x[k+B].img*cos(2*PI*P/N);
}
}
}
}
void initw()
{
int i;
for (i=0;i<N;i++)
vis[i]=0;
}
void bitReverse()
{
int i,j=0;
int k=0;
int q=0;
complex tmp3;
for (i=0;i<N;i++)
{
if(vis[i]==0)
vis[i]=1;
vis[tmp2]=1;
}
}
void xian(uchar x,uchar y)
{
}
//主函数
void main(void)
{
uchar ii,y;
float tmp;
DDRA=0xff;
PORTA=0xff;
DDRB=0xff;
PORTB=0xff;
DDRD=0xff;
PORTD=0x00;
delayms(20);
delayms(20);
LCMInit(); //LCM初始化
delayms(100);
heng(0);
heng(63);
su(0);
su(127);
for (ii=0;ii<20;ii++)
{
x[ii].real=3;
x[ii].img=0;
}
for (ii=20;ii<128;ii++)
{
x[ii].real=0;
x[ii].img=0;
}
initw();
bitReverse();
FFT();
for(ii=64;ii<128;ii++)
point(ii-64,y);
xian(ii-64,y);
for(ii=0;ii<64;ii++)
point(ii+64,y);
xian(ii+64,y);
while(1);
}
得到的图片:
最后
以上就是天真苗条为你收集整理的FFT算法在单片机中的使用&&L…的全部内容,希望文章能够帮你解决FFT算法在单片机中的使用&&L…所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复