久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5776|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

在新唐(nuvoton)Cortex M0上實現(xiàn)12864液晶屏顯示

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:65608 發(fā)表于 2014-9-13 14:04 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
在經(jīng)歷過3天的不斷探索后,本人終于實現(xiàn)了在nuvoton Cortex M0上搭載一個12864的LCD液晶屏。用于顯示四行最簡單的中文字符串。下面我就把自己的實踐過程記錄下來,希望能夠在此基礎(chǔ)上不斷提高,最終要能記錄M0的控制信息,以實現(xiàn)人機交互的功能。一、硬件配置
配置12864液晶的電路非常簡單,市場上的通用12864液晶屏具有20個引腳,其每個引腳的功能說明如下表。


這里有幾個要注意的地方:
3腳、16腳、18腳不用管它,懸空;
RS做數(shù)據(jù)/指令選擇位,RS=1表示輸入數(shù)據(jù),RS=0表示數(shù)據(jù)指令;
R/W 讀寫控制位,高電平為讀數(shù)據(jù),低電平為寫數(shù)據(jù);
E 使能端,高電平有效
PSB 串/并模式選擇 高電平為并行模式,低電平為串行模式
RST 復(fù)位位 低電平有效
DB[0..7] 數(shù)據(jù)位
下面是液晶接口電路原理圖:




P2.0口做RS
P2.1口做R/W
P2.2口做E
P0口的0-7位做數(shù)據(jù)或指令輸入口
P2.3口做PSB
P2.4口不用
P2.5口做復(fù)位位RST
另:圖上的JPBG是接背光選擇的,電阻是用來控制背光大小。

二、程序設(shè)計
要注意的是ARM系列微控制器GPIO口在使用時的問題,特別要注意每次輸出0和輸出1,使用的都是不同的寄存器。而且,GPIO口的功能每次也都需要設(shè)定它是做輸入,輸出還是做準雙向口或者開漏模式。這一點很重要,與單片機不同,所以如果這里編程時序不注意會導(dǎo)致失敗。
編程過程中,我使用了符合CMSIS標準的ARM Cortex微控制器標準API函數(shù)庫來調(diào)用GPIO口操作函數(shù),主要用到的有:
(1)DrvGPIO_Open
Prototype
      void DrvGPIO_Open ( E_DRVGPIO_PORT  port, E_DRVGPIO_PIN  pin, E_DRVGPIO_IO  IOMode )                Description
      Set the specified GPIO pin to the specified GPIO operation mode.
Parameter
      port [in]   E_DRVGPIO_PORT, specify GPIO port.   
It could be E_PORT0, E_PORT1, E_PORT2, E_PORT3 and E_PORT4.
      pin [in]
Specify pin of the GPIO port. It could be E_PIN0, E_PIN2 ... ~ E_PIN7.
      IOMode [in]
          E_DRVGPIO_IO, set the specified GPIO pin to be E_IO_INPUT, E_IO_OUTPUT, E_IO_OPENDRAIN or E_IO_QUASI mode.
Include
  Driver/DrvGPIO.h
Return Value
    None
Example:
   
  DrvGPIO_Open (E_PORT0, E_PIN0, E_IO_OUTPUT);
  DrvGPIO_Open (E_PORT0, E_PIN1, E_IO_INPUT);

(2)DrvGPIO_SetBit
Prototype
      int32_t DrvGPIO_SetBit (E_DRVGPIO_PORT port, E_DRVGPIO_PIN pin)
Description
     Set the specified GPIO pin to 1.
Parameter
      port [in]   
  E_DRVGPIO_PORT, specify GPIO port.   
       It could be E_PORT0, E_PORT1, E_PORT2, E_PORT3 and E_PORT4.
      pin [in]
        Specify pin of the GPIO port. It could be E_PIN0, E_PIN2 ... ~ E_PIN7.
Include
  Driver/DrvGPIO.h
Return Value
  E_SUCCESS:   Operation successful
Example:   
   
  DrvGPIO_Open (E_PORT0, E_PIN0, E_IO_OUTPUT);
   
  DrvGPIO_SetBit (E_PORT0, E_PIN0);

(3)DrvGPIO_ClrBit
Prototype
      int32_t DrvGPIO_ClrBit (E_DRVGPIO_PORT port, E_DRVGPIO_PIN pin)
Description
  Set the specified GPIO pin to 0.
Parameter     
      port [in]   
  E_DRVGPIO_PORT, specify GPIO port.   
       It could be E_PORT0, E_PORT1, E_PORT2, E_PORT3 and E_PORT4.
      pin [in]
        Specify pin of the GPIO port. It could be E_PIN0, E_PIN2 ... ~ E_PIN7.
Include
  Driver/DrvGPIO.h
Return Value
  E_SUCCESS:            Operation successful
Example:   
   
  DrvGPIO_Open (E_PORT0, E_PIN0, E_IO_OUTPUT);
   
  DrvGPIO_ClrBit (E_PORT0, E_PIN0);

(4)DrvGPIO_SetPortBits
Prototype
      int32_tDrvGPIO_SetPortBits (E_DRVGPIO_PORT port, int32_t i32PortValue)
