加入星計劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴散
  • 作品版權(quán)保護(hù)
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長期合作伙伴
立即加入

基于51單片機的波形發(fā)生器【12864,4種,PCF8591】(仿真)

12/09 09:53
789
服務(wù)支持:
技術(shù)交流群

完成交易后在“購買成功”頁面掃碼入群,即可與技術(shù)大咖們分享疑惑和經(jīng)驗、收獲成長和認(rèn)同、領(lǐng)取優(yōu)惠和紅包等。

虛擬商品不可退

當(dāng)前內(nèi)容為數(shù)字版權(quán)作品,購買后不支持退換且無法轉(zhuǎn)移使用。

加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論
放大
實物圖
相關(guān)方案
  • 方案介紹
  • 相關(guān)文件
  • 相關(guān)推薦
  • 電子產(chǎn)業(yè)圖譜
申請入駐 產(chǎn)業(yè)圖譜

波形發(fā)生器:

1、使用PCF8591輸出正弦波,方波,鋸齒波,三角波四種波形。

2、能設(shè)置波形頻率、幅度。

3、使用12864顯示波形參數(shù)。

#include <AMPIRE128X64.h>
uchar *ppp,*qqq;
 uchar code num0[16] ={0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00};/*"0",0*/
 uchar code num1[16] ={0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00};/*"1",1*/
 uchar code num2[16] ={0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00};/*"2",2*/
 uchar code num3[16] ={0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00};/*"3",3*/
 uchar code num4[16] ={0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00};/*"4",4*/
 uchar code num5[16] ={0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00};/*"5",5*/
 uchar code num6[16] ={0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00};/*"6",6*/
 uchar code num7[16] ={0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00};/*"7",7*/
 uchar code num8[16] ={0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00};/*"8",8*/
 uchar code num9[16] ={0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00};/*"9",9*/
 uchar code fuhao[16]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01};/*"-",0*/
 uchar code kong[16] ={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};/*" ",0*/
 uchar code dian[16] ={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00};/*".",0*/ 
 void delay_lcd(uint i)
 {
 	while(i--);
 }
/************** 判忙函數(shù) **************/ 
void lcd_r_busy()
{
    P0 = 0x00;
    RS = 0;
    RW = 1;
    EN = 1;
    while (P0 & 0x80);  // 最高位DB7==1,則busy
    EN = 0;
}
 
 
/************* LCD寫命令函數(shù) *************/
void lcd_w_cmd(uchar value)
{
    lcd_r_busy();    // 每次讀寫操作前都要忙判斷
    RS = 0;
    RW = 0;
    P0 = value;
    EN = 1;       // 下降沿鎖存寫入的數(shù)據(jù)/命令
    _nop_();
    _nop_();
	delay_lcd(10);
    EN = 0;
	delay_lcd(10);
}
 
 
/************* LCD寫數(shù)據(jù)  **************/
void lcd_w_data(uchar value)
{
    lcd_r_busy();
    RS = 1;
    RW = 0;
    P0 = value;
    EN = 1;        // 下降沿鎖存寫入的數(shù)據(jù)/命令
    _nop_();
    _nop_();
	delay_lcd(10);
    EN = 0;
	delay_lcd(10);
}
 
 
/***************頁設(shè)置:顯示在哪一頁******************/
/*************共8頁,一頁是8行像素點*****************/
void lcd_set_page(uchar page)
{
    page = 0xb8 | page;   // 頁的首地址為0xb8:page或上0xb8=選擇page頁
    lcd_w_cmd(page);
}
 
 
/************行設(shè)置:起始在哪一行********************/
/**********每頁共8行,一般從0行開始******************/
void lcd_set_line(uchar sline)
{
    sline = 0xc0 | sline;  // 起始行地址為0xc0:sline或上0xc0=選擇行
    lcd_w_cmd(sline);
}
 
 
/*************起始列設(shè)置+像素點選擇********************/
/***********每半片共64列,列值不得大于63***************/
void lcd_set_column(uchar column)
{
    column = 0x3f & column;  // 與上列的最大值63:0x3f 可得所選列值<63
    column = 0x40 | column;  // 得列的首地址
    lcd_w_cmd(column);
}
 
 
/*************設(shè)置顯示的開關(guān)********************/
/**********0為關(guān)閉顯示;1為 開啟顯示************/
void lcd_on_off(uchar set)
{
    set = 0x3e | set;    // =0011 111x----0x3e為關(guān)閉顯示;0x3f為開啟顯示
    lcd_w_cmd(set);
}
 
 
/*************選擇左右半屏顯示********************/
/********0-全屏顯示;1-左;2-右********************/
/************cs片選端低電平有效********************/
void lcd_cs(uchar sel)
{
    switch (sel)
    {
    case 0:CS1 = 0; CS2 = 0; break;   // 全屏顯示
    case 1:CS1 = 0; CS2 = 1; break;   // 左顯示
    case 2:CS1 = 1; CS2 = 0; break;   // 右顯示
    default:break;
    }
}
 
 
/*************清屏:選擇半屏********************/
/********0-清全屏;1-清左;2-清右***************/
void lcd_clear(uchar sel)
{
    uchar i, j;
    lcd_cs(sel);
    for (i = 0; i < 8; i++)
    {
        lcd_set_page(i);
        lcd_set_column(0);
        for (j = 0; j < 64; j++)
        {
            lcd_w_data(0x00);  // 每列全部寫0,列地址指針自動+1
        }
    }
}

