久久精品99久久_亚洲一区二区综合_狠狠色伊人亚洲综合成人_亚洲综合爱爱久久网

你好!歡迎來到深圳市穎特新科技有限公司!
語言
當前位置:首頁 >> 技術中心 >> 單片機入門 >> FFT算法在單片機中的使用&&LCD12864驅動

FFT算法在單片機中的使用&&LCD12864驅動

關鍵字:12864液晶 作者:admin 來源:不詳 發布時間:2018-05-19  瀏覽:57

本次創新基金我是要做一個簡易的頻譜儀,核心就是要進行一個FFT運算。大家知道,如果采用DSP芯片效果那是相當好的。但由于項目資金以及時間不夠等情況,我采用的是ATMEL公司的AVR單片機,這款單片機的FLASH存儲和內存比51單片機犀利得多。

由于采用的是12864液晶,也就是一個橫128點豎64點的一個點陣,因而采用128點FFT運算已然夠了,因為即使得到再多的數據也無法在液晶上可視化顯示出來。本文是基于128點FFT運算。

程序如下:

#include

#include

#include

#define N 128

#define PI 3.141592653589

#define uchar unsigned char

#define uint unsigned int

typedef struct

{

int real;

int img;

}complex;

void initw(); //初始化旋轉因子

void bitReverse(); //比特反轉

void FFT();

complex x[N];

uchar vis[N];

void delayms(uint ms)

