日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

LCD1602驅動顯示實驗STM32

 共同成長888 2015-07-19

LCD1602驅動顯示實驗STM32 

 聲明:本文是在網友追夢的程序基本上修改而來。程序移植性強,可讀性強,特此感謝追夢同學。

/**************************************************************************
**文件名稱:LCD1602.h  for  STM32
**************************************************************************/
#ifndef  LCD1602_STM32_H
#define  LCD1602_STM32_H

#define LCD_RS_1 GPIOE->BSRR=GPIO_Pin_0 //PE.0--(LCD)RS
#define LCD_RS_0 GPIOE->BRR =GPIO_Pin_0
#define LCD_RW_1 GPIOE->BSRR=GPIO_Pin_1 //PE.1--(LCD)RW
#define LCD_RW_0 GPIOE->BRR =GPIO_Pin_1
#define LCD_EN_1 GPIOE->BSRR=GPIO_Pin_2 //PE.2--(LCD)E
#define LCD_EN_0 GPIOE->BRR =GPIO_Pin_2
#define DATAOUT  GPIOD->ODR             //PD[0..7]--(LCD)D0~D7

#ifndef uchar
#define uchar unsigned char
#endif
#ifndef uint 
#define uint unsigned int
#endif

extern void delay_nms(unsigned long n);
extern void delay_nus(unsigned long n);

uint8_t LCD_busy(void); //讀LCD忙碌狀態(tài),直到LCD1602不忙為止
void Wait_Leisure(void);//一直等待到LCD1602空閑
void LCD_WriteInitcmd(uchar cmd);//寫入LCD初始化時的命令,不可以檢測忙狀態(tài)
void LCD_Writecmd(uchar cmd);//寫指令到LCD1602,指令數(shù)據占一個字節(jié)
void LCD_Writedata(uchar dat);//寫一字節(jié)數(shù)據到LCD1602
void LCD_pos(uchar pos);//設定顯示位置 00h~27h,40h~47h
void LCD_Setpos(uchar row,uchar col);//根據習慣設定顯示位置
void LCD_DispChar(char ch);//顯示一個字符
void LCD_Setpos_DispChar(uchar row,uchar col,char ch);//在指定位置顯示一個字符
void LCD_DispString(char str[]);//使LCD1602顯示一個字符串,顯示位置需提前設定
void LCD_Setpos_DispString(uchar row,uchar col,char str[]);//使LCD1602從指定位置開始顯示一個字符串
void LCD_Dispnum(uint32_t num);//顯示一個不超過8位的整數(shù),顯示位置需提前設置
void LCD_Setpos_Dispnum(uchar row,uchar col,uint32_t num);//在指定位置顯示一個不超過8位的整數(shù)
void LCD_DispDecimal(uint32_t num,uchar dot);//顯示一個有效位不超過8位的浮點數(shù),顯示位置需要提前設定
//在指定位置顯示一個有效位不超過8位的浮點數(shù)
void LCD_Setpos_DispDecimal(uchar row,uchar col,uint32_t num,uchar dot);
//顯示日歷,顯示日期與時間
void LCD_DispDateTime(uint32_t year,uchar month,uchar day,uchar hour,uchar min,uchar sec);
//顯示秒表,顯示時,分,秒,10毫秒,精確到10ms
void LCD_DispStopWatch(uchar hour,uchar min,uchar sec,uchar tenms);
//顯示頻率計,動態(tài)自動調整頻率顯示
void LCD_DispFreq(uint32_t freq);
void LCD_ShiftLeft(void);//屏幕整體左移一格,用于滾動顯示
void LCD_ShiftRight(void);//屏幕整體右移一格,用于滾動顯示
void LCD_Clear(void);//清屏,清除顯示
void LCD_Return(void);//使光標還回原點位置
void LCD_Close(void);//關顯示
void LCD_Open(void);//開顯示
void LCD_FlickerChar(uchar row,uchar col);//使指定位置字符閃爍,不顯示光標
void LCD_CloseFlicker(void);//關閉字符閃爍
void LCD_FlickerScreen(void);//屏幕秒閃爍一次
/*********************************************************************
*名    稱:LCD_Init()
*功    能:初始化LCD1602
*入口參數(shù):無
*出口參數(shù):無
*常用命令:0x38:16*2顯示,5*&點陣顯示字符,8位數(shù)據;指令執(zhí)行時間40us
*          0x0C:開顯示,關光標   40us
*          0x08:關顯示,關光標   40us
*          0x0D:字符閃爍,關光標,接著設定位置,閃爍周期0.4ms左右
*          0x0F:字符閃爍,開光標
*          0x06:寫完數(shù)據自動右移光標,普通情形,從左向右顯示  40us
*          0x04:寫完數(shù)據自動左移光標,可以從右向左顯示  40us
*          0x01:清除顯示內容,即清屏  1.64ms
*          0x02:使光標還回起始位置   1.64ms
*          0x18:屏幕上所有字符同時左移一格,適合滾動顯示 40us
*          0x1C:屏幕上所有字符同時右移一格,適合滾動顯示 40us
*********************************************************************/
void LCD_Init(void);