Description
      Set the output port value to the specified GPIO port.
Parameter
      port [in]   
    E_DRVGPIO_PORT, specify GPIO port.   
       It could be E_PORT0, E_PORT1, E_PORT2, E_PORT3 and E_PORT4.
  i32PortValue [in]
  The data output value. It could be 0~0xFF.
Include
  Driver/DrvGPIO.h
Return Value
  E_SUCCESS:            Operation successful
Example:
     
    DrvGPIO_SetPortBits (E_PORT0, 0x12);

看到了上面介紹的這些庫函數(shù),就可以開始看12864的指令集了,下面把指令集附在后面

三、程序代碼
lcd.c

//延時子程序模塊
//**********************************************
void longdelay(uint32_t delay) //長延時程序延時 n*100ms
{ uint32_t i;
  for(;delay>0;delay--)
    {for(i=0;i<100;i++) //100ms延時.
        DrvSYS_Delay (1000); //調(diào)用庫函數(shù),延時n us
    }
}

void shortdelay(uint32_t dly) //短延時程序 nms
{
for(;dly>0;dly--)
DrvSYS_Delay(1000);
}

//**********************************
//液晶初始化
//**********************************
void init_lcd(void)
{ uint8_t comm;
shortdelay(3);
comm=0x01; //清除顯示
wr_i_lcd(comm);
shortdelay(3);
comm=0x30; //普通指令集格式
wr_i_lcd(comm);
shortdelay(3);
comm=0x06; //光標右移
wr_i_lcd(comm);
shortdelay(3);
comm=0x02; //地址歸位
wr_i_lcd(comm);
shortdelay(3);
comm=0x06; //整體不移動
wr_i_lcd(comm);
shortdelay(3);
comm=0x0c; //整體顯示,不反白
wr_i_lcd(comm);
shortdelay(3);
comm=0x01; //復(fù)位
wr_i_lcd(comm);
shortdelay(3);
comm=0x80; //設(shè)定DDRAM起始為0x80
wr_i_lcd(comm);
shortdelay(3);
}
//***********************************
//填充液晶DDRAM全為空格
//**********************************
void clrram_lcd(void)
{ uint16_t data;
data=0x30;
wr_i_lcd(data);
shortdelay(3);
data=0x01;
wr_i_lcd(data);
longdelay(2);
}
//***********************************
//對液晶寫數(shù)據(jù)
//content為要寫入的數(shù)據(jù)
//***********************************
void wr_d_lcd(uint8_t content)
{
busy_lcd();
DrvGPIO_Open(E_PORT2, E_PIN0, E_IO_OUTPUT);
DrvGPIO_Open(E_PORT2, E_PIN1, E_IO_OUTPUT);
DrvGPIO_Open(E_PORT2, E_PIN2, E_IO_OUTPUT);
DrvGPIO_SetBit(E_PORT2, E_PIN0); //rs=1,data mode
    DrvGPIO_ClrBit(E_PORT2, E_PIN1); //rw=0,write mode

DrvGPIO_Open(E_PORT0, E_PIN0, E_IO_OUTPUT);
DrvGPIO_Open(E_PORT0, E_PIN1, E_IO_OUTPUT);
DrvGPIO_Open(E_PORT0, E_PIN2, E_IO_OUTPUT);
DrvGPIO_Open(E_PORT0, E_PIN3, E_IO_OUTPUT);
DrvGPIO_Open(E_PORT0, E_PIN4, E_IO_OUTPUT);
DrvGPIO_Open(E_PORT0, E_PIN5, E_IO_OUTPUT);
DrvGPIO_Open(E_PORT0, E_PIN6, E_IO_OUTPUT);
DrvGPIO_Open(E_PORT0, E_PIN7, E_IO_OUTPUT);

DrvGPIO_SetPortBits(E_PORT0,content); //write data

DrvGPIO_SetBit(E_PORT2, E_PIN2); //enable
shortdelay(2);
DrvGPIO_ClrBit(E_PORT2, E_PIN2); //disable
}
//********************************
//對液晶寫指令
//content為要寫入的指令代碼
//*****************************
void wr_i_lcd(uint8_t content)
{
busy_lcd();
DrvGPIO_Open(E_PORT2, E_PIN0, E_IO_OUTPUT);
DrvGPIO_Open(E_PORT2, E_PIN1, E_IO_OUTPUT);
DrvGPIO_Open(E_PORT2, E_PIN2, E_IO_OUTPUT);
DrvGPIO_ClrBit(E_PORT2, E_PIN0); //rs=0,command mode
    DrvGPIO_ClrBit(E_PORT2, E_PIN1); //rw=0,write mode

DrvGPIO_Open(E_PORT0, E_PIN0, E_IO_OUTPUT);
DrvGPIO_Open(E_PORT0, E_PIN1, E_IO_OUTPUT);
DrvGPIO_Open(E_PORT0, E_PIN2, E_IO_OUTPUT);
DrvGPIO_Open(E_PORT0, E_PIN3, E_IO_OUTPUT);
DrvGPIO_Open(E_PORT0, E_PIN4, E_IO_OUTPUT);
DrvGPIO_Open(E_PORT0, E_PIN5, E_IO_OUTPUT);
DrvGPIO_Open(E_PORT0, E_PIN6, E_IO_OUTPUT);
DrvGPIO_Open(E_PORT0, E_PIN7, E_IO_OUTPUT);

DrvGPIO_SetPortBits(E_PORT0,content); //write command

DrvGPIO_SetBit(E_PORT2, E_PIN2); //enable
shortdelay(2);
DrvGPIO_ClrBit(E_PORT2, E_PIN2); //disable
}
//********************************
//液晶檢測忙狀態(tài)
//在寫入之前必須執(zhí)行
//********************************
void busy_lcd(void)
{
DrvGPIO_Open(E_PORT0, E_PIN0, E_IO_OUTPUT); //下面幾行都為打開P0端口,設(shè)定為輸出模式
DrvGPIO_Open(E_PORT0, E_PIN1, E_IO_OUTPUT);
DrvGPIO_Open(E_PORT0, E_PIN2, E_IO_OUTPUT);
DrvGPIO_Open(E_PORT0, E_PIN3, E_IO_OUTPUT);
DrvGPIO_Open(E_PORT0, E_PIN4, E_IO_OUTPUT);
DrvGPIO_Open(E_PORT0, E_PIN5, E_IO_OUTPUT);
DrvGPIO_Open(E_PORT0, E_PIN6, E_IO_OUTPUT);
DrvGPIO_Open(E_PORT0, E_PIN7, E_IO_OUTPUT);
DrvGPIO_Open(E_PORT2, E_PIN0, E_IO_OUTPUT);
DrvGPIO_Open(E_PORT2, E_PIN1, E_IO_OUTPUT);
DrvGPIO_Open(E_PORT2, E_PIN2, E_IO_OUTPUT);
  DrvGPIO_SetPortBits(E_PORT0,0xff);
  DrvGPIO_ClrBit(E_PORT2, E_PIN0); //rs=0
  DrvGPIO_SetBit(E_PORT2, E_PIN1); //rw=1,read
  DrvGPIO_SetBit(E_PORT2, E_PIN2); //enable
DrvGPIO_Open(E_PORT0, E_PIN7, E_IO_INPUT); //set p0.7 as a input pin ==busy
  while((DrvGPIO_GetBit (E_PORT0, E_PIN7))!=0); //while is busy
  DrvGPIO_ClrBit(E_PORT2, E_PIN2); //disable
}
//********************************
//指定要顯示字符的坐標
//*******************************
void gotoxy(uint8_t y,uint8_t x)
{
if(y==1)
wr_i_lcd(0x80|x); //第一行
if(y==2)
        wr_i_lcd(0x90|x); //第二行
if(y==3)
wr_i_lcd((0x80|x)+8); //第三行
if(y==4)
        wr_i_lcd((0x90|x)+8); //第四行
}
//**********************************
//液晶顯示字符串程序
//**********************************
void print(uint8_t *str)
{
while(*str!='\0')
{
wr_d_lcd(*str);
str++;
}
}