{

uint i,j;

for(i=0;i

{

for(j=0;j<3;j++);

}

}

void FFT()

{

int i,j,k,t,P,B,m;

complex up,down,product;

for (i=0;i<7;i++)

{

B=1<

for (j=0;j

{

t=1<<(6-i);

P=t*j;

for (k=j;k

{

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);

x[k+B].real=x[k].real-product.real;

x[k+B].img=x[k].img-product.img;

x[k].real=x[k].real+product.real;

x[k].img=x[k].img+product.img;

}

}

}

}

void initw() //初始化旋轉因子

{

int i;

for (i=0;i

vis[i]=0;

}

void bitReverse() //比特反轉

{

int i,j=0;

int k=0;

int q=0;

complex tmp3;

for (i=0;i

{

int tmp=i,tmp2=0,j;

for(j=0;j<7;j++)

tmp2+=((tmp>>j)&1)*(1<<(6-j));

if(vis[i]==0)

{

tmp3=x[i];

x[i]=x[tmp2];

x[tmp2]=tmp3;

vis[i]=1;

vis[tmp2]=1;

}

}

}

void main()

{

uchar ii,y;

float tmp;

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();

while(1);

}

1.jpg

2.gif

上圖是8點FFT運算,按照上圖的流程所示,FFT運算主要有兩步,一步是比特反轉,就是右邊不是按照0、1、2、3……這樣順序進行計算的,而左邊是的,兩邊的關系就是進行一個比特反轉。可以看到右邊0對應二進制為000,左邊對應二進制為000,右邊1二進制001,左邊4對應二進制100,依次下去,可以清楚看到,對于8位FFT運算,對應二進制有三位,而左右兩邊的關系恰巧是按照中間位進行了個反轉。

FFT運算第二步就是乘以旋轉因子,注意的是這里是復數運算,虛部和實部都要加入運算。乘以旋轉因子后對進行加減運算得到新的值,依次下去得到最終解。

3.jpg

由于單片機內存的限制,因而對于傳統的FFT算法,我進行了些改進,原則就是盡量地少使用變量,一個變量可以重復的使用是最理想的了,大家可以在程序中看出。個人意見這是能節省變量最少的了,如果有好的方法,希望可以告訴我下,我的郵箱是albertvictordu@139.com,謝謝!

下面是12864液晶驅動程序的寫法:

LCD12864液晶,即像素為128*64的顯示液晶。它的每一行橫向一共有128個可顯示點,每一列縱向有64個,這些“點”其實也都是一個個發光二極管。它可以在一個16*16的點陣區域上顯示一個中文,也可以在一個8*16的點陣區域顯示一個非中文字符,一般稱為半寬字體。即一個中文字所占顯示面積是一個非中文字符的兩倍。

關于驅動函數的書寫,是液晶顯示的基礎,整個液晶驅動主要有四個函數組成:

1、寫命令函數;

2、寫數據函數;

3、讀狀態函數;

4、讀數據函數;

這四個函數并不是必須全部寫的,具體要看你實現的功能,如果只是單純的顯示漢字和字符,寫命令、寫數據、讀狀態這三個函數就夠了,如過你還需要進行一些繪圖的操作,那讀數據函數也必須書寫。

另外關于讀狀態函數,其實也就是用于判忙操作,原則上每次對控制器進行讀寫操作之前,都必須進行讀寫檢測,由于單片機的操作速度慢于液晶控制器的反應速度,因此可不進行讀寫檢測,或者只進行簡短的延時即可。因此,讀狀態函數也可以不寫,只用簡短的延時函數替換即可。

單片機用于控制LCD的管腳主要為RS、RW和E管腳,分別的功能是RS為0時,對應單片機訪問的是命令寄存器,為1時對應數據寄存器;RW為1時,對應單片機操作為讀操作,為0時對應單片機為寫操作;E是使能信號。

讀操作如下圖所示

4.jpg

寫操作如下圖所示

5.jpg

在12864液晶中,開發商將一些基本指令已經寫入到命令寄存器中,我們調用該指令就可以完成相應的功能。

LCD初始化

初始化操作如下:

1. 芯片上電;

2. 延時40ms以上;

3. 復位操作:RST出現一個上升沿(RST=1;RST=0;RST=1;);

4. 功能設定;

5. 延時100us以上;

6. 再次進行功能設定;

7. 延時37us;

8. 顯示開關控制;

9. 延時100us以上;

10. 清除顯示;

11. 延時10ms以上;

12. 進入點設置;

13. 初始化結束;

LCD液晶屏初始化過程如圖所示為:

6.jpg

打點函數

打點函數是創建GUI的基礎,打點函數的書寫分為以下幾個步驟:

1. 進入擴展模式

2. 寫入打點地址

3. 讀取該地址的數據

4. 修改該地址的數據

5. 將修改后的數據輸入LCD中

6. 進入普通模式

GDRAM地址分布情況,需要注意的是橫縱坐標的起始地址都是0x80,還有上下半屏的橫坐標是不一樣的,下半屏的橫坐標要加上0x08,而縱坐標跟對應的上半屏的縱坐標是一樣的。GDRAM地址分布圖,如圖所示。

7.jpg

下面的函數是12864與FFT算法的一個結合,里面設置了一個門函數,12864上顯示的結果則是一個sinc函數,證明結果是正確的。

#include

#include

#include

#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)

{

uint i,j;

for(i=0;i

{

for(j=0;j<3;j++);

}

}

//此處定義字符串

//寫數據

void WriteDataLCM(unsigned char WDLCM) //寫數據函數

{

// ReadStatusLCM(); //檢測忙

delayms(1);

PORTA|=RS; //RS=1

delayms(1);

PORTA&=~RW; //RW=0

delayms(1);

PORTA|=EN; //EN=1

delayms(1);

PORTB=WDLCM; //輸出數據

delayms(1);

PORTA&=~EN; //EN=0

delayms(1);

}

//寫指令

void WriteCommandLCM(unsigned char WCLCM) //寫命令函數

{

// ReadStatusLCM(); //根據需要檢測忙

delayms(1);

PORTA&=~RS; //RS=0

delayms(1);

PORTA&=~RW; //RW=0

delayms(1);

PORTA|=EN; //EN=1

delayms(1);

PORTB=WCLCM; //輸出指令

delayms(1);

PORTA&=~EN; //EN=0

delayms(1);

}

//讀狀態:檢測忙

void ReadStatusLCM() //讀狀態函數

{

uchar temp;

uchar flag = 1;

while(flag==1)

{

PORTB=0xff;

delayms(1);

DDRB=0x00; //端口B改為輸入

delayms(1);

PORTA&=~RS; //RS=0

delayms(1);

PORTA|=RW; //RW=1

delayms(1);

PORTA|=EN; //EN=1

delayms(10);

temp = PINB; //讀端口B

delayms(10);

DDRB=0xff; //端口B改為

delayms(10);

PORTA&=~EN; //EN=0

delayms(1);

if(temp>>7==0)

flag = 0;

}

}

uchar read_data() //讀數據函數

{

uchar lcd_data;

PORTB=0xff;

DDRB=0x00;

PORTA|=RW;

PORTA|=RS;

delayms(10);

PORTA|=EN;

delayms(10);

lcd_data=PINB;

delayms(10);

PORTA&=~EN;

DDRB=0xff;

return(lcd_data) ;

}

void point(uchar x,uchar y) //打點函數,最重要的函數,GUI的基礎

{

uchar x_Dyte,x_byte;

uchar y_Dyte,y_byte;

uchar GDRAM_hbit,GDRAM_lbit;

WriteCommandLCM(0x36);

x_Dyte=x/16;

x_byte=x&0x0f;

y_Dyte=y/32;

y_byte=y&0x1f;

WriteCommandLCM(0x80+y_byte);

WriteCommandLCM(0x80+x_Dyte+8*y_Dyte);

read_data();

GDRAM_hbit=read_data();

GDRAM_lbit=read_data();

delayms(10);

WriteCommandLCM(0x80+y_byte);

WriteCommandLCM(0x80+x_Dyte+8*y_Dyte);

delayms(10);

if(x_byte<8)

{

WriteDataLCM(GDRAM_hbit|(0x01<<(7-x_byte)));

WriteDataLCM(GDRAM_lbit);

}

else

{

WriteDataLCM(GDRAM_hbit);

WriteDataLCM(GDRAM_lbit|(0x01<<(15-x_byte)));

}

WriteCommandLCM(0x30);

}

//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) //清屏函數

{

uchar i,j,k;

uchar addr=0x80;

for(i=0;i<2;i++)

{

for(j=0;j<32;j++)

{

for(k=0;k<8;k++)

{

WriteCommandLCM(0x36);

WriteCommandLCM(0x80+j);

WriteCommandLCM(addr+k);

WriteDataLCM(dat);

WriteDataLCM(dat);

}

}

addr=0x88;

}

WriteCommandLCM(0x36);

WriteCommandLCM(0x30);

}

void heng(uchar a)

{

uchar i;

for(i=0;i<127;i++)

point(i,a);

}

void su(uchar a)

{

uchar i;

for(i=0;i<63;i++)

point(a,i);

}

void FFT()

{

int i,j,k,t,P,B,m;

complex up,down,product;

for (i=0;i<7;i++)

{

B=1<

for (j=0;j

{

t=1<<(6-i);

P=t*j;

for (k=j;k

{

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);

x[k+B].real=x[k].real-product.real;

x[k+B].img=x[k].img-product.img;

x[k].real=x[k].real+product.real;

x[k].img=x[k].img+product.img;

}

}

}

}

void initw() //初始化旋轉因子

{

int i;

for (i=0;i

vis[i]=0;

}

void bitReverse() //比特反轉

{

int i,j=0;

int k=0;

int q=0;

complex tmp3;

for (i=0;i

{

int tmp=i,tmp2=0,j;

for(j=0;j<7;j++)

tmp2+=((tmp>>j)&1)*(1<<(6-j));

if(vis[i]==0)

{

tmp3=x[i];

x[i]=x[tmp2];

x[tmp2]=tmp3;

vis[i]=1;

vis[tmp2]=1;

}

}

}

void xian(uchar x,uchar y)

{

uchar i;

for(i=63;i>=y;i--)

point(x,i);

}

//主函數

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);

clear(0x00);

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++)

{

tmp=sqrt((x[ii].real*x[ii].real)+(x[ii].img*x[ii].img));

y= 63-(int)tmp;

point(ii-64,y);

xian(ii-64,y);

}

for(ii=0;ii<64;ii++)

{

tmp=sqrt((x[ii].real*x[ii].real)+(x[ii].img*x[ii].img));

y= 63-(int)tmp;

point(ii+64,y);

xian(ii+64,y);

}

while(1);

}

得到的圖片:

8.jpg

MATLAB仿真圖形:

9.jpg

編輯:admin  最后修改時間:2018-05-19

聯系方式

0755-82591179

郵箱:ivy@yingtexin.net

地址:深圳市南山區桃源街道平山社區平山一路2號南山云谷創業園二期11棟410-411

Copyright © 2014-2026 穎特新科技有限公司 All Rights Reserved.  粵ICP備14043402號-4

久久精品99久久_亚洲一区二区综合_狠狠色伊人亚洲综合成人_亚洲综合爱爱久久网
日本在线观看a| 日韩五码在线观看| 国产视频一区二区视频| 97国产精东麻豆人妻电影| 国产91沈先生在线播放| 国产小视频免费| 日韩精品在线中文字幕| 精品无码一区二区三区爱欲| 国产精品入口芒果| 50路60路老熟妇啪啪| 密臀av一区二区三区| 高潮一区二区三区| 99精品视频免费版的特色功能| 午夜av中文字幕| 屁屁影院ccyy国产第一页| 国产3p露脸普通话对白| 色综合手机在线| 日韩av福利在线观看| 日韩欧美一级在线| 日韩av片在线看| 久久撸在线视频| 成人午夜视频免费观看| 人妻精品无码一区二区三区 | 美女少妇一区二区| 午夜福利123| 国产精品50p| 日韩欧美理论片| 男人日女人视频网站| 欧美三级理论片| 国产美女在线一区| 樱花草www在线| 国产日韩成人内射视频| 手机看片日韩国产| 日本熟妇人妻中出| 免费一级特黄毛片| 精品亚洲视频在线| 国产成人精品无码播放| 国产欧美久久久久| 青少年xxxxx性开放hg| 日韩av播放器| 被灌满精子的波多野结衣| 17c国产在线| 国产成人久久婷婷精品流白浆| 色爽爽爽爽爽爽爽爽| 成人亚洲精品777777大片| 无码专区aaaaaa免费视频| 亚洲欧美一二三| 成人午夜激情av| 2022亚洲天堂| 久久人人爽人人爽人人av| 波多野结衣在线免费观看| 另类小说第一页| www.日日操| 国产午夜福利100集发布| 天天视频天天爽| 国内自拍视频一区| 国产一级不卡毛片| 国产又黄又猛视频| 美女福利视频在线| 国产成人精品视频免费看| 国产成人艳妇aa视频在线| 一区二区三区四区免费观看| 鲁一鲁一鲁一鲁一av| 苍井空浴缸大战猛男120分钟| 成人免费aaa| av免费观看大全| 国产 日韩 亚洲 欧美| 日本丰满少妇xxxx| 久久久久狠狠高潮亚洲精品| 欧美激情成人网| 午夜视频在线瓜伦| 高清av免费看| 精品国产三级a∨在线| 看一级黄色录像| 男女超爽视频免费播放| 可以在线看的av网站| 成人在线观看a| 亚洲天堂网2018| 亚洲欧美一区二区三区不卡| 精品免费久久久久久久| 加勒比成人在线| 青娱乐自拍偷拍| 午夜久久福利视频| 超碰超碰超碰超碰超碰| 天堂8在线天堂资源bt| 日本三级免费观看| 手机在线免费毛片| 在线观看免费视频高清游戏推荐| 黄色一级片在线看| 老司机av福利| 国产欧美综合一区| 亚洲欧洲日产国码无码久久99| 国产一区二区在线视频播放| 熟女人妇 成熟妇女系列视频| 黑森林福利视频导航| 国产av人人夜夜澡人人爽| 精品国产三级a∨在线| 欧美大尺度做爰床戏| 国产在线拍揄自揄拍无码| 中文字幕无码精品亚洲35| 99re99热| 精品国产免费av| 全黄性性激高免费视频| 亚洲性图一区二区| 欧美 日本 亚洲| 色哟哟免费网站| av影院在线播放| 99九九99九九九99九他书对| 色一情一乱一伦一区二区三区日本| 激情视频免费网站| 国产又爽又黄ai换脸| 中文久久久久久| 岛国大片在线播放| 国自产拍偷拍精品啪啪一区二区 | 亚洲熟妇无码另类久久久| 久草视频国产在线| 手机精品视频在线| 国产精品久久久久久9999| 成年在线观看视频| 久久久一二三四| 久久久久xxxx| 免费一区二区三区在线观看| 日韩精品一区二区三区不卡 | 思思久久精品视频| 日韩av一二三四| 欧美 日韩 国产一区| 久久精品国产sm调教网站演员| 久久久久久久免费视频| 91丝袜超薄交口足| 在线观看免费的av| 91福利免费观看| 91欧美一区二区三区| 污免费在线观看| 日本精品免费视频| 黄色一级大片免费| 屁屁影院ccyy国产第一页| 国产1区2区3区中文字幕| 9色porny| 国产又黄又大又粗视频| 成年人网站大全| 国产野外作爱视频播放| 中文字幕第38页| 美国av在线播放| 久操手机在线视频| 黄页免费在线观看视频| 日本在线观看a| 久久久精品麻豆| 日本高清免费观看| 国产精品裸体瑜伽视频| 国产精品免费观看久久| 在线免费观看视频黄| 欧美 另类 交| h无码动漫在线观看| 欧洲av无码放荡人妇网站| 久久精品影视大全| 美女在线免费视频| 怡红院av亚洲一区二区三区h| www.xxx亚洲| 亚洲一二三av| 国产精品沙发午睡系列| 五月天av在线播放| 国产精品一线二线三线| 国产又黄又猛又粗又爽的视频| 香蕉视频xxxx| 国产成人无码av在线播放dvd| 午夜免费一级片| 国产在线观看福利| 男人的天堂成人| 国产高清视频网站| 成 年 人 黄 色 大 片大 全| 亚洲精品久久久久久宅男| 免费 成 人 黄 色| 一区二区三区四区久久| 日韩激情免费视频| 无码日本精品xxxxxxxxx| 久久久国产欧美| 国产精品丝袜久久久久久消防器材 | 日韩亚洲欧美一区二区| 污色网站在线观看| 黄色免费视频大全| 人妻无码一区二区三区四区| 亚洲综合色在线观看| 黄色片视频在线免费观看| 日韩视频一二三| 男女啪啪的视频| 岛国毛片在线播放| 国产视频一区二区视频| av在线播放天堂| 17c丨国产丨精品视频| 久久精品在线免费视频| 国内自拍第二页| 国产无遮挡猛进猛出免费软件| 免费午夜视频在线观看| 免费成人在线视频网站| 妞干网视频在线观看| 久久av综合网| 欧美视频在线免费播放| 黄色一级在线视频| 无码人妻h动漫| 精品久久久久久中文字幕2017|