/****************LCD的初始化********************/
void lcd_init()
{
    lcd_r_busy();
    lcd_cs(0);
    lcd_on_off(0);     // 關(guān)顯示
    lcd_cs(0);
    lcd_on_off(1);     // 開顯示
    lcd_cs(0);
    lcd_clear(0);      // 清全屏
    lcd_set_line(0);  // 起始行設(shè)為0
}
 
 
/****************16*16像素的漢字顯示程序********************/
//CS左右半屏1,2
//page 頁	  lie0-7 	 hang0-3
void display(uchar hang, uchar lie, uchar* p)
{
    uchar i;
    lcd_cs((lie>3)+1);
    lcd_set_page(hang*2);       // 要在本頁寫上半個漢字8*16
    lcd_set_column(lie*16);     // 選擇起始列
    for (i = 0; i < 16; i++)
    {
        lcd_w_data(p[i]);      // 按列輸入上半個漢字的編碼8*16
    }
    lcd_set_page(hang*2 + 1);     // 要在下一頁寫下半個漢字8*16
    lcd_set_column(lie*16);     // 選擇起始列
    for (i = 0; i < 16; i++)
    {
        lcd_w_data(p[i + 16]);   // 按列輸入下半個漢字的編碼8*16 
    }
}
/****************2數(shù)字顯示程序********************/
//CS左右半屏1,2
//page 頁
void display_num(uchar hang, uchar lie, uchar* p,uchar* q)
{
    uchar i;
    lcd_cs((lie>3)+1);
    lcd_set_page(hang*2);       // 要在本頁寫上半個漢字8*16
    lcd_set_column(lie*16);     // 選擇起始列
    for (i = 0; i < 8; i++)
    {
        lcd_w_data(p[i]);      // 按列輸入上半個漢字的編碼8*16
    }
	for (i = 0; i < 8; i++)
    {
        lcd_w_data(q[i]);      // 按列輸入上半個漢字的編碼8*16
    }
    lcd_set_page(hang*2 + 1);     // 要在下一頁寫下半個漢字8*16
    lcd_set_column(lie*16);     // 選擇起始列
    for (i = 8; i < 16; i++)
    {
        lcd_w_data(p[i]);   // 按列輸入下半個漢字的編碼8*16 
    }
	for (i = 8; i < 16; i++)
    {
        lcd_w_data(q[i]);   // 按列輸入下半個漢字的編碼8*16 
    }
}
/****************1數(shù)字顯示程序********************/
//CS左右半屏1,2
//page 頁	lie0-15
void display_one(uchar hang, uchar lie, uchar* p)
{
    uchar i;
    lcd_cs((lie>7)+1);
    lcd_set_page(hang*2);       // 要在本頁寫上半個漢字8*16
    lcd_set_column(lie*8);     // 選擇起始列
    for (i = 0; i < 8; i++)
    {
        lcd_w_data(p[i]);      // 按列輸入上半個漢字的編碼8*16
    }
    lcd_set_page(hang*2 + 1);     // 要在下一頁寫下半個漢字8*16
    lcd_set_column(lie*8);     // 選擇起始列
    for (i = 8; i < 16; i++)
    {
        lcd_w_data(p[i]);   // 按列輸入下半個漢字的編碼8*16 
    }
}

void find(uchar i)//查找指針
{
	switch(i)
	{
		case 0:ppp=num0;break;
		case 1:ppp=num1;break;
		case 2:ppp=num2;break;
		case 3:ppp=num3;break;
		case 4:ppp=num4;break;
		case 5:ppp=num5;break;
		case 6:ppp=num6;break;
		case 7:ppp=num7;break;
		case 8:ppp=num8;break;
		case 9:ppp=num9;
	}
}

 
/****************顯示圖像********************/
//CS左右半屏1,2
//page 頁	  lie0-7 	 hang0-3
void display_bmp(uchar* p)
{
    uchar i,hang;
	for(hang=4;hang<8;hang++)
	{
    	lcd_cs(1);
    	lcd_set_page(hang);       // 要在本頁寫
    	lcd_set_column(0);     // 選擇起始列
    	for (i = 0; i < 64; i++)
    	{
     	   lcd_w_data(*p);      // 按列輸入上半個漢字的編碼8*16
		   p++;
    	}
		lcd_cs(2);
    	lcd_set_page(hang);       // 要在本頁寫
    	lcd_set_column(64);     // 選擇起始列
    	for (i = 0; i < 64; i++)
    	{
     	   lcd_w_data(*p);      // 按列輸入上半個漢字的編碼8*16
		   p++;
    	}
	}
}

文章借鑒于此?紛傳

  • 有需要資料的可了解一下.docx

相關(guān)推薦

電子產(chǎn)業(yè)圖譜