//***************************************
//液晶顯示主程序模塊
//***************************************
void show()   
{
  
  gotoxy(1,0);
  print("南京航空航天大學(xué)");
  shortdelay(200);            
  gotoxy(2,0);
  print("計算機科學(xué)與技術(shù)");
  shortdelay(200);                 //掃描延時
  gotoxy(3,0);
  print("WWW.NUAA.EDU.CN");
  shortdelay(200);                 //掃描延時
  gotoxy(4,0);
  print("12864 液晶測試");
  shortdelay(200);                 //掃描延時
}


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:654855 發(fā)表于 2020-7-30 20:47 | 只看該作者
貼主不提供源碼下載嗎
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 国产精品18hdxxxⅹ在线 | 亚洲精品视频一区 | 中文字幕国产一区 | 91网站在线看 | 九九热在线免费视频 | 久久69精品久久久久久久电影好 | 国产日产精品一区二区三区四区 | 91精品国产综合久久香蕉麻豆 | 国产日韩一区二区三区 | 欧美激情 一区 | 五月婷婷在线视频 | 亚洲精品免费在线观看 | 久久成人午夜 | 久久亚洲一区二区三区四区 | 免费日本视频 | 网站国产 | 草草视频在线播放 | 国产成人福利 | 精品乱码一区二区三四区 | 国产精品视频一区二区三区 | 亚洲欧美在线一区 | 欧美一级淫片免费视频黄 | 一级做a毛片 | 国产美女自拍视频 | 一区二区三区四区av | 99国内精品久久久久久久 | 欧美精品欧美精品系列 | 一区二区成人 | 国产97视频在线观看 | 美女福利视频网站 | 拍真实国产伦偷精品 | 亚洲欧美激情网 | 91在线精品秘密一区二区 | 久久久久久久久久久久亚洲 | 久久精品小视频 | 亚洲视频免费在线 | 欧美日韩国产中文字幕 | 天天综合天天 | 成人欧美一区二区 | 美女黄网站 | 中文一区|