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

專注電子技術學習與研究
當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

LCD1602,LCD1640液晶4位總線模式編程成功

作者:佚名   來源:本站原創   點擊數:  更新時間:2010年05月22日   【字體:
//由于2051的IO不夠用,必須省出IO口,迫不得已,又根據大量資料對程序進行了修改
//得到如下能夠成功運行的程序。本程序在STC89C51RC@12MHz 4位總線模式下通過data image CM1640液晶模塊
//yusung W-1602A液晶模塊,廣州捷勝 1602A V1.0模塊的測試,均可正常寫入。

#include < reg51.h>
sbit rs=P3^5;//指令數據選擇
sbit rw=P2^7;//讀寫選擇
sbit clk=P3^4;//使能脈沖
unsigned char code Logo_text1[]="[China O Soft!] ";//文字數組
unsigned char code Logo_text2[]="Soldering iron. ";//文字數組
unsigned char code Logo_text3[]={'V','o','l','t',':','2','0','V',' ','S','e','t','3','0','0',0xdf};//文字數組
unsigned char code Logo_text4[]={'P','o','w','e','r',':','2','0','W',' ','C','T','2','9','5',0xdf};//文字數組
unsigned char m;//輔助尋址指針變量
sbit clear = P3^2;//清屏按鈕
sbit key1 = P3^4;//寫第一行按鈕
sbit key2 = P3^5;//寫第二行按鈕
sbit key3 = P3^6;//顯示模式變更測試按鈕

void delay2ms()//2064周期延時
{
unsigned char temP0;
while(--temp1);
while(--temp1);
while(--temp1);
while(--temp1);
}

void delay()
  {
  unsigned char temp1,temp2;
  temp1=50;
  while(--temp1)
    while(--temp2);
  }

void check_busy()//忙檢測
  {
  unsigned char busy;//臨時字節
  do
  {
  rs=0;//選擇寄存器
  rw=1;//讀取
  clk=1;//LCD將數據放到總線
  busy=P0;//讀入總線數據
  clk=0;//關閉總線
  busy=busy&0x80;//保留最高位
  }while(busy);//判斷是否為忙
  }

void instructions(unsigned char INS)//寫指令函數
  {
  check_busy();//寫之前檢測忙
  rs=0;//選擇指令寄存器
  rw=0;//寫操作
  clk=1;//準備下降沿
  P0=INS;//數據放到總線上
  clk=0;//下降沿,數據寫入LCD

  clk=1;//準備下降沿
  P0=INS<<4;//數據放到總線上
  clk=0;//下降沿,數據寫入LCD
  }


void write_data(unsigned char dat)//寫數據函數
  {
  check_busy();//寫之前檢測忙
  rs=1;//選擇數據寄存器
  rw=0;//寫操作
  clk=1;//準備下降沿
  P0=dat;//數據放到總線上
  clk=0;//下降沿,數據寫入LCD

  clk=1;//準備下降沿
  P0=dat<<4;//數據放到總線上
  clk=0;//下降沿,數據寫入LCD
  }
void lcd_clear()//清除顯示函數
  {
  instructions(0x01);//清除顯示
  delay2ms();//清屏后,按手冊至少應延時1.53ms
  }
void set_4bit_mode()
  {
  check_busy();//寫之前檢測忙
  rs=0;//選擇指令寄存器
  rw=0;//寫操作
  clk=1;//準備下降沿
  P0=0x2f;//4位總線控制字
  clk=0;//下降沿,數據寫入LCD
  }
void lcd_init()
  {
  rw=0;//寫操作
  set_4bit_mode();//設置成4位總線模式.
  delay2ms();//按手冊應至少延時39us,但由于執行次數不多,統一使用2ms延時
  instructions(0x0f);//設置輸入模式為8位數據總線,光標增量移動,顯示不移位
  delay2ms();//按手冊應至少延時39us,但由于執行次數不多,統一使用2ms延時
  instructions(0x06);//開顯示,關閉光標,不閃爍
  delay2ms();//按手冊應至少延時39us,但由于執行次數不多,統一使用2ms延時
  lcd_clear();//調用清屏函數

  instructions(0x80+0x00);//寫入顯示緩沖區起始地址為1行1列
  delay2ms();//按手冊應至少延時39us,但由于執行次數不多,統一使用2ms延時
  for(m=0;m<16;m++)//將預先定義好的字符連續發送到LCD
    {
 write_data(Logo_text1);//通過輔助變量查詢數組并寫入LCD
 delay();
 }

  instructions(0x80+0x40);//寫入顯示緩沖區起始地址為2行1列
  delay2ms();//按手冊應至少延時39us,但由于執行次數不多,統一使用2ms延時
  for(m=0;m<16;m++)//將預先定義好的字符連續發送到LCD
    {
 write_data(Logo_text2);//通過輔助變量查詢數組并寫入LCD
 delay();
 }
  }

void main()
{
lcd_init();//LCD初始化
while(1)
  {
  if(!key1)//判斷按鍵是否按下
    {
 instructions(0x80+0x10);//寫入顯示緩沖區起始地址為1行1列
    delay2ms();//按手冊應至少延時39us,但由于執行次數不多,統一使用2ms延時
 for(m=0;m<16;m++)//將預先定義好的字符連續發送到LCD
   {
   write_data(Logo_text3);//通過輔助變量查詢數組并寫入LCD
   }
 }
  if(!key2)//判斷按鍵是否按下
    {
 instructions(0x80+0x50);//寫入顯示緩沖區起始地址為2行1列
    delay2ms();//按手冊應至少延時39us,但由于執行次數不多,統一使用2ms延時
 for(m=0;m<16;m++)//將預先定義好的字符連續發送到LCD
   {
   write_data(Logo_text4);//通過輔助變量查詢數組并寫入LCD
   }
 }
  if(!clear)//判斷按鍵是否按下
    {
 lcd_clear();//調用清屏函數
 }
  if(!key3)//判斷按鍵是否按下
    {
 instructions(0x0c);//改變顯示模式
    delay2ms();//按手冊應至少延時39us,但由于執行次數不多,統一使用2ms延時
 }
  }
}

關閉窗口

相關文章

主站蜘蛛池模板: 黄av在线 | 日韩网站在线观看 | 免费特级毛片 | 黄色免费观看网站 | 欧美精品日韩 | 日日操视频| 黄网免费观看 | 成人看片网 | 国产精品久久久久久无人区 | 9l视频自拍九色9l视频成人 | 国产精品美女久久久 | 国产三级成人 | 免费观看一区二区 | 中文字幕在线免费观看视频 | 黄色大片免费在线观看 | 成人一级视频 | 欧美又大又硬又粗bbbbb | 99国产在线视频 | av在线免费观看网站 | www.午夜| 日本欧美久久久久免费播放网 | 亚洲免费视频一区 | 国产精品久久久久久久久久久久午夜片 | 亚洲国产欧美在线 | 亚洲精品不卡 | 日韩一区在线播放 | 夜夜操夜夜爽 | av在线播放免费 | 成人免费在线视频观看 | 欧美国产在线观看 | 成人午夜网站 | 97视频在线免费观看 | 免费观看毛片 | 天天干天天爽 | 一级黄色免费 | 日韩伊人 | 久在线 | 欧美日韩亚洲视频 | 日日夜夜av | 免费看黄色一级片 | 天天射天天|