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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5875|回復(fù): 4
收起左側(cè)

[原創(chuàng)]請教大家一個(gè)關(guān)于12864程序的問題

[復(fù)制鏈接]
ID:22739 發(fā)表于 2010-3-31 20:52 | 顯示全部樓層 |閱讀模式

仿真時(shí)液晶的點(diǎn)來回跳動(dòng),請問是什么原因

#include <reg51.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
#define DATA P0 //LCD12864數(shù)據(jù)線
sbit RS=P2^2; // 數(shù)據(jù)\指令 選擇
sbit RW=P2^1; // 讀\寫 選擇
sbit EN=P2^0; // 讀\寫使能
sbit cs1=P2^4; // 片選1
sbit cs2=P2^3; // 片選2

 

 

/*狀態(tài)檢查,LCD是否忙*/
void CheckState()  
{
   uchar dat;//狀態(tài)信息(判斷是否忙)
   RS=0; // 數(shù)據(jù)\指令選擇,D/I(RS)=“L” ,表示 DB7∽DB0 為顯示指令數(shù)據(jù)
   RW=1; //R/W=“H” ,E=“H”數(shù)據(jù)被讀到DB7∽DB0
   do{
      DATA=0x00;
      EN=1; //EN下降源
   _nop_(); //一個(gè)時(shí)鐘延時(shí)
   dat=DATA;
      EN=0;
      dat=0x80 & dat; //僅當(dāng)?shù)?位為0時(shí)才可操作(判別busy信號)
      }while(!(dat==0x00));
}


 /*寫命令到LCD中*/
void SendCommandToLCD(uchar com)
{
   CheckState();//狀態(tài)檢查,LCD是否忙
   RS=0;  //向LCD發(fā)送命令。RS=0寫指令,RS=1寫數(shù)據(jù)
   RW=0;//R/W=“L” ,E=“H→L”數(shù)據(jù)被寫到 IR 或 DR
   DATA=com;  //com :命令
   EN=1;//EN下降源
   _nop_();
   _nop_();
   EN=0;
}

 /*設(shè)置頁 0xb8是頁的首地址*/
void SetLine(uchar page) 
{
  page=0xb8|page; //1011 1xxx 0<=page<=7 設(shè)定頁地址--X 0-7,8行為一頁64/8=8,共8頁
  SendCommandToLCD(page);
}

 /*設(shè)定顯示開始行,0xc0是行的首地址*/
void SetStartLine(uchar startline)    
{
  startline=0xc0|startline; //1100 0000
  SendCommandToLCD(startline); //設(shè)置從哪行開始:0--63,一般從0 行開始顯示
}

 /*設(shè)定列地址--Y 0-63 ,0x40是列的首地址*/
void SetColumn(uchar column) 
{
  column=column &0x3f; //column最大值為64,越出 0=<column<=63
  column= 0x40|column; //01xx xxxx
  SendCommandToLCD(column);
}

 
 /*開關(guān)顯示,0x3f是開顯示,0x3e是關(guān)顯示*/
void SetOnOff(uchar onoff)   
{
 onoff=0x3e|onoff; //0011 111x,onoff只能為0或者1
 SendCommandToLCD(onoff);
}

/*寫顯示數(shù)據(jù) */
void WriteByte(uchar dat) 
{
   CheckState();//狀態(tài)檢查,LCD是否忙
   RS=1; //RS=0寫指令,RS=1寫數(shù)據(jù)
   RW=0;////R/W=“L” ,E=“H→L”數(shù)據(jù)被寫到 IR 或 DR
   DATA=dat;//dat:顯示數(shù)據(jù)
   EN=1; //EN下降源
   _nop_();
   _nop_();
   EN=0;
}

 

