作者win95se (鳳梨王)
看板Electronics
標題[問題] LCD 無法動作
時間Thu Nov 8 08:43:22 2007
最近看書 [儒林 MCS-51單晶片原理與實務設計]
用Keil C和組語各寫了一個程式 [Keil C是直接抄書上的]
驅動一塊文字型LCM [SDEC1621],CPU用華邦W78E58B-40
但是一直無法正確顯示 [所有點全亮]
有那位大大可以幫我看一下哪裡出問題嗎?
Keil C
=======================
#include "reg51.h"
void set_lcd();
void cursor_home();
void put_ir(int cntl_word);
void put_dr(int data_word);
void check_busy();
void delay(int s);
char code lcd[]={'0','1','2','3','4','5','6','7','8','9'};
void main()
{
int i;
set_lcd();
while(1)
{
cursor_home();
for (i=0;i<10;i++)
{
put_dr(lcd[i]);
delay(10000);
}
}
}
void set_lcd()
{
put_ir(0x30);
put_ir(0x06);
put_ir(0x0e);
}
void cursor_home()
{
put_ir(0x01);
put_ir(0x02);
}
void put_ir(int cntl_word)
{
check_busy();
P1=cntl_word;
P2=0x00;
P2=0x04;
delay(100);
P2=0x00;
}
void put_dr(int data_word)
{
check_busy();
P1=data_word;
P2=0x01;
P2=0x05;
delay(100);
P2=0x01;
}
void check_busy()
{
int busy_flag;
P2=0x02;
P2=0x06;
delay(100);
READ_AGAIN:
busy_flag=P1;
busy_flag&=0x80;
if(busy_flag==0x80)
{
goto READ_AGAIN;
}
else
{
P2=0x02;
}
}
void delay(int s)
{
int m;
for(m=0;m<s;m++);
}
Assembly
========================
ORG 00H
JMP START
ORG 50H
START:
MOV SP,#60H
CALL CLS
CALL INITIAL
MOV A,#41H
CALL WRITE_DATA
MOV A,#42H
CALL WRITE_DATA
LOOP:
JMP LOOP
;+++++++++++++++++++++++++++++++;
;初始設定副程式 ;
;+++++++++++++++++++++++++++++++;
INITIAL:
CALL CHECKBUSY ;顯示歸零;
MOV P2,
#11111000B
SETB P2.2
MOV P1,#02H
CLR P2.2
CALL CHECKBUSY ;顯示致能;
MOV P2,
#11111000B
SETB P2.2
MOV P1,#04H
CLR P2.2
CALL CHECKBUSY ;顯示移位;
MOV P2,
#11111000B
SETB P2.2
MOV P1,
#11111001B
CLR P2.2
CALL CHECKBUSY ;輸入模式;
MOV P2,
#11111000B
SETB P2.2
MOV P1,#07H
CLR P2.2
CALL CHECKBUSY ;功能設定;
MOV P2,
#11111000B
SETB P2.2
MOV P1,#33H
CLR P2.2
RET
;+++++++++++++++++++++++++++++++++;
;CLS副程式 ;
;+++++++++++++++++++++++++++++++++;
CLS:
CALL CHECKBUSY
MOV P2,
#11110001B;RS=0,RW=0;E=0;
SETB P2.2 ;E=1;
MOV P1,#01H
CLR P2.2 ;E=0;
RET
;+++++++++++++++++++++++++++++++++;
;CHECKBUSY副程式 ;
;+++++++++++++++++++++++++++++++++;
CHECKBUSY:
PUSH ACC
CHECKLOOP:
MOV P2,
#11111010B
SETB P2.2
MOV A,P1
CLR P2.2
JB ACC.7,CHECKLOOP
POP ACC
CALL DELAY
RET
;+++++++++++++++++++++++++++++++++;
;DELAY副程式 ;
;+++++++++++++++++++++++++++++++++;
DELAY:
MOV R6,#25
MOV R7,#20
DJNZ R7,$
DJNZ R6,$
RET
;++++++++++++++++++++++++++++++++++++;
;WRITE_DATA副程式 ;
;++++++++++++++++++++++++++++++++++++;
WRITE_DATA:
CALL CHECKBUSY
MOV P2,
#11111001B
SETB P2.2
MOV P1,A
CLR P2.2
RET
END
--
If you're not have fun in baseball,
you miss the point of everything.
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 220.137.65.66