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-跑馬燈程序,熟悉定時器寄存器的配置
推薦閱讀
史海拾趣
AAEON公司是一家總部位于臺灣的全球性電子公司,專注于提供嵌入式計算解決方案和人工智能應用平臺。以下是關于該公司發展的五個相關故事:
公司成立和初期發展: AAEON公司成立于1992年,最初主要從事電腦主板的設計和生產。公司在成立初期致力于提供高質量、高性能的計算解決方案,迅速在臺灣本地市場建立了良好的聲譽。
技術創新和產品多樣化: 隨著技術的發展和市場需求的變化,AAEON開始進行技術創新,并逐步擴展產品線。公司不僅持續改進和推出新型的嵌入式計算產品,還積極涉足人工智能領域,開發智能邊緣計算平臺和解決方案。
國際市場拓展: 為了進一步擴大業務規模,AAEON積極拓展國際市場。公司與全球各地的合作伙伴建立了廣泛的合作關系,產品銷售網絡覆蓋了亞洲、歐洲、北美和其他地區。公司還在一些國家設立了分支機構和辦事處,加強了對當地市場的開拓和服務。
合作伙伴關系和生態系統建設: AAEON與眾多的合作伙伴建立了緊密的合作關系,共同推動產品的創新和市場拓展。公司與主流的芯片廠商、系統集成商、軟件開發商等建立了長期穩定的合作關系,共同打造了完善的生態系統。
未來展望和發展方向: AAEON將繼續致力于技術創新和產品升級,加強在嵌入式計算和人工智能領域的領先地位。公司將不斷推出符合市場需求的新產品和解決方案,為客戶提供更優質的服務和支持。同時,AAEON將繼續加強與合作伙伴之間的合作,共同推動行業的發展和進步。
Austria Micro Systems AG(AMS)是一家總部位于奧地利的半導體制造商,專注于模擬IC、傳感器和感應器解決方案。以下是 AMS 公司發展的五個相關故事:
創立與初期發展:AMS 公司成立于1981年,最初是一家小型的半導體公司,成立之初主要從事晶圓制造和生產模擬集成電路(IC)。在公司創始人的領導下,AMS 迅速崛起,憑借著其創新能力和對技術的獨特洞察力,迅速在半導體市場上占據了一席之地。
技術創新與產品擴展:隨著時間的推移,AMS 公司不斷進行技術創新,并不斷擴展其產品線。公司致力于開發高性能、低功耗的模擬IC和傳感器解決方案,以滿足汽車、工業、醫療等各個領域的客戶需求。AMS 的產品涵蓋了光學傳感器、環境傳感器、聲學傳感器等多個領域。
全球化發展與市場拓展:AMS 公司通過不斷拓展全球市場,加強與客戶和合作伙伴的合作關系,實現了快速的業務增長。公司在歐洲、亞洲和美洲設立了多個銷售辦事處和生產基地,建立了完善的全球供應鏈和銷售網絡。公司的產品銷售網絡覆蓋了全球范圍,得到了國內外客戶的廣泛認可。
收購與合并:為了進一步壯大自身實力和拓展市場份額,AMS 公司通過收購和合并等方式不斷強化自身。公司先后收購了一些技術領先的公司,擴大了產品線和市場份額。此舉進一步提升了公司在模擬IC和傳感器領域的競爭優勢,加速了公司的業務增長。
持續創新與未來展望:AMS 公司將繼續致力于技術創新和產品研發,不斷提升產品性能和品質水平。公司將關注新興技術和市場趨勢,積極布局未來的發展方向,包括人工智能、物聯網、汽車電子等領域。同時,公司還將加強與客戶和合作伙伴的合作,共同推動行業的發展和進步。
在電子行業中,品質是企業生存和發展的關鍵。Caliber公司深知這一點,從原材料采購到生產制造的每一個環節,都嚴格把控品質。公司建立了完善的質量管理體系,通過不斷的技術改進和工藝優化,確保每一款產品的品質都達到行業最高標準。正是這種對品質的執著追求,讓Caliber的產品在市場上獲得了良好的口碑,也為公司的長期發展奠定了堅實的基礎。
隨著電子元器件市場的不斷擴大,富捷電子積極實施產能擴張計劃。自2020年起,公司相繼啟動了多個擴產項目,包括一期100億產能生產基地項目建設和二期車規電阻產能擴充項目。這些項目的順利實施,極大地提升了公司的生產能力和市場響應速度,有效滿足了智能終端、5G、工業互聯網等重要行業對電子元器件的旺盛需求。同時,富捷電子還通過優化生產流程、提升設備自動化水平等措施,進一步提高了生產效率和產品質量。
近年來,Azoteq在傳感技術方面取得了重大突破。其最新產品系列——ProxFusion?,是世界上第一個單芯片集成多傳感器功能的解決方案。這一創新產品將多種傳感功能集成在一個芯片上,為客戶提供了更加便捷、高效的解決方案。ProxFusion?的推出,再次展現了Azoteq在傳感技術領域的領先地位。
隨著產品質量的提升和技術的不斷創新,寶乘公司開始積極拓展市場。公司與多家知名企業建立了戰略合作關系,共同推動半導體功率器件在LED照明、電源、消費類電子等多個領域的應用。同時,寶乘還積極參加國內外電子行業的展覽和交流活動,與同行交流學習,不斷提升自身的競爭力。
問題: 我的PCB中有很多封裝0805的貼片電阻,電容,是應該 貼在BOTTOMLAYER的,后來發現那個下層貼片的標號在上層還是能看到,我就把標號全都改成了Bottomoverlayer的,結果發現在底層也看不到標號了,想恢復都不知道點什么了,我暈了,干了一天的活不 ...… 查看全部問答∨ |
|
看了leang521的一個話,有些感觸, 你認為的最好設計對于某些人可能是最差設計。并行IO并不能達到IO最優化,而且還會產生諸如多復合鍵問題。而對于一些成本敏感設計,多個IO可能導致全部設計失敗。所以最合適的才是最好的。 你有沒有認為的最好 ...… 查看全部問答∨ |
請教大家一個問題,請大家幫幫忙。 我在使用的是WINCE5.0,硬件上只有一個I2C接口,掛接了4個設備(I2C支持很多個從設備)。 其中包括一個電源管理芯片,一個IO擴展,一個A/D轉換,還有一個EEPROM。 ...… 查看全部問答∨ |
求助,如題,望各位大俠不吝賜教。我用CE的PND用USB連到PC上,想通過CE自帶的INBOX讀取郵件,可以肯定PC和PND是連接的,我設置好INBOX后確無法和PC的郵箱連接上。不知有沒有哪位大俠用過WINCE自帶的INBOX,還望指點。… 查看全部問答∨ |
|
手頭有塊atmega128的開發板,具備一些常見的開發板功能,如LED,數碼管,峰鳴器,AD之類的,這塊板子本身自帶的下載程序接口是串口(RS232)的,所用的燒寫軟件是avr studio,燒寫方式是STK-500。 現在準備自制一個US ...… 查看全部問答∨ |
XILINX的朋友三點打來電話說,十天前,半導體產業再次傳出并購案,動力管理半導體生產商MicroSemi以大約4.3億美元的價格收購Actel。這件案子在發生之前,產業界似乎是一點動靜也沒有,至少在中國大陸,是完全沒有風聲傳出的,可見得雙方在這件事的 ...… 查看全部問答∨ |
關于STM32中IAR環境下如何包含C++頭文件及中斷函數問題 目前Cortex M3的兩種MCU主要有STM32和LM3S系列.它們都可以在IAR環境下用C++編寫程序,但略有差異.由于Cortex M3的中斷函數和其他MCU/ARM/DSP不同,它實際是一個普通函數.它們在IAR環境下的中斷向量表用C的數組表示很有特點,不像以往都 ...… 查看全部問答∨ |