QC12864液晶屏串行時(shí)序驅(qū)動(dòng)程序解
串行時(shí)序不能讀操作的情況下可繪制任意函數(shù)曲線
//程序格式粗糙,無(wú)暇整理,若參考有疑問(wèn)請(qǐng)留言
完整的源代碼下載:http://www.51hei.com/f/12864c5.rar
//12864串行時(shí)序的實(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 //畫(huà)面整體左移#define all_right_move 0x07 //畫(huà)面整體右移#define display_left_move 0x10 //顯示游標(biāo)左移#define display_right_move 0x14 //顯示游標(biāo)右移#define set_function1 0x30 //基本指令集動(dòng)作#define set_CGRAM 0x40 //設(shè)定CGRAM地址#define set_DDRAM 0x80 //設(shè)定DDRAM地址#define set_function2 0x34 //擴(kuò)充指令集動(dòng)作#define fanbai 0x04 //反白第一行(擴(kuò)充指令集)#define set_GDRAM 0x80 //設(shè)定GDRAM地址(擴(kuò)充指令集)#define ON_G 0x36 //開(kāi)繪圖顯示(擴(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; //串上時(shí)鐘輸入uchar code a[]={"QC12864"}; //定義要顯示的字符串/**************************************///延時(shí)函數(shù)/**************************************/void Delay_nms(uchar n){uchar i;uchar j;for(i=0;in;i++)for(j=0;j125;j++) //大概1ms_nop_();}/**************************************///串行發(fā)送一個(gè)字節(jié)/**************************************/void LCD_sendbyte(uchar byte){uchar i;for(i=0;i8;i++){LCD_SCLK=0; //拉低時(shí)鐘線_nop_();LCD_SID=(bit)(byte0x80); //發(fā)送最高位數(shù)據(jù)LCD_SCLK=1; //上升沿發(fā)送數(shù)據(jù)byte=byte1; //左移一位}}/****************************************///寫(xiě)指令/****************************************/void LCD_write_com(uchar com){LCD_CS=1; LCD_sendbyte(0xf8); //送入5個(gè)連續(xù)的“1“,啟動(dòng)一個(gè)周期,11111,RW(0),RS(0),0LCD_sendbyte(0xf0com); //取高四位,數(shù)據(jù)分兩次傳送,//每個(gè)字節(jié)的內(nèi)容被送入兩個(gè)字節(jié)//高四位放在第一個(gè)字節(jié)的高四位LCD_sendbyte(0xf0(com4)); //低四位放在第二個(gè)字節(jié)的高四位 LCD_CS=0; Delay_nms(10); //串行不支持讀操作,不可檢測(cè)忙操作,這里用延時(shí)替代 }/******************************************///寫(xiě)數(shù)據(jù)/******************************************/void LCD_write_dat(uchar dat){LCD_CS=1; LCD_sendbyte(0xfa); //送入5個(gè)連續(xù)的“1“,啟動(dòng)一個(gè)周期,11111,RW(0),RS(1),0LCD_sendbyte(0xf0dat); //取高四位,數(shù)據(jù)分兩次傳送,//每個(gè)字節(jié)的內(nèi)容被送入兩個(gè)字節(jié)//高四位放在第一個(gè)字節(jié)的高四位LCD_sendbyte(0xf0(dat4)); //低四位放在第二個(gè)字節(jié)LCD_CS=0; Delay_nms(10);}/********************************************///LCD初始化/********************************************/void LCD_init(void){ LCD_write_com(0x30); //選擇基本指令集 LCD_write_com(0x0c); //開(kāi)顯示,無(wú)游標(biāo),不反白LCD_write_com(0x01); //清除顯示屏幕,把DDRAM位址計(jì)數(shù)器調(diào)整為00HDelay_nms(5); //清屏操作時(shí)間較長(zhǎng)1.6ms 因此加此延時(shí)LCD_write_com(0x02); //清DDRAM位址歸位,此處貌似與清屏重復(fù)LCD_write_com(0x06); //設(shè)定光標(biāo)右移,整體顯示不移動(dòng)}/*************************************************///顯示字符串/*************************************************/void print(uchar *s){ while(*s!='