<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > LCD1602的C8051驅(qū)動

          LCD1602的C8051驅(qū)動

          作者: 時間:2016-11-23 來源:網(wǎng)絡 收藏
          //--------------------lcd1602.c------------------------------
          //**********************************************
          // 功能:C8051F(330) LCD1602(4線驅(qū)動
          //**********************************************
          #include
          #include "delay.h"
          //
          //12 345678910 11 12 13 1415 16
          // |||||||
          //|---| |||||---------------------| |--|
          //VSS VDD VL RS RW ED0 D1 D2 D3 D4 D5 D6 D7 B+ B-

          //
          //連接:
          //RS->P0.1
          //RW->P0.2
          //E->P0.3
          //D4~D7->P1.4~P1.7
          //VL根據(jù)不同型號,可能要接VSS或VDD
          //B+/B-->+5/GND
          //VSS/VDD->GND/+3.3

          sbit lcd_rs=P0^1;
          sbit lcd_rw=P0^2;
          sbit lcd_e=P0^3;
          #define LCD_DAT P1
          //HD44780指令
          #define LCD_CLEAR 0x01
          //清屏
          #define LCD_HOME 0x02
          //光標復位
          #define LCD_SET_INPUT 0x06
          //輸入模式:AC+1,顯示不移
          #define LCD_DISPLAY_OFF 0x80
          #define LCD_DISPLAY_ON 0x0c
          #define LCD_SHIFT 0x14
          //顯示屏和光標移動:AC+1,光標右移1格
          #define LCD_MODE_8 0x38
          #define LCD_MODE_4 0x28
          //unsigned char lcd_add=0x00;
          void lcd_write_cmd(unsigned char dat)
          {
          lcd_rs=0;
          lcd_rw=0;
          lcd_e=1;
          LCD_DAT=dat;
          delay_us(1);
          lcd_e=0;
          //delay_us(50);
          delay_us(1);
          lcd_e=1;
          LCD_DAT=dat<<4;
          delay_us(1);
          lcd_e=0;
          delay_us(50);
          }
          void lcd_sendchar(unsigned char dat)
          {
          lcd_rs=1;
          lcd_rw=0;
          lcd_e=1;
          LCD_DAT=dat;
          delay_us(1);
          lcd_e=0;
          //delay_us(50);
          delay_us(1);
          lcd_e=1;
          LCD_DAT=dat<<4;
          delay_us(1);
          lcd_e=0;
          delay_us(50);
          }
          //
          //void lcd_wait_busy(void)
          //{
          //lcd_rs=0;
          //lcd_rw=1;
          //lcd_e=1;
          //while(LCD_DAT&0x80);
          //lcd_e=0;
          //delay_us(50);
          //}

          void lcd_init(void)
          {
          lcd_e=0;
          delay_ms(15);
          lcd_write_cmd(LCD_MODE_8);
          delay_ms(5);
          lcd_write_cmd(LCD_MODE_8);
          delay_ms(5);
          lcd_write_cmd(LCD_MODE_8);
          lcd_write_cmd(LCD_MODE_4);
          //delay_us(50);
          lcd_write_cmd(LCD_DISPLAY_ON);
          //delay_us(50);
          lcd_write_cmd(LCD_CLEAR);
          delay_ms(2);
          lcd_write_cmd(LCD_SET_INPUT);
          //delay_us(50);
          }
          void lcd_reset(void)
          {
          lcd_write_cmd(LCD_CLEAR);
          delay_ms(2);
          lcd_write_cmd(LCD_HOME);
          delay_ms(2);
          }
          void lcd_setadd(unsigned char add)
          {
          if(add>0x0f)add+=0x30;
          lcd_write_cmd(add|0x80);
          }
          void lcd_sendstr(unsigned char add,unsigned char *dat)
          {
          lcd_setadd(add);
          while(*dat)
          {
          lcd_sendchar(*dat++);
          }
          }
          //-----------------------------------------------------------------
          //----------------------lcd1602.h---------------------------------
          #ifndef _LCD_1602
          #define _LCD_1602
          extern void lcd_write_cmd(unsigned char dat);
          extern void lcd_sendchar(unsigned char dat);
          extern void lcd_wait_busy(void);
          extern void lcd_init(void);
          extern void lcd_sendstr(unsigned char add,unsigned char *dat);
          extern void lcd_setadd(unsigned char add);
          extern void lcd_reset(void);
          #endif
          //-------------------------------------------------------------------
          //----------------delay.c-------------------------------------------
          //**********************************************
          // 功能:C8051F(330)精確延時 24.5M
          // 作者:July
          // Blog: http://blog.sina.com.cn/mcuworld
          // 最后更新:2008-12-31
          // 尊重勞動成果,引用請勿刪除本信息謝謝!
          //**********************************************
          #include
          #include
          //----------------------------------------------
          //----------------------------
          // 微秒級精確延時
          // 仿真:(24.5M)
          // delay_us(1); //1.72us
          // delay_us(10);//10.89us
          // delay_us(100); //102.74us
          //----------------------------
          void delay_us(unsigned char k)
          {
          while(k--)
          {
          _nop_();_nop_();_nop_();_nop_();
          _nop_();_nop_();_nop_();_nop_();
          _nop_();_nop_();_nop_();_nop_();
          _nop_();_nop_();_nop_();_nop_();
          }
          }
          //----------------------------------------------
          // 毫秒級精確延時
          // 仿真:(24.5M)
          // delay_ms(1); //1001.75us
          // delay_ms(10);//10.008ms
          // delay_ms(100); //老機太慢出不來鳥~自己測吧:)
          //----------------------------------------------
          void delay_1ms()
          {
          unsigned int j ;
          for(j=3060;j>0;j--);
          }
          void delay_ms(unsigned int i)
          {
          for(;i>0;i--)delay_1ms();
          }
          //------------------------------------------
          //----------------delay.h-----------------
          #ifndef _DELAY_H
          #define _DELAY_H
          extern void delay_us(unsigned char k);
          extern void delay_ms(unsigned int i);
          #endif
          //---------------------------------------
          //---------------------main.c--------------
          //**********************************************
          // 功能:C8051F(330)精確延時+UART0+LCD1602(4線)
          // 作者:July
          // Blog: http://blog.sina.com.cn/mcuworld
          // 最后更新:2009-5-12
          // 尊重勞動成果,引用請勿刪除本信息謝謝!
          //**********************************************
          //
          //AVR/AVR32群:78613373
          //C8051F/STC/MPC群:78614293
          //Cortex-M3/M0(STM32)群:78612895
          //PIC/PIC32群:78614030
          //LabWindows/CVI群:20328398
          //WinCE/C#群:74373749
          //
          //使用F330,串口為P0.4(TX0),P0.5(RX0);
          #include
          //#include
          #include "uart0.h"
          #include "delay.h"
          #include "lcd1602.h"
          void SYSCLK_Init(void);
          void PORT_Init(void);

          void main(void)
          {
          unsigned char dat=0x20;
          unsigned char address=0;
          PCA0MD&=~0x40 ;
          // 禁止看門狗
          PORT_Init();
          // 初始化端口I/O
          SYSCLK_Init();
          // 初始化系統(tǒng)時鐘
          UART0_Init();
          // 串口初始化

          EA=1 ;
          ES0=1 ;
          P0|=0x01;
          lcd_init();
          lcd_reset();
          lcd_sendstr(0,"1234567890abcdef");
          lcd_sendstr(16,"ghijklmnopqrstuv");
          sendstr("Welcome to Julys Hut!");
          while(1)
          {
          delay_ms(200);
          P0^=0x01;
          Uart0_Transmit(dat);
          lcd_setadd(address++);
          if(address>31)address=0;
          lcd_sendchar(dat++);
          if(dat>=0x7f)dat=0x20;
          //Uart0_Transmit(0x00);
          }
          }
          //-----------------------------------------------------------------------------
          // 端口初始化
          //-----------------------------------------------------------------------------
          //
          // 配置交叉開關和通用IO
          //
          // P0.4 - UART TX0
          // P0.5 - UART RX0
          void PORT_Init(void)
          {
          P0MDOUT|=0x10 ;
          // 使能 UTX 為推挽輸出
          P0MDOUT|=0x01;
          XBR0=0x01 ;
          // 使能 UART0 占用 P0.4(TXD) 和 P0.5(RXD)
          XBR1=0x40 ;
          //使能交叉開關
          }
          //-----------------------------------------------------------------------------
          // 系統(tǒng)時鐘初始化
          //-----------------------------------------------------------------------------
          void SYSCLK_Init(void)
          {
          OSCICN|=0x03 ;
          // 配置內(nèi)部振蕩器的的最大頻率
          RSTSRC=0x04 ;
          // 使能始終丟失檢測寄存器
          }
          //----------------------------------------------------
          //-------------main.h----------------------
          #ifndef _MAIN_H
          #define _MAIN_H
          // 系統(tǒng)工作頻率
          #define SYSCLK 24500000
          // 串口工作波特率
          #define BAUDRATE 9600
          #endif
          //----------------------------------------
          //----------uart0.c-----------------------
          //**********************************************
          // 功能:C8051F(330) UART0
          // 作者:July
          // Blog: http://blog.sina.com.cn/mcuworld
          // 最后更新:2009-5-12
          // 尊重勞動成果,引用請勿刪除本信息謝謝!
          //**********************************************
          #include
          #include "main.h"
          unsigned char temp ;
          void UART0_Init(void);
          void Uart0_Transmit(unsigned char tmp);
          void sendstr(unsigned char*tmp);
          //-----------------------------------------------------------------------------
          // 串口UART0初始化
          //-----------------------------------------------------------------------------
          void UART0_Init(void)
          {
          SCON0=0x10 ;
          if(SYSCLK/BAUDRATE/2/256<1)
          {
          TH1=-(SYSCLK/BAUDRATE/2);
          CKCON&=~0x0B ;
          CKCON|=0x08 ;
          }
          else if(SYSCLK/BAUDRATE/2/256<4)
          {
          TH1=-(SYSCLK/BAUDRATE/2/4);
          CKCON&=~0x0B ;
          CKCON|=0x09 ;
          }
          else if(SYSCLK/BAUDRATE/2/256<12)
          {
          TH1=-(SYSCLK/BAUDRATE/2/12);
          CKCON&=~0x0B ;
          }
          else
          {
          TH1=-(SYSCLK/BAUDRATE/2/48);
          CKCON&=~0x0B ;
          CKCON|=0x02 ;
          }

          TL1=TH1 ;
          TMOD&=~0xf0 ;
          TMOD|=0x20 ;
          TR1=1 ;
          // TI0 = 1;
          }
          //-----------------------------------------------------------
          // 串口UART0中斷
          //-----------------------------------------------------------
          //中斷向量0x0023
          void UATR0_ISR(void)interrupt 4
          {
          //Rx、Tx共用中斷
          //接收中斷
          if(!TI0)
          {
          RI0=0 ;
          temp=SBUF0 ;
          Uart0_Transmit(temp);
          }
          //發(fā)送中斷
          else TI0=0 ;
          }
          //-----------------------------------------------------------
          // 串口UART0發(fā)送
          //-----------------------------------------------------------
          void Uart0_Transmit(unsigned char tmp)
          {
          ES0=0 ;
          //關UART0中斷
          EA=0 ;
          //關全局中斷
          SBUF0=tmp ;
          while(TI0==0);
          //TI0=0 ;
          ES0=1 ;
          //開UART0中斷
          EA=1 ;
          //開全局中斷

          }
          //-----------------------------------------------------------
          // 發(fā)送字符串
          //-----------------------------------------------------------
          void sendstr(unsigned char*tmp)
          {
          while(*tmp)
          {
          Uart0_Transmit(*tmp++);
          }
          }

          //-----------------------------------
          //-----------------------uart0.h-------------------
          #ifndef _UART0_H
          #define _UART0_H
          extern void UART0_Init(void);
          extern void Uart0_Transmit(unsigned char tmp);
          extern void sendstr(unsigned char*tmp);
          #endif

          //-------------------------------------


          關鍵詞: LCD1602C8051驅(qū)

          評論


          技術專區(qū)

          關閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();