#endif

 

/*********************************************************************
* 文件名稱:LCD1602.C
* 功能:為51單片機提供LCD1602驅動程序,解決LCD1602與上層軟件的隔離問題
*********************************************************************/
#include "stm32f10x.h"
#include "LCD1602.h"
#ifndef  LCD1602_STM32_C
#define  LCD1602_STM32_C

/*********************************************************************
*名    稱:LCD_busy()
*功    能:讀LCD忙碌狀態(tài),直到LCD1602不忙為止
*入口參數(shù):無
*出口參數(shù):無符號字節(jié)類型,返回0表示LCD已經操作完畢,空閑。
*說    明:一般在寫入新命令或數(shù)據之前用while(LCD_busy())語句等待LCD就緒
*********************************************************************/
uint8_t LCD_busy(void)
{                         
LCD_RS_0;
delay_nus(1);
LCD_RW_1;
delay_nus(1);
do
{
  LCD_EN_0;
  delay_nus(200);
  LCD_EN_1;
  delay_nus(200);
}
while(GPIOD->IDR & 0x80);
LCD_EN_0;
return (uint8_t)0; 
}
/*********************************************************************
*功    能:一直等待到LCD1602空閑
*********************************************************************/
void Wait_Leisure(void)
{
LCD_busy();
}
/*********************************************************************
*功    能:寫入LCD初始化時的命令,不可以檢測忙狀態(tài)
*********************************************************************/
void LCD_WriteInitcmd(uchar cmd)
{                          
LCD_RS_0;
delay_nus(1);
LCD_RW_0;
delay_nus(1);
DATAOUT = cmd;
LCD_EN_0;
delay_nus(300);
LCD_EN_1;
delay_nus(300);
LCD_EN_0;
delay_nms(2);
}
/*********************************************************************
*名    稱:LCD_Writecmd()
*功    能:寫指令到LCD1602,指令數(shù)據占一個字節(jié)
*入口參數(shù):cmd:待寫入的指令
*出口參數(shù):無
*********************************************************************/
void LCD_Writecmd(uchar cmd)
{                          
while(LCD_busy());
LCD_RS_0;    //對同一個寄存器的兩次寫入,中間延時一會
delay_nus(1);
LCD_RW_0;
delay_nus(1);
LCD_EN_0;
delay_nus(300);//產生脈沖
DATAOUT = cmd;
LCD_EN_1;
delay_nus(300);//必要的延時
LCD_EN_0;    //下降沿,LCD1602開始工作
}
/*********************************************************************
*名    稱:LCD_Writedata()
*功    能:寫一字節(jié)數(shù)據到LCD1602
*入口參數(shù):dat:無符號字節(jié)類型,0~255  包括各個ASCII碼字符
*出口參數(shù):無
*********************************************************************/
void LCD_Writedata(uchar dat) 
{                         
while(LCD_busy());//等待LCD1602空閑
LCD_RS_1;
delay_nus(1);
LCD_RW_0;
delay_nus(1);
DATAOUT = dat;
LCD_EN_1;  //先拉高
delay_nus(300); //很重要的延時,經調試,延時300us以上才可以
LCD_EN_0;       //下降沿,開始寫入有效數(shù)據
}
/*********************************************************************
*名    稱:LCD_pos()
*功    能:設定顯示位置
*入口參數(shù):pos:顯示位置,值的范圍如下:
*    0x00----------------0x0f 0x10-------0x27 第一行(一次顯示16個字符)
*    0x40----------------0x4f 0x50-------0x67 第二行
*出口參數(shù):無
*********************************************************************/
void LCD_pos(uchar pos)
{                         
LCD_Writecmd(pos | 0x80);
}
/*********************************************************************
*名    稱:LCD_Setpos()
*功    能:根據習慣設定顯示位置
*入口參數(shù):row:行,row=1表示第一行,row=2表示第二行
*          col:列,0~15,用于指定顯示的列,范圍可以是0~40
*出口參數(shù):無
*********************************************************************/
void LCD_Setpos(uchar row,uchar col)
{
if(row==1) LCD_Writecmd(col | 0x80);
else LCD_Writecmd(col | 0xC0);
}
/*********************************************************************
*功  能:顯示一個字符   
*入  口:ch:待顯示的字符
*********************************************************************/
void LCD_DispChar(char ch)
{
LCD_Writedata(ch);
}
/*********************************************************************
*功  能:在指定位置顯示一個字符   
*入  口:row:行 1或2        col:列,0~15
*        ch:待顯示的字符
*********************************************************************/
void LCD_Setpos_DispChar(uchar row,uchar col,char ch)
{
LCD_Setpos(row,col);
LCD_Writedata(ch);
}
/*********************************************************************
*名    稱:LCD_DispString()
*功    能:使LCD1602顯示一個字符串,顯示位置需提前設定
*入口參數(shù):str[]:待顯示的字符串
*出口參數(shù):無
*********************************************************************/
void LCD_DispString(char str[])
{
    uchar i=0;
while(str[i] != '\0')
{
    LCD_Writedata(str[i]);
    ++i;
}
}
/*********************************************************************
*名    稱:LCD_Setpos_DispString()
*功    能:使LCD1602從指定位置開始顯示一個字符串
*入口參數(shù):row:顯示行,1或2
*          col:顯示列,0~15 (0~40) 
*          str[]:待顯示的字符串
*出口參數(shù):無
*說    明:指定位置是顯示的初始位置,第一個字符顯示的位置
*********************************************************************/
void LCD_Setpos_DispString(uchar row,uchar col,char str[])
{
LCD_Setpos(row,col);
LCD_DispString(str);
}
/*********************************************************************
*名    稱:LCD_Dispnum()
*功    能:顯示一個不超過8位的整數(shù),顯示位置需提前設置
*入口參數(shù):num:待顯示的整數(shù),不超過8位
*出口參數(shù):無
*********************************************************************/
void LCD_Dispnum(uint32_t num)
{
   uint i=0,j,k=0,wei,q;
   char str[9];
   if(num>=10000000)wei=8;
   else if(num>=1000000)wei=7;
   else if(num>=100000)wei=6;
   else if(num>=10000)wei=5;
   else if(num>=1000) wei=4;
   else if(num>=100)wei=3;
   else if(num>=10) wei=2;
   else wei=1;
   for(i=wei;i>0;i--)
   {   q=1;
       j=1; //i=1時,q=1,得到個位
    for(;j    str[k++]=num/q +'0';
    num %= q;
   }
   str[k] = '\0'; //添加字符串結束標志
   LCD_DispString(str);//顯示字符串
}
/*********************************************************************
*名    稱:LCD_Setpos_Dispnum()
*功    能:在指定位置顯示一個不超過8位的整數(shù)
*入口參數(shù):num:待顯示的整數(shù),不超過8位
*出口參數(shù):無
*********************************************************************/
void LCD_Setpos_Dispnum(uchar row,uchar col,uint32_t num)
{
   LCD_Setpos(row,col); 
   LCD_Dispnum(num);
}
/*********************************************************************
*名    稱:LCD_DispDecimal()
*功    能:顯示一個有效位不超過8位的浮點數(shù),顯示位置需要提前設定
*入口參數(shù):num:待顯示的浮點數(shù)放大后得到的整數(shù),不超過8位
*          dot:小數(shù)點的位數(shù)
*出口參數(shù):無
*********************************************************************/
void LCD_DispDecimal(uint32_t num,uchar dot)
{
   uint i=0,j,k=0,wei,q;
   char str[10];
   if(num>=10000000)wei=8;
   else if(num>=1000000)wei=7;
   else if(num>=100000)wei=6;
   else if(num>=10000)wei=5;
   else if(num>=1000) wei=4;
   else if(num>=100)wei=3;
   else if(num>=10) wei=2;
   else wei=1;
   for(i=wei;i>0;i--)
   {   q=1;
       j=1; //i=1時,q=1,得到個位
    for(;j    str[k++]=num/q +'0';
    num %= q;
   }
   str[k] = '\0'; //添加字符串結束標志
   for(i=8;i>0;i--)
   {   if((str[i]>='0')&&(str[i]<='9')) break;
   }
   str[i+2]='\0';   //添加字符串結束符
   for(j=0;j   {
     str[i+1]=str[i];
   }
   str[i+1]='.';       //插入小數(shù)點
   LCD_DispString(str);//顯示浮點小數(shù)
}
/*********************************************************************
*名    稱:LCD_Setpos_DispDecimal()
*功    能:在指定位置顯示一個有效位不超過8位的浮點數(shù)
*入口參數(shù):row:待顯示的行 1,2
*          col:待顯示的列 0~15
*          num:待顯示的浮點數(shù)放大10的整數(shù)倍后得到的整數(shù),不超過8位
*          dot:小數(shù)點的位數(shù)
*出口參數(shù):無
*********************************************************************/
void LCD_Setpos_DispDecimal(uchar row,uchar col,uint32_t num,uchar dot)
{
  LCD_Setpos(row,col);
  LCD_DispDecimal(num,dot);
}
/*********************************************************************
*名    稱:LCD_DispDateTime()
*功    能:顯示日歷,顯示日期與時間
*入口參數(shù):year:年,可以是任意值
*          month:月,1~12
*          day:日,1~31
*          hour:時,1~24 或  1~12
*          min:分,0~59
*          sec:秒,0~59
*出口參數(shù):無
*說    明:使用前必須先宏定義USE_LCD_DISP_DATE,在包含文件之前定義有效
*顯示格式:Date:yyyy-mm-dd  *
*          Time:hh:mm:ss    *
*********************************************************************/
void LCD_DispDateTime(uint32_t year,uchar month,uchar day,uchar hour,uchar min,uchar sec)
{
LCD_Setpos(1,0);
LCD_DispString("Date:");
LCD_Dispnum((uint32_t)year);
LCD_DispChar('-');
LCD_Dispnum((uint32_t)month);
LCD_DispChar('-');
LCD_Dispnum((uint32_t)day);
LCD_Setpos(1,15);
LCD_DispChar('*'); //第一行結束符顯示
LCD_Setpos(2,0);
LCD_DispString("Time:");
LCD_Dispnum((uint32_t)hour);
LCD_DispChar(':');
LCD_Dispnum((uint32_t)min);
LCD_DispChar(':');
LCD_Dispnum((uint32_t)sec);
LCD_Setpos(2,15);
LCD_DispChar('*'); //第二行結束符顯示
}
/*********************************************************************
*名    稱:LCD_DispStopWatch()
*功    能:顯示秒表,顯示時,分,秒,10毫秒,精確到10ms
*入口參數(shù):hour:時,1~24 或  1~12
*          min:分,0~59
*          sec:秒,0~59
*          tenms:10ms計數(shù)值,如3表示30ms
*出口參數(shù):無
*顯示格式:Current Time:   *
*            hh:mm:ss:tt   *
*********************************************************************/
void LCD_DispStopWatch(uchar hour,uchar min,uchar sec,uchar tenms)
{
LCD_Setpos(1,0);
LCD_DispString("Current Time:");
LCD_Setpos(1,15);
LCD_DispChar('*'); //第一行結束符顯示
LCD_Setpos(2,2);
LCD_Dispnum((uint32_t)hour);
LCD_DispChar(':');
LCD_Dispnum((uint32_t)min);
LCD_DispChar(':');
LCD_Dispnum((uint32_t)sec);
LCD_DispChar(':');
LCD_Dispnum((uint32_t)tenms);
LCD_Setpos(2,15);
LCD_DispChar('*'); //第二行結束符顯示
}
/*********************************************************************
*名    稱:LCD_DispFreq()
*功    能:顯示頻率計,動態(tài)自動調整頻率顯示
*入口參數(shù):freq:可以顯示8位整數(shù)表示的頻率值,頻率范圍1Hz~99MHz
*出口參數(shù):無
*說    明:入口的頻率值單位是Hz,顯示函數(shù)自動選擇合適的顯示方式
*          freq>=1000000顯示成6位小數(shù)的MHz
*    else  freq>=1000   顯示成3位小數(shù)的KHz
*    else  freq>=0      默認顯示單位是Hz  (三個區(qū)間互斥)
*********************************************************************/
void LCD_DispFreq(uint32_t freq)
{
LCD_Setpos(1,0);
LCD_DispString("Current Freq:");
LCD_Setpos(2,1); //顯示位置
if(freq>=1000000)
{
  LCD_DispDecimal(freq,6);
  LCD_DispString("MHz");
}
else if(freq>=1000) 

  LCD_DispDecimal(freq,3);
  LCD_DispString("KHz");
}
else { LCD_Dispnum(freq);
     LCD_DispString("Hz");
}
LCD_Setpos(2,14);
LCD_DispString("OK");
}
//屏幕整體左移一格,用于滾動顯示
void LCD_ShiftLeft()
{
LCD_Writecmd(0x18);
}
//屏幕整體右移一格,用于滾動顯示
void LCD_ShiftRight(void)
{
LCD_Writecmd(0x1C);
}
//清屏,清除顯示
void LCD_Clear(void)
{
LCD_Writecmd(0x01);
}
//使光標還回原點位置
void LCD_Return(void)
{
LCD_Writecmd(0x02);
}
//關顯示
void LCD_Close(void)
{
LCD_Writecmd(0x08);
}
//開顯示
void LCD_Open(void)
{
LCD_Writecmd(0x0C);
}
/*********************************************************************
*名    稱:LCD_FlickerChar()
*功    能:使指定位置字符閃爍,不顯示光標
*入口參數(shù):row:行 1,2  
*          col:列 0~15
*出口參數(shù):無
*說    明:寫命令0x0D不顯示光標的閃爍,寫命令0x0F是顯示光標的閃爍
*          一旦設定閃爍后,會根據位置變化閃爍,關閃爍寫命令0x0C
*********************************************************************/
void LCD_FlickerChar(uchar row,uchar col)
{
LCD_Writecmd(0x0D);
LCD_Setpos(row,col);
}
//關閉字符閃爍
void LCD_CloseFlicker(void)
{
LCD_Writecmd(0x0C);
}
//屏幕秒閃爍一次
void LCD_FlickerScreen(void)
{
LCD_Writecmd(0x08);//關顯示
delay_nms(500);
LCD_Writecmd(0x0C);//開顯示
delay_nms(500);
}
/*********************************************************************
*名    稱:LCD_Init()
*功    能:初始化LCD1602
*入口參數(shù):無
*出口參數(shù):無
*常用命令:0x38:16*2顯示,5*&點陣顯示字符,8位數(shù)據;指令執(zhí)行時間40us
*          0x0C:開顯示,關光標   40us
*          0x08:關顯示,關光標   40us
*          0x0D:字符閃爍,關光標,接著設定位置,閃爍周期0.4ms左右
*          0x0F:字符閃爍,開光標
*          0x06:寫完數(shù)據自動右移光標,普通情形,從左向右顯示  40us
*          0x04:寫完數(shù)據自動左移光標,可以從右向左顯示  40us
*          0x01:清除顯示內容,即清屏  1.64ms
*          0x02:使光標還回起始位置   1.64ms
*          0x18:屏幕上所有字符同時左移一格,適合滾動顯示 40us
*          0x1C:屏幕上所有字符同時右移一格,適合滾動顯示 40us
*********************************************************************/
void LCD_Init(void)
{   
    delay_nms(200);           //延時20ms         
LCD_WriteInitcmd(0x38);  //16*2顯示,5*7點陣,8位數(shù)據
delay_nms(10);
LCD_WriteInitcmd(0x38);  //16*2顯示,5*7點陣,8位數(shù)據
delay_nms(5);
LCD_WriteInitcmd(0x38);  //16*2顯示,5*7點陣,8位數(shù)據
delay_nms(5);
LCD_WriteInitcmd(0x08);  //先關顯示,后開顯示
delay_nms(5);
LCD_WriteInitcmd(0x06);  //自動右移光標,0x04為左移光標
delay_nms(5);
LCD_WriteInitcmd(0x01);  //清除LCD的顯示內容
delay_nms(6);
LCD_WriteInitcmd(0x0c);  //顯示開,關光標;0x08為關顯示
delay_nms(5);
}

#endif  //防止多次編譯

/*************************************************************
*                      LCD1602驅動顯示實驗
*************************************************************/
#include "stm32f10x.h"

#include "LCD1602.h"


#define PE00 (uint32_t *)0x40230180


//時鐘配置函數(shù) 8MHz*9=72MHz
void RCC_Configuration()
{
    RCC_DeInit();
RCC_HSEConfig(RCC_HSE_ON);//使能HSE
if(RCC_WaitForHSEStartUp()==SUCCESS)
{
    RCC_HCLKConfig(RCC_SYSCLK_Div1); //HCLK=SYSCLK
    RCC_PCLK2Config(RCC_HCLK_Div1);
    RCC_PCLK1Config(RCC_HCLK_Div2);
    RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);
    RCC_PLLCmd(ENABLE);
    while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET);
    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
    while(RCC_GetSYSCLKSource()!=0x08);
}
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC|\
                    RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
}