/*選擇屏幕screen: 0-全屏,1-左屏,2-右屏*/
void SelectScreen(uchar screen)  
{       
   switch(screen)
   { case 0: cs1=0;//全屏
             _nop_(); _nop_(); _nop_();
             cs2=0;
             _nop_(); _nop_(); _nop_();
             break;
     case 1: cs1=0;//左屏
             _nop_(); _nop_(); _nop_();
             cs2=1;
             _nop_(); _nop_(); _nop_();
             break;
     case 2: cs1=1;//右屏
             _nop_(); _nop_(); _nop_();
             cs2=0;
             _nop_(); _nop_(); _nop_();
             break;
   }
}

 /*清屏screen: 0-全屏,1-左屏,2-右*/
void ClearScreen(uchar screen)  
{  
     uchar i,j;
     SelectScreen(screen);
    
  for(i=0;i<8;i++)  //控制頁數(shù)0-7,共8頁
  {
         SetLine(i);
   SetColumn(0);
              for(j=0;j<64;j++)    //控制列數(shù)0-63,共64列
     {
                  WriteByte(0x00); //寫點(diǎn)內(nèi)容,列地址自動(dòng)加1
              }
     }
     
}

/*延時(shí)程序*/
void delay(uint z)  
{
 uint i,j;
 for(i=0; i<z; i++)
  for(j = 0; j < 110; j++);
}

/*初始化LCD*/
void InitLCD()   
{

 CheckState();

 SelectScreen(0);
 SetOnOff(0); //關(guān)顯示

 SelectScreen(0);
 SetOnOff(1); //開顯示

 SelectScreen(0);
 ClearScreen(0);//清屏

 SetStartLine(0); //開始行:0

}

 


void GUI_Point(uchar x,uchar y,uchar flag)
{    
  uchar x_Dyte,x_byte;               //定義列地址的字節(jié)位,及在字節(jié)中的哪1位
  uchar y_Dyte,y_byte;               //定義為上下兩個(gè)屏(取值為0,1),行地址(取值為0~31)
  uchar GDRAM_hbit;
  uchar GDRAM_lbit;
  uchar shuju;
  /***X,Y坐標(biāo)互換,即普通的X,Y坐標(biāo)***/
  x_Dyte=y/16;                     //計(jì)算在16個(gè)字節(jié)中的哪一個(gè)
  x_byte=y&0x0f;                   //計(jì)算在該字節(jié)中的哪一位
  y_Dyte=x/32;                     //0為上半屏,1為下半屏
  y_byte=x&0x1f;                   //計(jì)算在0~31當(dāng)中的哪一行
 
 
             
  GDRAM_hbit=shuju&0xF0;             //讀取當(dāng)前顯示高8位數(shù)據(jù)
  GDRAM_lbit=shuju&0x0F;             //讀取當(dāng)前顯示低8位數(shù)據(jù)
   _nop_();
    _nop_();
  _nop_();
  

 
  if(flag==1)
  {
  SetStartLine(0x80+y_byte);           //設(shè)定行地址(y坐標(biāo))
   SetColumn(0x80+x_Dyte);     //設(shè)定列地址(x坐標(biāo))
  if(y_Dyte<32)
  {
   SelectScreen(2);
   }
   else
   {
   SelectScreen(0);
   }
 
    if(x_byte<8)                       //判斷其在高8位,還是在低8位
  {
    WriteByte(GDRAM_hbit|(0X01<<(7-x_byte)));   //顯示GDRAM區(qū)高8位數(shù)據(jù)
    WriteByte(GDRAM_lbit);               //顯示GDRAM區(qū)低8位數(shù)據(jù)
    }
    else
    {
    WriteByte(GDRAM_hbit);
   WriteByte(GDRAM_lbit|(0x01<<(15-x_byte)));
    }
  }
  else
  {
  WriteByte(0x00);                   //清除GDRAM區(qū)高8位數(shù)據(jù)
  WriteByte(0x00);                   //清除GDRAM區(qū)低8位數(shù)據(jù)
  }   
}


/**********讀取當(dāng)前地址的LCD顯示數(shù)據(jù)**********/
void Read_data()
{
uchar shuju;
RS=1;                          // D/I=1,代表數(shù)據(jù)
RW=1;                           // R/W=1.讀取
delay(10);
EN=1;
delay(100);
shuju=DATA; //讀取當(dāng)前顯示的數(shù)據(jù)
_nop_();
EN=0;
return;
}

