新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > QC12864液晶屏串行時序驅(qū)動程序解

QC12864液晶屏串行時序驅(qū)動程序解

作者: 時間:2012-08-15 來源:網(wǎng)絡(luò) 收藏

不能讀操作的情況下可繪制任意函數(shù)曲線
點(diǎn)擊瀏覽下一頁

//程序格式粗糙,無暇整理,若參考有疑問請留言
完整的源代碼下載:http://www.51hei.com/f/12864c5.rar

//12864的實(shí)現(xiàn)///**************************************/#includereg51.h>#includeintrins.h>#includemath.h>      /**************************************/#define  uchar    unsigned char#define  uint     unsigned int #define  clear   0x01  //清屏#define  reset_DDRAM  0x02 //DDRAM地址歸位#define  left_move  0x04 //游標(biāo)左移#define  right_move  0x06 //游標(biāo)右移#define  all_left_move 0x05 //畫面整體左移#define  all_right_move 0x07  //畫面整體右移#define  display_left_move  0x10  //顯示游標(biāo)左移#define  display_right_move  0x14  //顯示游標(biāo)右移#define  set_function1   0x30  //基本指令集動作#define  set_CGRAM    0x40  //設(shè)定CGRAM地址#define  set_DDRAM    0x80  //設(shè)定DDRAM地址#define  set_function2   0x34  //擴(kuò)充指令集動作#define  fanbai            0x04   //反白第一行(擴(kuò)充指令集)#define  set_GDRAM    0x80  //設(shè)定GDRAM地址(擴(kuò)充指令集)#define  ON_G     0x36  //開繪圖顯示(擴(kuò)充指令集)#define  set_function2   0x34  //關(guān)繪圖顯示(擴(kuò)充指令集)//端口定義sbit  LCD_CS=P1^3;sbit  LCD_SID=P1^1;          //串行數(shù)據(jù)線sbit  LCD_SCLK=P1^2;         //串上時鐘輸入uchar code a[]={""};      //定義要顯示的字符串/**************************************///延時函數(shù)/**************************************/void Delay_nms(uchar n){uchar i;uchar j;for(i=0;in;i++)for(j=0;j125;j++)        //大概1ms_nop_();}/**************************************///串行發(fā)送一個字節(jié)/**************************************/void LCD_sendbyte(uchar byte){uchar i;for(i=0;i8;i++){LCD_SCLK=0;               //拉低時鐘線_nop_();LCD_SID=(bit)(byte0x80);    //發(fā)送最高位數(shù)據(jù)LCD_SCLK=1;               //上升沿發(fā)送數(shù)據(jù)byte=byte1;                  //左移一位}}/****************************************///寫指令/****************************************/void LCD_write_com(uchar com){LCD_CS=1;        LCD_sendbyte(0xf8);       //送入5個連續(xù)的“1“,啟動一個周期,11111,RW(0),RS(0),0LCD_sendbyte(0xf0com);       //取高四位,數(shù)據(jù)分兩次傳送,//每個字節(jié)的內(nèi)容被送入兩個字節(jié)//高四位放在第一個字節(jié)的高四位LCD_sendbyte(0xf0(com4));        //低四位放在第二個字節(jié)的高四位 LCD_CS=0;       Delay_nms(10);             //串行不支持讀操作,不可檢測忙操作,這里用延時替代   }/******************************************///寫數(shù)據(jù)/******************************************/void LCD_write_dat(uchar dat){LCD_CS=1;        LCD_sendbyte(0xfa);        //送入5個連續(xù)的“1“,啟動一個周期,11111,RW(0),RS(1),0LCD_sendbyte(0xf0dat);       //取高四位,數(shù)據(jù)分兩次傳送,//每個字節(jié)的內(nèi)容被送入兩個字節(jié)//高四位放在第一個字節(jié)的高四位LCD_sendbyte(0xf0(dat4));        //低四位放在第二個字節(jié)LCD_CS=0;        Delay_nms(10);}/********************************************///LCD初始化/********************************************/void LCD_init(void){        LCD_write_com(0x30);             //選擇基本指令集   LCD_write_com(0x0c);       //開顯示,無游標(biāo),不反白LCD_write_com(0x01);       //清除顯示屏幕,把DDRAM位址計數(shù)器調(diào)整為00HDelay_nms(5);         //清屏操作時間較長1.6ms 因此加此延時LCD_write_com(0x02);       //清DDRAM位址歸位,此處貌似與清屏重復(fù)LCD_write_com(0x06);       //設(shè)定光標(biāo)右移,整體顯示不移動}/*************************************************///顯示字符串/*************************************************/void print(uchar *s){ while(*s!='