//延時n us
void delay_nus(unsigned long n)
{
unsigned long j;
while(n--)
{ j=8;
   while(j--);
}
}

//延時n ms
void delay_nms(unsigned long n)
{
while(n--)
    delay_nus(1100);
}
//GPIO配置函數(shù)
void GPIO_Configuration(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; 
  GPIO_Init(GPIOD, &GPIO_InitStructure);     //PD口OD輸出
  GPIO_InitStructure.GPIO_Pin = (GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2);
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; //PE.0~2 OD輸出 
  GPIO_Init(GPIOE, &GPIO_InitStructure);
}
///////////////////////////////////////////
int main()
{
    //uint32_t i=0;
char str[]={"happy!"};
    RCC_Configuration();
GPIO_Configuration();
LCD_Init();
LCD_Setpos_DispString(1,3,str);
LCD_DispFreq(123456);
LCD_FlickerChar(2,3);
LCD_FlickerScreen();
LCD_FlickerScreen();
LCD_FlickerScreen();
delay_nms(2000);
LCD_CloseFlicker();
while(1)
{
};
}

 

LCD1602學習體會

 

液晶顯示屏中,1602型算是比較簡單的一種,據說和12864還是全兼容的。這兩天學習的結果如下。

一、1602里的存儲器有三種:CGROM、CGRAM、DDRAM。CGROM保存了廠家生產時固化在LCM中的點陣型顯示數(shù)據,CGRAM是留給用戶自己定義點陣型顯示數(shù)據的,DDRAM則是和顯示屏的內容對應的。1602內部的DDRAM有80字節(jié),而顯示屏上只有2行×16列,共32個字符,所以兩者不完全一一對應。默認情況下,顯示屏上第一行的內容對應DDRAM中80H到8FH的內容,第二行的內容對應DDRAM中CH到CFH的內容。DDRAM中90H到A7H、D0H到E7H的內容是不顯示在顯示屏上的,但是在滾動屏幕的情況下,這些內容就可能被滾動顯示出來了。注:這里列舉的DDRAM的地址準確來說應該是DDRAM地址+80H之后的值,因為在向數(shù)據總線寫數(shù)據的時候,命令字的最高位總是為1。

