0.png (46.28 KB, 下載次數: 70)
下載附件
2016-10-11 19:22 上傳
12864液晶的串行驅動程序 帶反白顯示,畫圖等:
12864液晶的串行驅動程序.rar
(24.09 KB, 下載次數: 77)
2016-10-11 19:22 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
- /*******************************************************************
- *【文 件 名】:12864s.h *
- *【建立日期】:7月1日 *
- *【修改日期】:7月10日 *
- *【文件作用】:液晶12864驅動程序,包括所有關于液晶得函數 *
- *【說 明】:RW=1,從液晶讀數據到MCU;RW=0,寫一個數據到液晶; *
- * (一般RW都設為0,即只向液晶寫數據,不讀數據) *
- * RS=1,寫入的是數據;RS=0,寫入的是指令; *
- * 一般模式:RW=0,RS=1;寫數據 *
- * RW=0,RS=0;寫指令 *
- *------------------------------------------------------------------*
- *【作 者】:郭鑫(ben) *
- *【版 權】:國家創新性實驗項目,編號GCS07001 *
- *******************************************************************/
- #ifndef _12864S_08_07_04_
- #define _12864S_08_07_04_
- /***************************頭文件部分*****************************/
- #include <REG52.h>
- #include <intrins.h>
- //------------------------換名定義,方便使用----------------------
- #define uchar unsigned char
- #define uint unsigned int
- #define nop _nop_()
- #define xtal 12
- //-------------------------管腳定義--------------------------------
- sbit CS = P2^0; //RS_LCD
- sbit SID = P2^1; //RW_LCD
- sbit SCLK = P2^2; //E_LCD
- /***************************函數聲明*******************************/
- void delay(uint ms); //延時子程序
- void lcd_1byte_w(uchar RW, uchar RS, uchar W_data); //基本操作函數
- void lcd_8bits_w(uchar W_bits);
- void lcd_dat_w(uchar dat); //寫數據
- void lcd_cmd_w(uchar cmd); //寫命令
- void lcd_str_w(uchar *string); //寫字符串
- void lcd_initial(void); //初始化
- void lcd_setposition(uchar x, uchar y);
- void lcd_black_pic(void); //繪圖命令,用于反白顯示
- void lcd_clear_pic(void);
- void lcd_row_off(uchar temp);
- void lcd_row_on(uchar temp);
- void logo(void); //兩個歡迎界面
- void logo2(void);
- //-----------------------------LCD12864讀命令----------------------------
- uchar lcd_cmd_r(void)
- {
- uchar i;
- uchar temp;
- CS = 0;
- SID = 0;
- SCLK = 0;
- CS = 1;
- // 11111 100
- SID = 1;
- for (i=0;i<5;i++){SCLK = 1;SCLK = 0;}
- SID = 1;
- SCLK = 1;SCLK = 0;
- SID = 0;
- SCLK = 1;SCLK = 0;
- SID = 0;
- SCLK = 1;SCLK = 0;
- temp = 0;
- for (i=0;i<8;i++)
- {
- SCLK = 1;
- temp <<=1;
- temp |= SID;
- SCLK = 0;
- }
- temp >>= 4;
- for (i=0;i<4;i++)
- {
- SCLK = 1;
- temp <<=1;
- temp |= SID;
- SCLK = 0;
- }
- for (i=0;i<4;i++)
- {
- SCLK = 1;SCLK = 0;
- }
- CS = 0;
- SID = 0;
- SCLK = 0;
- return temp;
- }
- //-------------------LDC忙檢測-------------------------------------
- void lcd_busy_check(void)
- {
- uchar busy;
- do{
- busy = lcd_cmd_r();
- }while(busy&0x80);
- }
- /*******************************************************************
- *【函 數 名】:lcd_8bits_w *
- *【修改日期】:2008年7月2日 *
- *【函數作用】:12864寫入8位數據 *
- *------------------------------------------------------------------*
- *【備 注】:從高位開始傳送 *
- *******************************************************************/
- void lcd_8bits_w(uchar W_bits)
- {
- uchar i,Temp_data;
- for(i=0; i<8; i++)
- {
- Temp_data = W_bits;
- Temp_data <<= i;
- if((Temp_data&0x80)==0) //bit7 is 0
- {
- SID = 0;
- nop;
- SCLK = 1;
- nop;
- nop;
- SCLK = 0;
- nop;
- SID = 0;
- }
- else //bit7 is 1
- {
- SID = 1;
- nop;
- SCLK = 1;
- nop;
- nop;
- SCLK = 0;
- nop;
- SID = 0;
- }
- }
- }
- /*******************************************************************
- *【函 數 名】:lcd_1byte_w *
- *【修改日期】:2008年7月2日 *
- *【函數作用】:12864寫入一字節,可以是命令或數據 *
- *------------------------------------------------------------------*
- *【備 注】:RW RS控制數據OR命令 *
- *******************************************************************/
- void lcd_1byte_w(uchar RW, uchar RS, uchar W_data)
- {
- uchar H_data,L_data,S_ID = 0xf8; //11111RWRS0 ,控制格式命令
- if(RW == 0)
- {
- S_ID &=~ 0x04;
- }
- else //if(RW==1)
- {
- S_ID |= 0X04;
- }
- if(RS == 0)
- {
- S_ID &=~ 0x02;
- }
- else //if(RS==1)
- {
- S_ID |= 0X02;
- }
- H_data = W_data;
- H_data &= 0xf0; //屏蔽低4位的數據
- L_data = W_data; //xxxx0000格式
- L_data &= 0x0f; //屏蔽高4位的數據
- L_data <<= 4; //xxxx0000格式
- CS = 1;
- lcd_8bits_w(S_ID); //發送S_ID
- lcd_8bits_w(H_data); //發送H_data
- lcd_8bits_w(L_data); //發送L_data
- CS = 0;
- }
- /*******************************************************************
- *【函 數 名】:lcd_str_w *
- *【修改日期】:2008年7月2日 *
- *【函數作用】:12864寫入字符串 *
- *------------------------------------------------------------------*
- *【備 注】: *
- *******************************************************************/
- void lcd_str_w(uchar *string)
- {
- uchar i=0;
- while(string[i]!='\0')
- lcd_dat_w(string[i++]);
- }
- /*******************************************************************
- *【函 數 名】:lcd_cmd_w *
- *【修改日期】:2008年7月2日 *
- *【函數作用】:12864寫入一條命令 *
- *------------------------------------------------------------------*
- *【備 注】: *
- *******************************************************************/
- void lcd_cmd_w(uchar cmd)
- {
- lcd_busy_check(); //先檢測LCD忙否,忙則等待
- lcd_1byte_w(0,0,cmd);
- }
- /*******************************************************************
- *【函 數 名】:lcd_dat_w *
- *【修改日期】:2008年7月6日 *
- *【函數作用】:12864寫入一個字節數據 *
- *------------------------------------------------------------------*
- *【備 注】: *
- *******************************************************************/
- void lcd_dat_w(uchar dat)
- {
- lcd_busy_check(); //先檢測LCD忙否,忙則等待
- lcd_1byte_w(0,1,dat);
- }
- /*******************************************************************
- *【函 數 名】:lcd_initial *
- *【修改日期】:2008年7月6日 *
- *【函數作用】:12864初始化 *
- *------------------------------------------------------------------*
- *【備 注】: *
- *******************************************************************/
- void lcd_initial(void)
- {
- CS = 0;
- SCLK = 0;
- SID = 0;
-
-
- lcd_cmd_w(0x30); //功能設置 8位數據,基本指令
- delay(2);
- lcd_cmd_w(0x0c); //顯示狀態 ON,游標OFF,反白OFF
- delay(2);
- lcd_cmd_w(0x01); //清除顯示
- delay(2);
- lcd_cmd_w(0x02); //地址歸位
- delay(2); //延時
- }
- /*******************************************************************
- *【函 數 名】:lcd_setpostion *
- *【修改日期】:2008年7月2日 *
- *【函數作用】:12864寫入8位數據 *
- *------------------------------------------------------------------*
- *【備 注】:從高位開始傳送 *
- *******************************************************************/
- void lcd_setposition(uchar row, uchar col)
- {
- uchar p;
- switch(row%5)
- {
- case 1: p = 0x80; break; //第一行開始地址
- case 2: p = 0x90; break; //第二行
- case 3: p = 0x88; break; //第三行
- case 4: p = 0x98; break; //第四行
- }
- p += col;
- lcd_cmd_w(p);
- }
- /*******************************************************************
- *【函 數 名】:delay *
- *【修改日期】:2008年7月2日 *
- *【函數作用】:延時x MS *
- *------------------------------------------------------------------*
- *【備 注】: *
- *******************************************************************/
- void delay(uint ms)
- {
- uint i;
- while(ms--)
- {
- for(i=1;i<1142;i++);
- }
- }
- /*******************************************************************
- *【函 數 名】:lcd_row_on *
- *【修改日期】:2008年7月8日 *
- *【函數作用】:選擇一行反白顯示 *
- *------------------------------------------------------------------*
- *【備 注】: *
- *******************************************************************/
- void lcd_row_on(uchar temp)
- {
- uchar i, j, x, y;
- y = temp - 1;
- if(y >= 2)
- {
- x = 8;
- y = (y-2)*16;
- }
- else
- {
- x = 0;
- y = y*16;
- }
- lcd_cmd_w(0x34);
- lcd_cmd_w(0x36);
- for(i=0; i<16; i++)
- {
-
- lcd_cmd_w(0x80+y);
- lcd_cmd_w(0x80+x);
- y++;
- for(j=0; j<16; j++)
- {
- lcd_dat_w(0xff);
- }
- }
- lcd_cmd_w(0x30);
- delay(2);
- }
- /*******************************************************************
- *【函 數 名】:lcd_row_off *
- *【修改日期】:2008年7月8日 *
- *【函數作用】:取消一行反白顯示 *
- *------------------------------------------------------------------*
- *【備 注】: *
- *******************************************************************/
- void lcd_row_off(uchar temp)
- {
- uchar i, j, x, y;
- y = temp - 1;
- if(y >=2)
- {
- x = 8;
- y = (y-2)*16;
- }
- else
- {
- x = 0;
- y = y*16;
- }
- lcd_cmd_w(0x34);
- lcd_cmd_w(0x36);
-
- for(i=0; i<16; i++)
- {
- lcd_cmd_w(0x80+y);
- lcd_cmd_w(0x80+x);
- y++;
- for(j=0; j<16; j++)
- {
- lcd_dat_w(0x00);
- }
- }
- lcd_cmd_w(0x30);
- delay(2);
- }
- /*******************************************************************
- *【函 數 名】:lcd_clear_pic *
- *【修改日期】:2008年7月8日 *
- *【函數作用】:清除繪圖部分,即取消全部反白 *
- *------------------------------------------------------------------*
- *【備 注】: *
- *******************************************************************/
- void lcd_clear_pic(void)
- {
- uchar i, j;
- lcd_cmd_w(0x34);
- lcd_cmd_w(0x36);
- for(i=0; i<32; i++)
- {
- lcd_cmd_w(0x80+i);
- lcd_cmd_w(0x80);
- for(j=0; j<32; j++)
- {
- lcd_dat_w(0x00);
- }
- }
- lcd_cmd_w(0x30);
- delay(2);
- }
- /*******************************************************************
- *【函 數 名】:lcd_black_pic *
- *【修改日期】:2008年7月8日 *
- *【函數作用】:全屏黑色 *
- *------------------------------------------------------------------*
- *【備 注】: *
- *******************************************************************/
- void lcd_black_pic(void)
- {
- uchar i, j;
- lcd_cmd_w(0x34);
- lcd_cmd_w(0x36);
- for(i=0; i<32; i++)
- {
- lcd_cmd_w(0x80+i);
- lcd_cmd_w(0x80);
- for(j=0; j<32; j++)
- {
- lcd_dat_w(0xff);
- }
- }
- lcd_cmd_w(0x30);
- delay(2);
- }
- /*******************************************************************
- *【函 數 名】:lcd_block_on *
- *【修改日期】:2008年7月10日 *
- *【函數作用】:反白2個漢字大小的面積 *
- *------------------------------------------------------------------*
- *【備 注】: *
- *******************************************************************/
- void lcd_block_on(uchar temp)
- {
- uchar i, j, x, y;
- y = temp - 1;
- if(y >= 2)
- {
- x = 8;
- y = (y-2)*16;
- }
- else
- {
- x = 0;
- y = y*16;
- }
-
- lcd_cmd_w(0x34);
- lcd_cmd_w(0x36);
- for(i=0; i<16; i++)
- {
-
- lcd_cmd_w(0x80+y);
- lcd_cmd_w(0x80+x);
- y++;
- for(j=0; j<12; j++)
- lcd_dat_w(0x00);
- for(j=0; j<4;j++)
- lcd_dat_w(0xff);
- }
- lcd_cmd_w(0x30);
- delay(2);
- }
- /*******************************************************************
- *【函 數 名】:logo *
- *【修改日期】:2008年7月2日 *
- *【函數作用】:系統開機畫面 *
- *------------------------------------------------------------------*
- *【備 注】: *
- *******************************************************************/
- /*void logo()
- {
-
- CS = 0;
- SCLK = 0;
- SID = 0;
- lcd_initial();
- lcd_cmd_w(0x01);
- lcd_setposition(2,0);
- lcd_str_w("便攜式葉綠素含量");
- lcd_setposition(3,1);
- lcd_str_w("光電檢測儀V2");
- delay(100);
-
- lcd_cmd_w(0x01);
- lcd_setposition(1,1);
- lcd_str_w("國家創新計劃");
- lcd_setposition(2,2);
- lcd_str_w("GCS07001");
- lcd_setposition(3,1);
- lcd_str_w("北京林業大學");
- lcd_setposition(4,0);
- lcd_str_w("理學院基礎樓305 ");
- delay(100);
- }
- /*******************************************************************
- *【函 數 名】:logo2 *
- *【修改日期】:2008年7月8日 *
- *【函數作用】:系統開機畫面 *
- *------------------------------------------------------------------*
- *【備 注】: *
- *******************************************************************/
- void logo2()
- {
- lcd_initial();
- lcd_black_pic(); //完整刷屏
- delay(10);
-
- lcd_setposition(2,0);
- lcd_str_w("便攜式葉綠素含量");
- lcd_row_off(2);
- lcd_setposition(3,1);
- lcd_str_w("光電檢測儀V2");
- lcd_row_off(3);
- delay(100);
- lcd_cmd_w(0x01);
- lcd_row_on(2);
- lcd_row_on(3);
- lcd_setposition(1,1);
- lcd_str_w("國家創新計劃");
- lcd_setposition(2,2);
- lcd_str_w("GCS07001");
- lcd_setposition(3,1);
- lcd_str_w("北京林業大學");
- lcd_setposition(4,0);
- lcd_str_w("理學院基礎樓305 ");
- delay(100);
- lcd_clear_pic();
- }
- #endif
復制代碼
|