QC12864液晶屏串行時序驅(qū)動程序解
串行時序不能讀操作的情況下可繪制任意函數(shù)曲線
//程序格式粗糙,無暇整理,若參考有疑問請留言
完整的源代碼下載:http://www.51hei.com/f/12864c5.rar
//12864串行時序的實現(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 //擴充指令集動作#define fanbai 0x04 //反白第一行(擴充指令集)#define set_GDRAM 0x80 //設(shè)定GDRAM地址(擴充指令集)#define ON_G 0x36 //開繪圖顯示(擴充指令集)#define set_function2 0x34 //關(guān)繪圖顯示(擴充指令集)//端口定義sbit LCD_CS=P1^3;sbit LCD_SID=P1^1; //串行數(shù)據(jù)線sbit LCD_SCLK=P1^2; //串上時鐘輸入uchar code a[]={"QC12864"}; //定義要顯示的字符串/**************************************///延時函數(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!='