ST7920較為常見,由于自帶字庫使用較為方便。下面的這個程序是根據開發板上的例程做適當修改而來,總的來說較為簡單,對著ST7920的DATASheet看一下時序和指令集就能明白。驅動程序如下:
#include typedef unsigned char uchar; typedef unsigned int uint; extern const unsigned char shuzi_table[]; #define LCD_DataIn P4DIR=0x00 //數據口方向設置為輸入 #define LCD_DataOut P4DIR=0xff //數據口方向設置為輸出 #define LCD2MCU_Data P4IN #define MCU2LCD_Data P4OUT #define LCD_CMDOut P3DIR|=0x07 //P3口的低三位設置為輸出 #define LCD_RS_H P3OUT|=BIT0 //P3.0 #define LCD_RS_L P3OUT&=~BIT0 //P3.0 #define LCD_RW_H P3OUT|=BIT1 //P3.1 #define LCD_RW_L P3OUT&=~BIT1 //P3.1 #define LCD_EN_H P3OUT|=BIT2 //P3.2 #define LCD_EN_L P3OUT&=~BIT2 //P3.2 /******************************************* 函數名稱:Delay_1ms 功 能:延時約1ms的時間 參 數:無 返回值 :無 ********************************************/ void Delay_1ms(void) { uchar i; for(i = 150;i > 0;i--) _NOP(); } /******************************************* 函數名稱:Delay_Nms 功 能:延時N個1ms的時間 參 數:n--延時長度 返回值 :無 ********************************************/ void Delay_Nms(uint n) { uint i; for(i = n;i > 0;i--) Delay_1ms(); } /******************************************* 函數名稱:Write_Cmd 功 能:向液晶中寫控制命令 參 數:cmd--控制命令 返回值 :無 ********************************************/ void Write_Cmd(uchar cmd) { uchar lcdtemp = 0; LCD_RS_L; LCD_RW_H; LCD_DataIn; do //判忙 { LCD_EN_H; _NOP(); lcdtemp = LCD2MCU_Data; LCD_EN_L; } while(lcdtemp & 0x80); LCD_DataOut; LCD_RW_L; MCU2LCD_Data = cmd; LCD_EN_H; _NOP(); LCD_EN_L; } /******************************************* 函數名稱:Write_Data 功 能:向液晶中寫顯示數據 參 數:dat--顯示數據 返回值 :無 ********************************************/ void Write_Data(uchar dat) { uchar lcdtemp = 0; LCD_RS_L; LCD_RW_H; LCD_DataIn; do //判忙 { LCD_EN_H; _NOP(); lcdtemp = LCD2MCU_Data; LCD_EN_L; } while(lcdtemp & 0x80); LCD_DataOut; LCD_RS_H; LCD_RW_L; MCU2LCD_Data = dat; LCD_EN_H; _NOP(); LCD_EN_L; } /******************************************* 函數名稱:Ini_Lcd 功 能:初始化液晶模塊 參 數:無 返回值 :無 ********************************************/ void Ini_Lcd(void) { LCD_CMDOut; //液晶控制端口設置為輸出 Delay_Nms(500); Write_Cmd(0x30); //基本指令集 Delay_1ms(); Write_Cmd(0x02); // 地址歸位 Delay_1ms(); Write_Cmd(0x0c); //整體顯示打開,游標關閉 Delay_1ms(); Write_Cmd(0x01); //清除顯示 Delay_1ms(); Write_Cmd(0x06); //游標右移 Delay_1ms(); Write_Cmd(0x80); //設定顯示的起始地址 } /******************************************* 函數名稱:Clear_LCD 功 能:清屏 參 數:無 返回值 :無 ********************************************/ void Clear_LCD(void) { Write_Cmd(0x01); } /******************************************* 函數名稱:Set_XY 功 能:設置顯示的位置 參 數:x--行 y--列 返回值 :無 ********************************************/ void Set_XY( uchar x, uchar y ) { uchar address; switch (x) { case 0 : address=0x80+y; break; case 1 : address=0x90+y; break; case 2 : address=0x88+y; break; case 3 : address=0x98+y; break; default: address=0x80+y; break; } Write_Cmd(address); } /******************************************* 函數名稱:Disp_HZ 功 能:控制液晶顯示漢字 參 數:addr--顯示位置的首地址 pt--指向顯示數據的指針 num--顯示字符個數 返回值 :無 ********************************************/ void Disp_HZ(uchar addr,const uchar * pt,uchar num) { uchar i; Write_Cmd(addr); for(i = 0;i < (num*2);i++) Write_Data(*(pt++)); } /******************************************* 函數名稱:Disp_XY 功 能:控制液晶顯示漢字 參 數:addr--顯示位置的首地址 pt--指向顯示數據的指針 num--顯示字符個數 返回值 :無 ********************************************/ void Disp_XY(uchar x,uchar y,const uchar *pt) { Set_XY(x,y); while (*pt) { Write_Data(*pt); pt++; } } /******************************************* 函數名稱:Clear_GDRAM 功 能:清除液晶GDRAM中的隨機數據 參 數:無 返回值 :無 ********************************************/ void Clear_GDRAM(void) { uchar i,j,k; Write_Cmd(0x34); //打開擴展指令集 i = 0x80; for(j = 0;j < 32;j++) { Write_Cmd(i++); Write_Cmd(0x80); for(k = 0;k < 16;k++) { Write_Data(0x00); } } i = 0x80; for(j = 0;j < 32;j++) { Write_Cmd(i++); Write_Cmd(0x88); for(k = 0;k < 16;k++) { Write_Data(0x00); } } Write_Cmd(0x30); //回到基本指令集 } /******************************************* 函數名稱:Draw_PM 功 能:在整個液晶屏幕上畫圖 參 數:無 返回值 :無 ********************************************/ void Draw_PM(const uchar *ptr) { uchar i,j,k; Write_Cmd(0x34); //打開擴展指令集 i = 0x80; for(j = 0;j < 32;j++) { Write_Cmd(i++); Write_Cmd(0x80); for(k = 0;k < 16;k++) { Write_Data(*ptr++); } } i = 0x80; for(j = 0;j < 32;j++) { Write_Cmd(i++); Write_Cmd(0x88); for(k = 0;k < 16;k++) { Write_Data(*ptr++); } } Write_Cmd(0x36); //打開繪圖顯示 Write_Cmd(0x30); //回到基本指令集 } /******************************************* 函數名稱:Draw_TX 功 能:顯示一個16*16大小的圖形 參 數:Yaddr--Y地址 Xaddr--X地址 dp--指向圖形數據存放地址的指針 繪圖的坐標X以字節為單位,Y以位為單位 初始坐標 0x80,0x80 繪圖時需要將YX的坐標連續寫入RAM,寫入期間繪圖必須關閉 返回值 :無 ********************************************/ void Draw_TX(uchar Yaddr,uchar Xaddr,const uchar * dp) { uchar j; uchar k=0; Write_Cmd(0x01); //清屏,只能清除DDRAM Write_Cmd(0x34); //使用擴展指令集,關閉繪圖顯示 for(j=0;j<16;j++) { Write_Cmd(Yaddr++); //Y地址 Write_Cmd(Xaddr); //X地址 Write_Data(dp[k++]); Write_Data(dp[k++]); } Write_Cmd(0x36); //打開繪圖顯示 Write_Cmd(0x30); //回到基本指令集模式 } 程序中只包含了基本的顯示和畫圖功能,使用起來較為簡單,其他的劃線反白等功能也可以通過畫圖來實現,以后再繼續研究,對應的主程序例程如下: #include #include "LCD12864P.h" #include "hohai.h" unsigned char title[]="河海大學"; unsigned char flag; int main( void ) { /*下面六行程序關閉所有的IO口*/ P1DIR = 0XFF;P1OUT = 0XFF; P2DIR = 0XFF;P2OUT = 0XFF; P3DIR = 0XFF;P3OUT = 0XFF; P4DIR = 0XFF;P4OUT = 0XFF; P5DIR = 0XFF;P5OUT = 0XFF; P6DIR = 0XFF;P6OUT = 0XFF; WDTCTL = WDTPW + WDTHOLD; //關閉看門狗 P6DIR |= BIT2;P6OUT |= BIT2; //關閉電平轉換 TACTL = TASSEL_1 + MC_1; //計數時鐘ACLK, 增計數模式 CCR0 = 32768 - 1; CCTL0 |= CCIE; //使能CCR0比較中斷 _EINT(); Ini_Lcd(); //顯示文字 Draw_PM(hohai); Draw_TX(0x81,0x81,speaker); flag = 0; while(flag < 5); //等待5秒鐘
上一篇:MSP430學習筆記10-ADC采集1602顯示
下一篇:MSP430學習筆記2-跑馬燈程序,熟悉定時器寄存器的配置
推薦閱讀
史海拾趣
隨著市場需求的不斷變化和消費者需求的多樣化,常州星海電子不斷調整和優化產品結構。公司現已形成了包括普通整流、開關、快速恢復、高效率、超快速、肖特基、雙向觸發管、整流橋、高反壓以及瞬間突波電壓吸收、穩壓等多種系列、多種封裝形式的二極管產品。這些產品廣泛應用于電腦、家電、郵電通訊等行業,為公司贏得了廣闊的市場空間。
在市場競爭日益激烈的背景下,貝特萊注重品牌建設和市場推廣。通過不斷提升產品質量和創新能力,優化售后服務體系,貝特萊在市場上樹立了良好的品牌形象。同時,公司還積極拓展海外市場,參與國際競爭,進一步提升了其在全球電子行業的影響力。
這些故事只是貝特萊在電子行業發展歷程中的一部分。作為一個國家級高新技術企業,貝特萊在技術研發、產品創新、市場拓展等方面都取得了顯著的成績。未來,隨著電子行業的不斷發展,貝特萊將繼續保持其創新精神和市場競爭力,為行業的進步做出更大的貢獻。
隨著技術研發的不斷深入和產品線的逐漸完善,貝特萊于2016年1月21日正式掛牌上市,進軍資本市場。這一舉措不僅為公司帶來了更多的資金支持,也進一步提升了貝特萊的品牌知名度和市場競爭力。上市后,貝特萊得以加速其研發步伐,不斷推出創新產品,滿足市場的多樣化需求。
隨著QCL技術的成熟和市場需求的增長,AdTech公司開始積極拓展國際市場。通過與全球多家知名企業建立合作伙伴關系,公司成功將產品打入歐洲、亞洲等多個地區。同時,AdTech還積極參與國際技術交流與合作,不斷提升自身的研發能力和產品質量。這些舉措不僅增強了公司的品牌影響力,也為其帶來了更多的商業機會。
Elite公司成立于20世紀90年代末,由一群熱衷于電子技術的年輕人創立。在初創階段,Elite面臨著資金短缺、市場競爭激烈的挑戰。然而,公司憑借其獨特的創新理念和過硬的技術實力,成功研發出一款具有高性價比的智能手機,迅速在市場上獲得認可。這款產品不僅幫助Elite實現了初步盈利,更為公司后續發展奠定了堅實基礎。
隨著公司規模的不斷擴大和市場的不斷拓展,Elite開始實施全球化戰略。公司積極開拓國際市場,與全球知名企業建立合作關系,共同推動行業發展。同時,Elite還注重品牌塑造和企業文化建設,通過舉辦各類公益活動、提升員工福利待遇等方式,增強企業凝聚力和社會影響力。
2007年度61Job中國電子行業薪酬調查報告 通過對不同地區和行業,不同學歷和工作職責,相似性質、規模的企業的薪酬水平、薪酬結構、薪酬價值取向等調查發現: 1、中國電子工程師平均年薪為人民幣49106元,公司戰略管理層的平均薪酬收入最高, ...… 查看全部問答∨ |
本人最近在Windows下用Tiger320芯片來寫一個PCI卡的通信驅動程序,使用到了Tiger320的DMA傳輸,現遇到一些問題,望各位大俠賜教: 問題描述:在對硬件及DMA初始化完成后,啟動DMA,此時未進行任何讀寫操作,可是讀寫中斷信號就一直的發個不停,不 ...… 查看全部問答∨ |
最近用wm9712做了一個錄音,搞了一個測試程序,在 if (waveInOpen(&m_hWaveIn,WAVE_MAPPER,&m_WaveFormatEx,(DWORD)WaveInProc,NULL,CALLBACK_FUNCTION) != MMSYSERR_NOERROR ) { &nbs ...… 查看全部問答∨ |
代碼用的是Uboot的dm9000x驅動,按照需要做了適當修改。初始化函數如下: /* Initilize dm9000 board */ int eth_init( const char *ps_mac ) { int i, oft, lnk; unsigned char u8_byte = 0; & ...… 查看全部問答∨ |
拿到了團購的板子了??!高興下!~~嘻嘻。剛才在跑官方的這段例程:// MSP430G2xx1 Demo - Reset on Invalid Address fetch, Toggle P1.0//// Description: Toggle P1.0 by xor\'ing P1.0 inside of a software loop that// ends ...… 查看全部問答∨ |
小弟在做一個項目,按鍵長按5s以后,我給LEDOnOff一個SWITCHOFF的值,SWITCHOFF是定義的枚舉類型,然后執行下面的程序進入休眠模式,可是再通過按鍵無法喚醒系統,請問下是為什么呢?(最下面是port的中斷程序) void Task_LEDonoff(void){&nb ...… 查看全部問答∨ |
內核的移植相對復雜,不可能一步到位,心急吃不了熱豆腐,我們只有步步為營,方能步步為贏。本節的目的是修改內核,使得Linux-3.8.3內核適應于OK6410開發平臺。外設的移植,在接下來的章節會一步一步完成。1.1.1 mkimage工具制作Linux ...… 查看全部問答∨ |