void hualinex(uchar x0,uchar x1,uchar y,uchar flag)
{
uchar temp;
if(x0>x1)
{
temp=x1;
x1=x0;
x0=temp;
}
for(;x0<=x1;x0++)
GUI_Point(x0, y,flag);
}


/*主函數(shù)*/
void main()

    InitLCD();//初始12864
    
    ClearScreen(0);
    SetStartLine(0);//顯示開始行
  
    while(1)
    { 
      hualinex(0,127,0,1);
  
  
}
}

 

 

回復(fù)

使用道具 舉報(bào)

ID:22657 發(fā)表于 2010-4-1 10:46 | 顯示全部樓層

大蝦,請問有沒有Proteus中的硬件電路圖,

 

回復(fù)

使用道具 舉報(bào)

ID:22657 發(fā)表于 2010-4-1 10:47 | 顯示全部樓層

LCD_DATA  EQU  P0     ;液晶并行數(shù)據(jù)口

LCD_RS    EQU  P2.0   ;液晶指令數(shù)據(jù)選擇:H=數(shù)據(jù)  L=指令

LCD_RW    EQU  P2.1   ;液晶讀寫信號控制: H=讀    L=寫

LCD_E     EQU  P2.2   ;液晶數(shù)據(jù)鎖存信號: 下降沿鎖存

LCD_SPB   EQU  P2.3   ;液晶通信格式: H=并行   L=串行

LCD_RES   EQU  P2.4   ;液晶復(fù)位信號: 低電平復(fù)位

POW_EN  EQU  P2.6

TX_EN   EQU  P2.5


DISP_ON   EQU  20H.0

SCAN_BIT  EQU  20H.1


;液晶顯示區(qū)首地址:第一行:30H~3FH,第二行:40H~4FH,第三行:50H~5FH,第四行:60H~6FH

ORG 0000H

JMP MAIN


ORG 0023H

JMP RS_232


主程序:

MAIN:CLR DISP_ON

     CLR SCAN_BIT

     SETB POW_EN

     CLR TX_EN

     MOV R1,#30H     ;指向存儲區(qū)首地址

     MOV R5,#0

     MOV R4,#0

     CALL LCD_INIT

     CALL RS232_INIT

     CALL DELY2

     CALL DELY2

      CALL DELY2

MAIN_LOOP:JNB DISP_ON,$

          CALL DISP_RAM

          CLR DISP_ON

          JMP MAIN_LOOP

          RET


串口初始化程序:

RS232_INIT:MOV TMOD,#20H

           MOV SCON,#50H

           MOV TL1,#0FAH

           MOV TH1,#0FAH

           SETB TR1

           SETB ES

           SETB EA

           RET


顯示RAM區(qū)程序:

DISP_RAM:MOV A,#80H

         CALL WRITE_COM

         MOV R0,#30H               

DISP_RAM_JMP1:MOV A,@R0

         CALL WRITE_DATA

         INC R0

         CJNE R0,#40H,DISP_RAM_JMP1

         MOV A,#90H

         CALL WRITE_COM

DISP_RAM_JMP2:MOV A,@R0

         CALL WRITE_DATA

         INC R0

         CJNE R0,#50H,DISP_RAM_JMP2

         MOV A,#88H

         CALL WRITE_COM

DISP_RAM_JMP3:MOV A,@R0

         CALL WRITE_DATA

         INC R0

         CJNE R0,#60H,DISP_RAM_JMP3

         MOV A,#98H

         CALL WRITE_COM

DISP_RAM_JMP4:MOV A,@R0

         CALL WRITE_DATA

         INC R0

         CJNE R0,#70H,DISP_RAM_JMP4

         RET


液晶初始化程序:

LCD_INIT: CLR LCD_RES    ;復(fù)位

          CALL DELY2     ;復(fù)位延時(shí)

          CALL DELY2     ;復(fù)位延時(shí)

          SETB LCD_RES   ;復(fù)位結(jié)束

          CALL DELY2     ;復(fù)位延時(shí)

          CALL DELY2     ;復(fù)位延時(shí)

          SETB LCD_SPB   ;并行通信方式

          MOV  A,#30H

          CALL WRITE_COM

          CALL DELY1

          MOV  A,#03H

          CALL WRITE_COM

          CALL DELY1

          MOV  A,#0CH

          CALL WRITE_COM

          CALL DELY1

          MOV  A,#01H

          CALL WRITE_COM

          CALL DELY1

          MOV  A,#06H

          CALL WRITE_COM

          CALL DELY1

          RET

液晶寫指令,入口地址A

WRITE_COM:CLR LCD_RS

          CLR LCD_RW

          SETB LCD_E

          MOV LCD_DATA,A

          NOP

          NOP

          CLR LCD_E

          CALL DELY1

          RET

液晶寫數(shù)據(jù),入口地址A

WRITE_DATA:SETB LCD_RS

           CLR LCD_RW

           SETB LCD_E

           MOV LCD_DATA,A

           NOP

           NOP

           CLR LCD_E

           CALL DELY1

           RET

延時(shí)程序1

DELY1:MOV R7,#255

      DJNZ R7,$

      RET

延時(shí)程序2

DELY2:MOV R6,#255

DELY2_JMP1:CALL DELY1

           DJNZ R6,DELY2_JMP1

           RET


串口中斷程序

RS_232:PUSH A

     MOV A,SBUF

JB SCAN_BIT,RS_232_JMP1

     CJNE A,#99H,RS_232_JMP0

     INC R5

     CJNE R5,#2,RS_232_EXIT

     MOV R1,#30H

MOV R4,#0

     SETB SCAN_BIT

     RS_232_JMP0:MOV R5,#0

     JMP RS_232_EXIT

RS_232_JMP1:CJNE A,#0AAH,RS_232_JMP2

     INC R4

     CJNE R4,#3,RS_232_JMP3

     MOV R5,#0

     CLR SCAN_BIT

     SETB DISP_ON

     JMP RS_232_EXIT

RS_232_JMP2:MOV R4,#0

RS_232_JMP3:CJNE R1,#70H,RS_232_JMP4

    JMP RS_232_EXIT

RS_232_JMP4:MOV @R1,A

INC RRS_232_EXIT:POP A

    CLR RI

    RETI


回復(fù)

使用道具 舉報(bào)

ID:22739 發(fā)表于 2010-4-1 16:23 | 顯示全部樓層
snap1.jpg
回復(fù)

使用道具 舉報(bào)

ID:22657 發(fā)表于 2010-4-5 08:35 | 顯示全部樓層

要么就是電壓不穩(wěn),要么就是CS1、CS2問題,因?yàn)樗鼈儍蓚(gè)不能夠聯(lián)在一起一個(gè)是顯示左半,一個(gè)是顯示右半的嗎

回復(fù)

使用道具 舉報(bào)

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 成人依人| 欧美成人一区二区三区 | 日韩精品二区 | 黄网站涩免费蜜桃网站 | 亚洲精品乱码久久久久久久久 | 国产视频亚洲视频 | 日本小电影在线 | 欧美极品在线 | 国产在线观看福利 | 黄色网络在线观看 | 91九色视频在线 | 亚洲精品日韩精品 | 九九热在线免费视频 | 欧美视频| 久久一| 午夜一区 | 亚洲欧美一区二区三区在线 | 日本爱爱 | 能免费看的av | 在线看免费的a | 国内精品久久影院 | 伊人久久成人 | 不卡的av在线 | 91成人小视频 | 日韩一区二区三区在线看 | 国产一级片一区二区 | 欧美区在线 | 午夜久久久 | 久久久久国产精品一区二区 | 欧美日韩久久精品 | 欧美日韩成人在线 | 精品在线播放 | 国产在线中文字幕 | 999视频在线播放 | 亚洲国产一区二区三区, | 久久久久免费观看 | 国产黄色大片 | 日本不卡一区二区三区在线观看 | 亚洲精久久久 | 国产精品久久久久久久久久久久久 | 国产精品夜夜春夜夜爽久久电影 |