您的位置:首页版主原创51示例程序
内容搜索: 标题内容作者
     
阅读内容
背景:#EDF0F5 #FAFBE6 #FFF2E2 #FDE6E0 #F3FFE1 #DAFAF3 #EAEAEF 默认  

LCD显示单个A字的示例程序(测试OK)

[日期:2008-01-09 ] [来源:www.picavr.com 作者:本站原创] [字体: (投递新闻)
LCD显示单个A字

;********WAVE-E6000/T*****************************
;*MCU:          AT89C51                          *
;*MCU-crystal:  12M                              *
;*Version:      00                               *
;*Last Updata:                                   *
;*Author:       www.picavr.com                   *
;*Description:  在LCD1602上显示单个A字(汇编程序) *
;*************************************************
RS          BIT  P2.7
R_W         BIT  P2.6
ENABLE      BIT  P2.5
DB0_DB7     DATA P0
;*********************************************
            ORG 00H
            JMP Start
            ORG 000BH
            AJMP INSERS
            ORG 50H
;*********************************************
Start:      NOP
            MOV TMOD,#0
            MOV TL0,#0
            MOV TH0,#0
            SETB EA
            SETB ET0
            SETB TR0
            MOV R5,#50
            CLR P3.2
            SETB P3.1
            MOV SP,#60H
            CALL Initial
            MOV A,#10000000B          ;set the address
            CALL Write_instruction
            MOV A,#41H                ;the ASCII CODE "A"
            CALL WriteLCDData
;*********************************************
LOOP:       JMP LOOP
;*********************************************
INSERS:     MOV TH0,#0
            MOV TL0,#0
            DJNZ R5,NO
            MOV R5,#50
            CPL P3.2
            CPL P3.1
NO:         RETI
;*********************************************
Initial:    MOV A,#00111000B
            CALL Write_instruction
            MOV A,#00001110B
            CALL Write_instruction
            MOV A,#00000110B
            CALL Write_instruction
            RET
;********************************************
CheckBusy:
            PUSH ACC
CheckBusyLoop:
            CLR ENABLE
            SETB R_W
            CLR RS
            SETB ENABLE
            MOV A,DB0_DB7
            CLR ENABLE
            JB ACC.7,CheckBusyLoop
            POP ACC
            CALL DELAY
            RET
;********************************************
Write_instruction:
            CALL CheckBusy
            CLR ENABLE
            CLR R_W
            CLR RS
            SETB ENABLE
            MOV DB0_DB7,A
            CLR ENABLE
            RET
;********************************************
WriteLCDData:
            CALL CheckBusy
            CLR ENABLE
            CLR R_W
            SETB RS
            SETB ENABLE
            MOV DB0_DB7,A
            CLR ENABLE
            RET
;********************************************
DELAY:      MOV R6,#5
D1:         MOV R7,#248
            DJNZ R7,$
            DJNZ R6,D1
            RET
            END
;*****************************************************


               

 

 //********WAVE-E6000/T*******************************
 //*MCU:          AT89C51                           *
 //*MCU-crystal:  12M                               *
 //*Version:      00                                *
 //*Last Updata:                                    *
 //*Author:       www.picavr.com                    *
 //*Description:  在LCD1602上显示单个A字(C程序)     *
 //***************************************************
 #include<reg51.h>
 #include<intrins.h>
 #define uint unsigned int
 #define uchar unsigned char
 //****************************
 sbit P1_0=P1^0;
 sbit P1_1=P1^1;
 sbit P1_2=P1^2;
 sbit P2_0=P2^0;
 sbit P2_1=P2^1;
 sbit P2_2=P2^2;
 sbit P2_3=P2^3;
 sbit P2_4=P2^4;
 sbit P2_5=P2^5;
 sbit P2_6=P2^6;
 sbit P2_7=P2^7;
 sbit P3_6=P3^6;
 sbit P3_7=P3^7;
 sbit P0_7=P0^7;
 //****************************
 //定义LCD的连接端口
 //****************************
 #define LCD_RS   P2_7
 #define LCD_RW   P2_6
 #define LCD_EN   P2_5
 #define BUSY     P0_7
 #define LCDPort0 P0
 #define SCL      P3_6
 #define SDA      P3_7
 #define K1       P1_0
 #define K2       P1_1
 #define K3       P1_2
 //********************************
 static uchar bdata StateREG; //可位寻址的状态寄存器
 sbit CY1 = StateREG^1;          //状态
 //********************************
 uchar  Command_Code;
 uchar  Command_Code_No;
 uchar  Buf_Code;
 uchar  Buf_Add;
 uchar  cont; 
 uchar  code Table[]={0x48,0x65,0x6c,0x6c,0x6f,0x20,0x52,0x49,
                      0x53,0x49,0x4f,0x4e,0x00};  //"Hello RISION"
 //******************************
 //函数原型声明 *****************
 //******************************
 void  LCDBusy(void);
 void  LCDWrite_Command(void);
 void  LCDWrite_Command_No(void);
 void  INITLCD(void);
 void  LCDWrite_Data(uchar Buf_Data);
 void  _nop_(void);
 void  delay_ms(uchar ms);
 void  LCDWrite_String(void);
 void  STA(void);
 void  STOP(void);
 void  Write_DATA();
 void  Read_DATA();
 void  WRBYT(uchar EEROM_Buf);
 //*******************************
 //===============================
 //延时最大255毫秒
 //===============================
 void delay_ms(uchar ms)
 {
  uchar i,j;
  for(j=0;j<ms;j++)
   for (i=0;i<124;i++)
   _nop_();
 }
 //===========================
 //写一个命令字节,不进行忙检测
 //===========================
 void LCDWrite_Command_No()
 {
       LCD_EN=0;
       LCD_RS=0;
       LCD_RW=0;
       LCDPort0=Command_Code_No;
       LCD_EN=1 ;
       _nop_();
       LCD_EN=0;
 }
 //===========================
 //写一个命令字节,进行忙检测
 //===========================
 void LCDWrite_Command()
 {
       LCDBusy();
       LCD_EN=0;
       LCD_RW=0;
       LCD_RS=0;
       LCD_EN=1;
       LCDPort0=Command_Code;
       LCD_EN=0;
 }
 //===========================
 //LCD状态检测
 //===========================
 void LCDBusy()
 {
     uchar BUSY_A;
   do{
      LCDPort0=0xFF;
      LCD_EN=0;
      LCD_RS=0;
      LCD_RW=1;
      LCD_EN=1;
      BUSY_A=LCDPort0;
      LCD_EN=0;
      }
     while ((BUSY_A&0x80)!=0x00);
 }
 //****************************
 void INITLCD()
 {
     delay_ms(15);
     Command_Code=0x38;
     LCDWrite_Command_No();
     delay_ms(5);
     Command_Code=0x38;
     LCDWrite_Command_No();
     delay_ms(5);
     Command_Code=0x38;
     LCDWrite_Command_No();

     Command_Code=0x38;
     LCDWrite_Command();  //设定LCD为16*2显示,5*7点阵,8位数据接口
     Command_Code=0x01;
     LCDWrite_Command();  //显示清屏。
     Command_Code=0x06;
     LCDWrite_Command();  //显示光标自动右移,整屏不移动。
     Command_Code=0x0C;
     LCDWrite_Command();  //开显示,不显示光标
 }
 //********************************

 //===========================
 //写一个命令字节,进行忙检测
 //===========================
 void LCDWrite_Data(uchar Buf_Code)
 {
 //      Buf_Code=Buf_Code|0x40;
       LCDBusy();
       LCD_EN=0;
       LCD_RW=0;
       LCD_RS=1;
       LCD_EN=1;
       LCDPort0=Buf_Code;
       LCD_EN=0;
 }
 //****************************
 void LCDWrite_String()
 {
   Command_Code=0x82;cont=0;
     do{
        LCDWrite_Command();
        Command_Code++;
        LCDWrite_Data(Table[cont]);
        cont++;
        }
      while(Table[cont]!=0x00);
      return;
 }
 //****************************
 
 //****************************
 void main()
 {
   INITLCD();
   Command_Code=0x80;
   LCDWrite_Command();  //将数据指针设置到第一行的第一个字符。
   LCDWrite_Data(0x47);
   LCDWrite_String();
   while(1);
   {;}
 }

阅读:
录入:admin

推荐 】 【 打印
本文评论
      全部评论
发表评论


点评: 字数
姓名:
赞助商广告