二、1602使用三條控制線:EN、RW、RS。其中EN起到類似片選和時鐘線的作用,RW和RS指示了讀、寫的方向和內容。在讀數(shù)據(或者Busy標志)期間,EN線必須保持高電平;而在寫指令(或者數(shù)據)過程中,EN線上必須送出一個正脈沖。RW、RS的組合一共有四種情況,分別對應四種操作:

RS=0、RW=0——表示向LCM寫入指令
RS=0、RW=1——表示讀取Busy標志
RS=1、RW=0——表示向LCM寫入數(shù)據
RS=1、RW=1——表示從LCM讀取數(shù)據

三、LCD在使用的過程中,可以在RS=0、RW=0的情況下,向LCM寫入一個字節(jié)的控制指令。使用的控制指令一共八個類別。有的類別又有幾條不同的指令。具體的情況羅列在下:

①01H:清除DDRAM的所有單元,光標被移動到屏幕左上角。
②02H:DDRAM所有單元的內容不變,光標移至左上角。
③輸入方式設置(EnterModeSet),這些指令規(guī)定了兩個方面:一是寫入一個DDRAM單元后,地址指針如何改變(加一還是減一);二是屏幕上的內容是否滾動。
04H:寫入DDRAM后,地址指針減一,比如第一個字符寫入8FH,則下一個字符會寫入8EH;屏幕上的內容不滾動。
05H:寫入DDRAM后,地址指針減一,同上一種情況;每一個字符寫入以后,屏幕上的內容向右滾動一個字符位。
06H:寫入DDRAM后,地址指針加一,比如第一個字符寫入80H,則下一個字符會寫入81H;屏幕上的內容也是不滾動。這應該是最常用的一種顯示方式。
07H:寫入DDRAM后,地址指針加一,同上一種情況;每一個字符寫入以后,屏幕上的內容向左滾動一個字符位。
④屏幕開關、光標開關、閃爍開關。
08H、09H、0AH、0BH:關閉顯示屏,實質上是不把DDRAM中的內容對應顯示在屏幕上,對DDRAM的操作還是在進行的,執(zhí)行這條指令,接著對DDRAM進行寫入,屏幕上沒有任何內容,但是接著執(zhí)行下面的某條指令,就能看到剛才屏幕關閉期間,對DDRAM操作的效果了。
0cH:打開顯示屏,不顯示光標,光標所在位置的字符不閃爍。
0dH:打開顯示屏,不顯示光標,光標所在位置的字符閃爍。
0eH:打開顯示屏,顯示光標,光標所在位置的字符不閃爍。
0fH:打開顯示屏,顯示光標,光標所在位置的字符閃爍。
關于光標的位置:光標所在的位置指示了下一個被寫入的字符所處的位置,加入在寫入下一個字符前沒有通過指令設置DDRAM的地址,那么這個字符就應該顯示在光標指定的地方。
⑤設置光標移動(本質就是AC的增加還是減少)、整體畫面是否滾動。
10H:每輸入一次該指令,AC就減一,對應了光標向左移動一格。整體的畫面不滾動。
14H:每輸入一次該指令,AC就加一,對應了光標向右移動一格。整體的畫面不滾動。
18H:每輸入一次該指令,整體的畫面就向左滾動一個字符位。
1CH:每輸入一次該指令,整體的畫面就向右滾動一個字符位。畫面在滾動的時候,每行的首尾是連在一起的,也就是每行的第一個字符,若左移25次,就會顯示在該行的最后一格。在畫面滾動的過程中,AC的值也是變化的。 ⑥顯示模式設定指令,設定了顯示幾行,顯示什么樣的點陣字符,數(shù)據總線占用幾位。
20H:4位總線,單行顯示,顯示5×7的點陣字符。
24H:4位總線,單行顯示,顯示5×10的點陣字符。
28H:4位總線,雙行顯示,顯示5×7的點陣字符。
2CH:4位總線,雙行顯示,顯示5×10的點陣字符。
30H:8位總線,單行顯示,顯示5×7的點陣字符。
34H:8位總線,單行顯示,顯示5×10的點陣字符。
38H:8位總線,雙行顯示,顯示5×7的點陣字符。這是最常用的一種模式。3CH:8位總線,雙行顯示,顯示5×10的點陣字符。


    本站是提供個人知識管理的網絡存儲空間,所有內容均由用戶發(fā)布,不代表本站觀點。請注意甄別內容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內容,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多