|
12864液晶 圖形及文字顯示源代碼
單片機源程序如下:
- #include <iom16v.h> //包含型號頭文件
- #include <macros.h> //包含"位"操作頭文件
- #include <stdio.h> //標準輸入輸出頭文件
- #include <AVR_PQ1A.h> //包含自定義常量頭文件
- #pragma data:code //以下是字模工具取出的圖片數組
- const uchar GDRAM[1024]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- ^^^^^^^^^^省略
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
- #pragma data:data
- /*******************************************
- 函數名稱: LCD12864_portini
- 功 能: 初始化12864液晶用到的IO口
- 參 數: 無
- 返回值 : 無
- /********************************************/
- void LCD12864_portini(void)
- {
- LCDb_CTRL_DDR |= BIT(LCDb_RS)|BIT(LCDb_RW)|BIT(LCDb_E)|BIT(LCDb_RST);//配置控制管腳為輸出
- LCDb_DATA_DDR |= 0xFF; //配置數據管腳為輸出
- LCDb_SET_RST; //不使能復位端
- }
- /*******************************************
- 函數名稱: LCD12864_readbyte
- 功 能: 從12864液晶讀出一個字節數據或者指令
- 參 數: DatCmd--為iDat時是數據,為iCmd時是指令
- 返回值 : dByte--讀回的數據或者指令
- /********************************************/
- uchar LCD12864_readbyte(uchar DatCmd)
- {
- uchar dByte;
- if (DatCmd == iCmd) //指令操作
- LCDb_CLR_RS;
- else
- LCDb_SET_RS;
-
- LCDb_SET_RW; //讀操作
- LCDb_SET_E;
- LCDb_DATA_DDR=0x00; //數據總線定義為輸入
- dByte=LCDb_DI; //讀數據或者指令
- Delayms(1); //時序調整
- LCDb_CLR_E;
- LCDb_DATA_DDR|=0xff; //數據總線還原為輸出
- return dByte;
- }
- /*******************************************
- 函數名稱: LCD12864_sendbyte
- 功 能: 向12864液晶寫入一個字節數據或者指令
- 參 數: DatCmd--為iDat時是數據,為iCmd時是指令
- dByte--為寫入12864的數據或者指令
- 返回值 : 無
- /********************************************/
- void LCD12864_sendbyte(uchar DatCmd, uchar dByte)
- {
- if (DatCmd == iCmd) //指令操作
- LCDb_CLR_RS;
- else
- LCDb_SET_RS;
-
- LCDb_CLR_RW; //寫操作
- LCDb_SET_E;
- LCDb_DO = dByte; //寫入數據
- Delayus(100);
- LCDb_CLR_E;
- }
- /*******************************************
- 函數名稱: LCD12864_sendstr
- 功 能: 向12864液晶寫入一個字符串
- 參 數: ptString--字符串指針
- 返回值 : 無
- /********************************************/
- void LCD12864_sendstr(uchar *ptString)
- {
- while((*ptString)!='\0') //字符串未結束一直寫
- {
- LCD12864_sendbyte(iDat, *ptString++);
- }
- }
- /*******************************************
- 函數名稱: LCD12864_clear
- 功 能: 12864液晶清屏
- 參 數: 無
- 返回值 : 無
- /********************************************/
- void LCD12864_clear(void)
- {
- LCD12864_sendbyte(iCmd,LCDb_CLS);
- Delayms(2);// 清屏指令寫入后,2ms 的延時是很必要的!!!
- }
- /*******************************************
- 函數名稱: LCD12864_readBF
- 功 能: 12864液晶清屏
- 參 數: 無
- 返回值 : busy--為1時忙,為0時可以接收指令
- /********************************************/
- uchar LCD12864_readBF(void)
- {
- uchar busy;
- busy=LCD12864_readbyte(iCmd); //讀回BF標志和地址
- if(busy&0x80) //如果忙,返回忙狀態
- busy=1;
- else //不忙,可以寫入
- busy=0;
- return busy;
- }
- /*******************************************
- 函數名稱: LCD12864_gotoXY
- 功 能: 移動到指定位置
- 參 數: Row--指定的行
- Col--指定的列
- 返回值 : 無
- /********************************************/
- void LCD12864_gotoXY(uchar Row, uchar Col)
- {
- switch (Row) //選擇行
- {
- case 2:
- LCD12864_sendbyte(iCmd, LCDb_L2 + Col); break; //寫入第2行的指定列
- case 3:
- LCD12864_sendbyte(iCmd, LCDb_L3 + Col); break; //寫入第3行的指定列
- case 4:
- LCD12864_sendbyte(iCmd, LCDb_L4 + Col); break; //寫入第4行的指定列
- default:
- LCD12864_sendbyte(iCmd, LCDb_L1 + Col); break; //寫入第1行的指定列
- }
- }
- /*******************************************
- 函數名稱: LCD12864_initial
- 功 能: 12864液晶初始化
- 參 數: 無
- 返回值 : 無
- /********************************************/
- void LCD12864_initial(void)
- {
- Delayms(100); // 等待內部復位
- LCD12864_portini(); //端口初始化
-
- LCD12864_sendbyte(iCmd, LCDb_FUNCTION); //功能、模式設定
- while(LCD12864_readBF());
- LCD12864_sendbyte(iCmd, LCDb_ON); //打開顯示
- while(LCD12864_readBF());
- LCD12864_clear(); //清屏
- while(LCD12864_readBF());
- LCD12864_sendbyte(iCmd, LCDb_ENTRY); // 輸入模式設定
- }
- /*******************************************
- 函數名稱: LCD12864_opGDRAM
- 功 能: 向GDRAM寫入數據,并顯示(完成繪圖功能)
- 參 數: ptGDRAM--GDRAM數據指針
- 返回值 : 無
- /********************************************/
- void LCD12864_opGDRAM(const uchar *ptGDRAM)
- {
- uchar i,j;
- uint x=0;
- while(LCD12864_readBF()); //讀忙標志
- LCD12864_sendbyte(iCmd,LCDb_EXTCMD1); //擴充指令集,并關閉繪圖顯示
- //寫入并顯示上半屏幕
- for(i=0;i<32;i++) //行地址計數
- {
- for(j=0;j<8;j++) //列地址計數
- {
- LCD12864_sendbyte(iCmd,0x80|i);//輸入行地址
- Delayus(10);
- LCD12864_sendbyte(iCmd,0x80|j);//輸入列地址
- Delayus(10);
- LCD12864_sendbyte(iDat,ptGDRAM[x++]); //輸入高位字節數據
- Delayus(10);
- LCD12864_sendbyte(iDat,ptGDRAM[x++]); //輸入低位字節數據
- Delayus(10);
- }
- }
- //寫入并顯示下半屏幕
- for(i=0;i<32;i++)
- {
- for(j=8;j<16;j++)
- {
- LCD12864_sendbyte(iCmd,0x80|i);//輸入行地址
- Delayus(10);
- LCD12864_sendbyte(iCmd,0x80|j);//輸入列地址
- Delayus(10);
- LCD12864_sendbyte(iDat,ptGDRAM[x++]); //輸入高位字節數據
- Delayus(10);
- LCD12864_sendbyte(iDat,ptGDRAM[x++]); //輸入低位字節數據
- Delayus(10);
- }
- }
- Delayus(10);
- LCD12864_sendbyte(iCmd,LCDb_EXTCMD2); //打開繪圖顯示
- LCD12864_sendbyte(iCmd,LCDb_BASCMD); //還原回基本指令集模式
- }
- /*******************************************
- 函數名稱: main
- 功 能: 12864液晶驅動主程序
- 參 數: 無
- 返回值 : 無
- /********************************************/
- void main(void)
- {
- uchar i;
- Board_init( ); //初始化開發板
- LCD12864_initial(); //初始化12864液晶
-
- while(1)
- {
- LCD12864_clear();
- while(LCD12864_readBF());
- LCD12864_gotoXY(1,0); //第1行,第1列顯示
- LCD12864_sendstr("AVR_PQ1A 開發板");
- LCD12864_gotoXY(2,2); //第2行,第3列顯示
- LCD12864_sendstr("皮球制作");
- LCD12864_gotoXY(3,0); //第3行,第1列顯示
- LCD12864_sendstr("電話:13212800564");
- LCD12864_gotoXY(4,1); //第4行,第2列顯示
- LCD12864_sendstr("xxxxxxxx ");
- Delayms(40000); //延時等待
-
- LCD12864_clear(); //清屏幕
- LCD12864_opGDRAM(GDRAM); //完成繪圖,繪圖后返回基本指令集模式
- Delayms(40000);
- }
- }
復制代碼
所有程序51hei提供下載:
4_12864.rar
(35.84 KB, 下載次數: 26)
2020-10-27 10:51 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|
-
-
實驗例程介紹.pdf
2020-10-29 10:38 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
193.64 KB, 下載次數: 15, 下載積分: 黑幣 -5
-
-
AVR_PQ1A BOARD.pdf
2020-10-29 10:38 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
86.56 KB, 下載次數: 12, 下載積分: 黑幣 -5
|