?? z1602.src
字號:
; Z1602.SRC generated from: Z1602.c
$NOMOD51
NAME Z1602
P0 DATA 080H
P1 DATA 090H
P2 DATA 0A0H
P3 DATA 0B0H
T0 BIT 0B0H.4
AC BIT 0D0H.6
T1 BIT 0B0H.5
EA BIT 0A8H.7
IE DATA 0A8H
RD BIT 0B0H.7
ES BIT 0A8H.4
IP DATA 0B8H
RI BIT 098H.0
INT0 BIT 0B0H.2
CY BIT 0D0H.7
TI BIT 098H.1
INT1 BIT 0B0H.3
PS BIT 0B8H.4
SP DATA 081H
OV BIT 0D0H.2
WR BIT 0B0H.6
SBUF DATA 099H
PCON DATA 087H
SCON DATA 098H
TMOD DATA 089H
TCON DATA 088H
IE0 BIT 088H.1
IE1 BIT 088H.3
B DATA 0F0H
ACC DATA 0E0H
ET0 BIT 0A8H.1
ET1 BIT 0A8H.3
TF0 BIT 088H.5
TF1 BIT 088H.7
RB8 BIT 098H.2
TH0 DATA 08CH
EX0 BIT 0A8H.0
IT0 BIT 088H.0
TH1 DATA 08DH
TB8 BIT 098H.3
EX1 BIT 0A8H.2
IT1 BIT 088H.2
P BIT 0D0H.0
SM0 BIT 098H.7
TL0 DATA 08AH
SM1 BIT 098H.6
TL1 DATA 08BH
SM2 BIT 098H.5
PT0 BIT 0B8H.1
PT1 BIT 0B8H.3
RS0 BIT 0D0H.3
TR0 BIT 088H.4
RS1 BIT 0D0H.4
TR1 BIT 088H.6
PX0 BIT 0B8H.0
PX1 BIT 0B8H.2
DPH DATA 083H
DPL DATA 082H
REN BIT 098H.4
RXD BIT 0B0H.0
TXD BIT 0B0H.1
F0 BIT 0D0H.5
PSW DATA 0D0H
?PR?main?Z1602 SEGMENT CODE
?DT?main?Z1602 SEGMENT DATA OVERLAYABLE
?PR?_ePutstr?Z1602 SEGMENT CODE
?DT?_ePutstr?Z1602 SEGMENT DATA OVERLAYABLE
?PR?_Display?Z1602 SEGMENT CODE
?DT?_Display?Z1602 SEGMENT DATA OVERLAYABLE
?PR?_LocateXY?Z1602 SEGMENT CODE
?PR?_DispOneChar?Z1602 SEGMENT CODE
?DT?_DispOneChar?Z1602 SEGMENT DATA OVERLAYABLE
?PR?LcdReset?Z1602 SEGMENT CODE
?PR?_LcdWriteCommand?Z1602 SEGMENT CODE
?PR?_LcdWriteData?Z1602 SEGMENT CODE
?PR?Delay5Ms?Z1602 SEGMENT CODE
?PR?Delay400Ms?Z1602 SEGMENT CODE
?CO?Z1602 SEGMENT CODE
EXTRN CODE (?C_STARTUP)
PUBLIC Lcd1602WdataPort
PUBLIC Lcd1602CmdPort
PUBLIC Lcd1602StatusPort
PUBLIC exampl
PUBLIC Delay400Ms
PUBLIC Delay5Ms
PUBLIC _LcdWriteData
PUBLIC _LcdWriteCommand
PUBLIC LcdReset
PUBLIC _DispOneChar
PUBLIC _LocateXY
PUBLIC _Display
PUBLIC _ePutstr
PUBLIC main
XSEG AT 07DFFH
Lcd1602StatusPort: DS 1
XSEG AT 07CFFH
Lcd1602CmdPort: DS 1
XSEG AT 07EFFH
Lcd1602WdataPort: DS 1
RSEG ?DT?_DispOneChar?Z1602
?_DispOneChar?BYTE:
Wdata?453: DS 1
RSEG ?DT?main?Z1602
?main?BYTE:
temp?040: DS 1
RSEG ?DT?_Display?Z1602
?_Display?BYTE:
dd?246: DS 1
ORG 1
i?247: DS 1
RSEG ?DT?_ePutstr?Z1602
?_ePutstr?BYTE:
x?141: DS 1
y?142: DS 1
ptr?143: DS 2
ORG 4
i?144: DS 1
l?145: DS 1
RSEG ?CO?Z1602
exampl:
DB 'F' ,'o' ,'r' ,' ' ,'a' ,'n' ,' ' ,'e' ,'x' ,'a'
DB 'm' ,'p' ,'l' ,'e' ,'.' ,' ' ,' ' ,' ' ,' ' ,' '
DB '-' ,' ' ,'B' ,'y' ,' ' ,'x' ,'i' ,'a' ,'o' ,'q'
DB 'i' ,00AH,000H
; /*===========================================================================
;
; KS0070(44780) 16x2 字符液晶屏驅動演示程序總線方式 曉奇
; =============================================================================
; 連接線圖: LCM-------51 LCM-------51 LCM--------51
; DB0-----P0.0 DB4-----P0.4 RW-------P2.0
; DB1-----P0.1 DB5-----P0.5 RC-------P2.1
; DB2-----P0.2 DB6-----P0.6 E--------P2.7 =>74ls00+wr+rd
; DB3-----P0.3 DB7-----P0.7 VLCD接1K2電阻到GND
;
; [注]:AT89C51的晶振頻率為12MHz
; ============================================================================*/
; #pragma src // 產生匯編文件
; #include <reg51.h>
; #include<intrins.h>
;
; //========= 變量類型標識的宏定義,大家都喜歡這么做 ==============
; #define Uchar unsigned char
; #define Uint unsigned int
;
; // ================= LCM1602A端口地址定義 =======================
; char xdata Lcd1602CmdPort _at_ 0x7cff; //E=1 RS=0 RW=0
; char xdata Lcd1602WdataPort _at_ 0x7eff; //E =1 RS=1 RW=0
; char xdata Lcd1602StatusPort _at_ 0x7dff; //CS=1 RS=0 RW=1
;
; #define Busy 0x80 // 忙判別位
;
;
; code char exampl[]="For an example. - By xiaoqi\n";
;
; void Delay400Ms(void);
; void Delay5Ms(void);
; void LcdWriteData( char dataW );
; void LcdWriteCommand( Uchar CMD,Uchar AttribC );
; void LcdReset( void );
; void Display( Uchar dd );
; void DispOneChar(Uchar x,Uchar y,Uchar Wdata);
; void ePutstr(Uchar x,Uchar y, Uchar code *ptr);
;
; //================ 隨便寫幾句測試主程序 ================
; void main(void)
RSEG ?PR?main?Z1602
main:
USING 0
; SOURCE LINE # 41
; {
; SOURCE LINE # 42
; Uchar temp;
;
; Delay400Ms(); // 啟動時必須的延時,等待lcm進入工作狀態
; SOURCE LINE # 45
LCALL Delay400Ms
;
; LcdReset(); // 這也是必需的....初始化
; SOURCE LINE # 47
LCALL LcdReset
; temp = 32;
; SOURCE LINE # 48
MOV temp?040,#020H
; ePutstr(0,0,exampl); // 上面一行顯示一個預定字符串
; SOURCE LINE # 49
MOV R2,#HIGH (exampl)
MOV R3,#LOW (exampl)
CLR A
MOV R5,A
MOV R7,A
LCALL _ePutstr
;
; Delay400Ms(); // 保留顯示內容
; SOURCE LINE # 51
LCALL Delay400Ms
; Delay400Ms();
; SOURCE LINE # 52
LCALL Delay400Ms
; Delay400Ms();
; SOURCE LINE # 53
LCALL Delay400Ms
; Delay400Ms();
; SOURCE LINE # 54
LCALL Delay400Ms
; Delay400Ms();
; SOURCE LINE # 55
LCALL Delay400Ms
; Delay400Ms();
; SOURCE LINE # 56
LCALL Delay400Ms
; Delay400Ms();
; SOURCE LINE # 57
LCALL Delay400Ms
; Delay400Ms();
; SOURCE LINE # 58
LCALL Delay400Ms
?C0001:
;
; while(1)
; SOURCE LINE # 60
; {
; SOURCE LINE # 61
; temp &= 0x7f; // 只顯示ASCII字符
; SOURCE LINE # 62
ANL temp?040,#07FH
;
; if (temp<32)temp=32; // 屏蔽控制字符,不予顯示
; SOURCE LINE # 64
MOV A,temp?040
CLR C
SUBB A,#020H
JNC ?C0003
MOV temp?040,#020H
?C0003:
; Display( temp++ );
; SOURCE LINE # 65
MOV R7,temp?040
INC temp?040
LCALL _Display
;
; Delay400Ms();
; SOURCE LINE # 67
LCALL Delay400Ms
; }
; SOURCE LINE # 68
SJMP ?C0001
; END OF main
; }
;
; /*=======================================================
; 顯示字符串
; =======================================================*/
; void ePutstr(Uchar x,Uchar y, Uchar code *ptr) {
RSEG ?PR?_ePutstr?Z1602
_ePutstr:
USING 0
; SOURCE LINE # 74
MOV x?141,R7
MOV y?142,R5
MOV ptr?143,R2
MOV ptr?143+01H,R3
; Uchar i,l=0;
; SOURCE LINE # 75
CLR A
MOV l?145,A
?C0005:
; while (ptr[l] >31){l++;};
; SOURCE LINE # 76
MOV A,ptr?143+01H
ADD A,l?145
MOV DPL,A
CLR A
ADDC A,ptr?143
MOV DPH,A
CLR A
MOVC A,@A+DPTR
SETB C
SUBB A,#01FH
JC ?C0006
INC l?145
SJMP ?C0005
?C0006:
; for (i=0;i<l;i++) {
; SOURCE LINE # 77
CLR A
MOV i?144,A
?C0007:
MOV A,i?144
CLR C
SUBB A,l?145
JNC ?C0011
; DispOneChar(x++,y,ptr[i]);
; SOURCE LINE # 78
MOV R7,x?141
INC x?141
MOV A,ptr?143+01H
ADD A,i?144
MOV DPL,A
CLR A
ADDC A,ptr?143
MOV DPH,A
CLR A
MOVC A,@A+DPTR
MOV R3,A
MOV R5,y?142
LCALL _DispOneChar
; if ( x == 16 ){
; SOURCE LINE # 79
MOV A,x?141
CJNE A,#010H,?C0009
; x = 0; y ^= 1;
; SOURCE LINE # 80
CLR A
MOV x?141,A
XRL y?142,#01H
; }
; SOURCE LINE # 81
; }
; SOURCE LINE # 82
?C0009:
INC i?144
SJMP ?C0007
; }
; SOURCE LINE # 83
?C0011:
RET
; END OF _ePutstr
;
; /*=======================================================
; 演示一行連續字符串,配合上位程序演示移動字串
; =======================================================*/
; void Display( Uchar dd ) {
RSEG ?PR?_Display?Z1602
_Display:
USING 0
; SOURCE LINE # 88
MOV dd?246,R7
;
; Uchar i;
;
; for (i=0;i<16;i++) {
; SOURCE LINE # 92
CLR A
MOV i?247,A
?C0012:
;
; DispOneChar(i,1,dd++);
; SOURCE LINE # 94
MOV R3,dd?246
INC dd?246
MOV R5,#01H
MOV R7,i?247
LCALL _DispOneChar
;
; dd &= 0x7f;
; SOURCE LINE # 96
ANL dd?246,#07FH
; if (dd<32) dd=32;
; SOURCE LINE # 97
MOV A,dd?246
CLR C
SUBB A,#020H
JNC ?C0014
MOV dd?246,#020H
; }
; SOURCE LINE # 98
?C0014:
INC i?247
MOV A,i?247
CLR C
SUBB A,#010H
JC ?C0012
; }
; SOURCE LINE # 99
?C0016:
RET
; END OF _Display
;
; /*=======================================================
; 顯示光標定位
; =======================================================*/
; void LocateXY( char posx,char posy) {
RSEG ?PR?_LocateXY?Z1602
_LocateXY:
USING 0
; SOURCE LINE # 104
;---- Variable 'posy?349' assigned to Register 'R5' ----
;---- Variable 'posx?348' assigned to Register 'R7' ----
;
; Uchar temp;
;
; temp = posx & 0xf;
; SOURCE LINE # 108
MOV A,R7
ANL A,#0FH
MOV R7,A
;---- Variable 'temp?350' assigned to Register 'R7' ----
; posy &= 0x1;
; SOURCE LINE # 109
ANL AR5,#01H
; if ( posy )temp |= 0x40;
; SOURCE LINE # 110
MOV A,R5
JZ ?C0017
ORL AR7,#040H
?C0017:
; temp |= 0x80;
; SOURCE LINE # 111
ORL AR7,#080H
; LcdWriteCommand(temp,0);
; SOURCE LINE # 112
CLR A
MOV R5,A
LJMP _LcdWriteCommand
; END OF _LocateXY
; }
;
; /*=======================================================
; 按指定位置顯示數出一個字符
; =======================================================*/
; void DispOneChar(Uchar x,Uchar y,Uchar Wdata) {
RSEG ?PR?_DispOneChar?Z1602
_DispOneChar:
USING 0
; SOURCE LINE # 118
MOV Wdata?453,R3
;---- Variable 'y?452' assigned to Register 'R5' ----
;---- Variable 'x?451' assigned to Register 'R7' ----
;
; LocateXY( x, y ); // 定位顯示地址
; SOURCE LINE # 120
LCALL _LocateXY
; LcdWriteData( Wdata ); // 寫字符
; SOURCE LINE # 121
MOV R7,Wdata?453
LJMP _LcdWriteData
; END OF _DispOneChar
; }
;
; /*=======================================================
; 初始化程序, 必須按照產品資料介紹的初始化過程進行
; =======================================================*/
; void LcdReset( void ) {
RSEG ?PR?LcdReset?Z1602
LcdReset:
USING 0
; SOURCE LINE # 127
;
; LcdWriteCommand( 0x38, 0); // 顯示模式設置(不檢測忙信號)
; SOURCE LINE # 129
LCALL L?0038
; Delay5Ms();
; SOURCE LINE # 130
LCALL Delay5Ms
; LcdWriteCommand( 0x38, 0); // 共三次
; SOURCE LINE # 131
LCALL L?0038
; Delay5Ms();
; SOURCE LINE # 132
LCALL Delay5Ms
; LcdWriteCommand( 0x38, 0);
; SOURCE LINE # 133
LCALL L?0039
; Delay5Ms();
; SOURCE LINE # 134
LCALL Delay5Ms
;
; LcdWriteCommand( 0x38, 1); // 顯示模式設置(以后均檢測忙信號)
; SOURCE LINE # 136
MOV R5,#01H
MOV R7,#038H
LCALL _LcdWriteCommand
; LcdWriteCommand( 0x08, 1); // 顯示關閉
; SOURCE LINE # 137
MOV R5,#01H
MOV R7,#08H
LCALL _LcdWriteCommand
; LcdWriteCommand( 0x01, 1); // 顯示清屏
; SOURCE LINE # 138
MOV R5,#01H
MOV R7,#01H
LCALL _LcdWriteCommand
; LcdWriteCommand( 0x06, 1); // 顯示光標移動設置
; SOURCE LINE # 139
MOV R5,#01H
MOV R7,#06H
LCALL _LcdWriteCommand
; LcdWriteCommand( 0x0c, 1); // 顯示開及光標設置
; SOURCE LINE # 140
MOV R5,#01H
MOV R7,#0CH
LJMP _LcdWriteCommand
; END OF LcdReset
; }
;
; /*=======================================================
; 寫控制字符子程序: E=1 RS=0 RW=0
; =======================================================*/
; void LcdWriteCommand( Uchar CMD,Uchar AttribC ) {
RSEG ?PR?_LcdWriteCommand?Z1602
L?0038:
USING 0
L?0039:
CLR A
MOV R5,A
MOV R7,#038H
_LcdWriteCommand:
; SOURCE LINE # 146
;---- Variable 'AttribC?655' assigned to Register 'R5' ----
;---- Variable 'CMD?654' assigned to Register 'R7' ----
;
; if (AttribC) while( Lcd1602StatusPort & Busy ); // 檢測忙信號?
; SOURCE LINE # 148
MOV A,R5
JZ ?C0021
?C0022:
MOV DPTR,#Lcd1602StatusPort
MOVX A,@DPTR
JB ACC.7,?C0022
?C0021:
; Lcd1602CmdPort = CMD;
; SOURCE LINE # 149
MOV DPTR,#Lcd1602CmdPort
MOV A,R7
MOVX @DPTR,A
; }
; SOURCE LINE # 150
RET
; END OF _LcdWriteCommand
;
; /*=======================================================
; 當前位置寫字符子程序: E =1 RS=1 RW=0
; =======================================================*/
; void LcdWriteData( char dataW ) {
RSEG ?PR?_LcdWriteData?Z1602
_LcdWriteData:
; SOURCE LINE # 155
;---- Variable 'dataW?756' assigned to Register 'R7' ----
?C0025:
;
; while( Lcd1602StatusPort & Busy ); // 檢測忙信號
; SOURCE LINE # 157
MOV DPTR,#Lcd1602StatusPort
MOVX A,@DPTR
JB ACC.7,?C0025
?C0026:
; Lcd1602WdataPort = dataW;
; SOURCE LINE # 158
MOV DPTR,#Lcd1602WdataPort
MOV A,R7
MOVX @DPTR,A
; }
; SOURCE LINE # 159
RET
; END OF _LcdWriteData
;
; // 短延時
; void Delay5Ms(void)
RSEG ?PR?Delay5Ms?Z1602
Delay5Ms:
USING 0
; SOURCE LINE # 162
; {
; SOURCE LINE # 163
; Uint i = 5552;
; SOURCE LINE # 164
;---- Variable 'i?857' assigned to Register 'R6/R7' ----
MOV R7,#0B0H
MOV R6,#015H
?C0028:
; while(i--);
; SOURCE LINE # 165
MOV A,R7
DEC R7
MOV R4,AR6
JNZ ?C0036
DEC R6
?C0036:
ORL A,R4
JNZ ?C0028
; }
; SOURCE LINE # 166
?C0030:
RET
; END OF Delay5Ms
;
; //長延時
; void Delay400Ms(void)
RSEG ?PR?Delay400Ms?Z1602
Delay400Ms:
USING 0
; SOURCE LINE # 169
;---- Variable 'j?959' assigned to Register 'R6/R7' ----
;---- Variable 'i?958' assigned to Register 'R5' ----
; {
; SOURCE LINE # 170
; Uchar i = 5;
; SOURCE LINE # 171
MOV R5,#05H
?C0031:
; Uint j;
; while(i--)
; SOURCE LINE # 173
MOV R4,AR5
DEC R5
MOV A,R4
JZ ?C0035
; {
; SOURCE LINE # 174
; j=7269;
; SOURCE LINE # 175
MOV R6,#01CH
MOV R7,#065H
?C0033:
; while(j--);
; SOURCE LINE # 176
MOV A,R7
DEC R7
MOV R2,AR6
JNZ ?C0037
DEC R6
?C0037:
ORL A,R2
JZ ?C0031
SJMP ?C0033
; };
; SOURCE LINE # 177
; }
; SOURCE LINE # 178
?C0035:
RET
; END OF Delay400Ms
END
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -