?? lcdshow.lis
字號:
.module lcdshow.c
.area text
; i -> 0,X
; str -> 3,X
0000 _lcdshow::
0000 A7FF ais #-1
0002 95 tsx
0003 ; /*文件描述:本文件包含了用HD44780顯示相關的3個子程序 *
0003 ; * 1. LCDShow:在LCD上顯示32個字符 *
0003 ; * 2. LcdInit:初始化Lcd *
0003 ; * 3. Lcd_Command:執行給定的cmd命令 *
0003 ; *-------------《嵌入式應用技術基礎教程》--------------*/
0003 ; //[以下為子程序源代碼]
0003 ; //[頭文件]
0003 ; #include "GP32C.h" //包含頭文件
0003 ; #define LcdData PTB //Lcd顯示數據傳送口
0003 ; #define LcdData_D DDRB //數據口方向寄存器
0003 ; #define LcdCtrl PTC //Lcd控制信號傳送口
0003 ; #define LcdCtrl_D DDRC //控制口方向寄存器
0003 ; #define LcdRS 0 //Lcd寄存器選擇信號PTC0
0003 ; #define LcdRW 1 //讀寫信號接PTC1
0003 ; #define LcdE 2 //Lcd使能信號接PTC2
0003 ; //內部調用子程序
0003 ; void Lcd_Command(unsigned char cmd); //命令執行子程序
0003 ; void LcdInit(void); //Lcd初始化子程序
0003 ; /*LcdShow:在HD44780顯示屏上顯示數據--------------------*
0003 ; *功能描述:在HD44780顯示屏上顯示str中的32個數據 *
0003 ; *參 數:str:待顯示數組 *
0003 ; *返 回:無 *
0003 ; *------------------以上為子程序說明-------------------*/
0003 ; void lcdshow(unsigned char str[])
0003 ; {
0003 ; unsigned char i;
0003 ; LcdInit(); //調用Lcd初始化子程序
0003 CD006D jsr _LcdInit
0006 ; //顯示第1行16個字符
0006 ; LcdCtrl&=~(1<<LcdRS); //RS、R/W=00,寫指令
0006 1102 bclr #0,0x2
0008 ; LcdCtrl&=~(1<<LcdRW);
0008 1302 bclr #1,0x2
000A ; Lcd_Command(0b10000000); //后7位為DDRAM地址0x00
000A A680 lda #-128
000C 87 psha
000D CD00B3 jsr _Lcd_Command
0010 A701 ais #1
0012 95 tsx
0013 ; LcdCtrl|=1<<LcdRS; //RS、R/W=10,寫數據到DDRAM中
0013 1002 bset #0,0x2
0015 ; LcdCtrl&=~(1<<LcdRW);
0015 1302 bclr #1,0x2
0017 ; for (i=0;i<16;i++) //逐個顯示
0017 7F clr ,X
0018 2018 bra L5
001A L2:
001A 3F00 clr *__r0
001C F6 lda ,X
001D EB04 add 4,X
001F B700 sta *__r1
0021 B600 lda *__r0
0023 E903 adc 3,X
0025 B700 sta *__r0
0027 5500 ldhx *__r0
0029 F6 lda ,x
002A 87 psha
002B CD00B3 jsr _Lcd_Command
002E A701 ais #1
0030 95 tsx
0031 L3:
0031 7C inc ,X
0032 L5:
0032 F6 lda ,X
0033 A110 cmp #16
0035 25E3 blo L2
0037 ; Lcd_Command(str[i]);
0037 ; //顯示第2行16個字符
0037 ; LcdCtrl&=~(1<<LcdRS); //RS、R/W=00,寫指令
0037 1102 bclr #0,0x2
0039 ; LcdCtrl&=~(1<<LcdRW);
0039 1302 bclr #1,0x2
003B ; Lcd_Command(0b11000000); //后7位為DDRAM地址0x40
003B A6C0 lda #-64
003D 87 psha
003E CD00B3 jsr _Lcd_Command
0041 A701 ais #1
0043 95 tsx
0044 ; LcdCtrl|=1<<LcdRS; //RS、R/W=10,寫數據到DDRAM中
0044 1002 bset #0,0x2
0046 ; LcdCtrl&=~(1<<LcdRW);
0046 1302 bclr #1,0x2
0048 ; for (i=16;i<32;i++) //逐個顯示
0048 A610 lda #16
004A F7 sta ,X
004B 2018 bra L9
004D L6:
004D 3F00 clr *__r0
004F F6 lda ,X
0050 EB04 add 4,X
0052 B700 sta *__r1
0054 B600 lda *__r0
0056 E903 adc 3,X
0058 B700 sta *__r0
005A 5500 ldhx *__r0
005C F6 lda ,x
005D 87 psha
005E CD00B3 jsr _Lcd_Command
0061 A701 ais #1
0063 95 tsx
0064 L7:
0064 7C inc ,X
0065 L9:
0065 F6 lda ,X
0066 A120 cmp #32
0068 25E3 blo L6
006A L1:
006A A701 ais #1
006C .dbline 0 ; func end
006C 81 rts
006D ; i -> 0,X
006D ; j -> 1,X
006D _LcdInit::
006D A7FE ais #-2
006F 95 tsx
0070 ; Lcd_Command(str[i]);
0070 ; }
0070 ; /*LcdInit:初始化Lcd------------------------------------*
0070 ; *功 能:初始化Lcd(HD44780),設置顯示方式,清屏,AC自動+1 *
0070 ; *參 數:無 *
0070 ; *返 回:無 *
0070 ; *-----------------------------------------------------*/
0070 ; void LcdInit(void)
0070 ; {
0070 ; unsigned char i,j;
0070 ; LcdData_D=0b11111111; //數據口為輸出
0070 A6FF lda #-1
0072 B705 sta 0x5
0074 ; LcdCtrl_D|=(1<<LcdE); //控制口低三位為輸出
0074 1406 bset #2,0x6
0076 ; LcdCtrl_D|=(1<<LcdRS);
0076 1006 bset #0,0x6
0078 ; LcdCtrl_D|=(1<<LcdRW);
0078 1206 bset #1,0x6
007A ; LcdCtrl|=(1<<LcdE); //E=1
007A 1402 bset #2,0x2
007C ; LcdCtrl&=~(1<<LcdRS); //RS、R/W=00,寫指令
007C 1102 bclr #0,0x2
007E ; LcdCtrl&=~(1<<LcdRW);
007E 1302 bclr #1,0x2
0080 ; Lcd_Command(0b00111000); //8位數據接口,2行,5*7點陣
0080 A638 lda #56
0082 87 psha
0083 CD00B3 jsr _Lcd_Command
0086 A701 ais #1
0088 95 tsx
0089 7F clr ,X
008A 2001 bra L14
008C L11:
008C L12:
008C 7C inc ,X
008D L14:
008D ; //Lcd_Command(0b00001000); //關顯示,關光標顯示,不閃爍
008D ; //Lcd_Command(0b00000001); //清屏
008D ; for(i=0;i<250;i++); //延時>1.6ms
008D F6 lda ,X
008E A1FA cmp #-6
0090 25FA blo L11
0092 ; for(i=0;i<250;i++)
0092 7F clr ,X
0093 200D bra L18
0095 L15:
0095 6F01 clr 1,X
0097 2002 bra L22
0099 L19:
0099 L20:
0099 6C01 inc 1,X
009B L22:
009B E601 lda 1,X
009D A114 cmp #20
009F 25F8 blo L19
00A1 L16:
00A1 7C inc ,X
00A2 L18:
00A2 F6 lda ,X
00A3 A1FA cmp #-6
00A5 25EE blo L15
00A7 ; for(j=0;j<20;j++);
00A7 ; Lcd_Command(0b00010100); //光標右移一個字符位,AC自
00A7 A614 lda #20
00A9 87 psha
00AA CD00B3 jsr _Lcd_Command
00AD A701 ais #1
00AF 95 tsx
00B0 L10:
00B0 A702 ais #2
00B2 .dbline 0 ; func end
00B2 81 rts
00B3 ; i -> 0,X
00B3 ; cmd -> 3,X
00B3 _Lcd_Command::
00B3 A7FF ais #-1
00B5 95 tsx
00B6 ; // 動加1
00B6 ; //Lcd_Command(0b00001100); //開顯示,關光標顯示,不閃爍
00B6 ; }
00B6 ; /*Lcd_Command:執行給定的cmd命令------------------------*
00B6 ; *功 能:執行給定的cmd命令,且延時 *
00B6 ; *參 數:cmd:待執行的命令 *
00B6 ; *返 回:無 *
00B6 ; *-----------------------------------------------------*/
00B6 ; void Lcd_Command(unsigned char cmd)
00B6 ; {
00B6 7F clr ,X
00B7 2001 bra L27
00B9 L24:
00B9 L25:
00B9 7C inc ,X
00BA L27:
00BA ; unsigned char i;
00BA ; for (i=0;i<20;i++); //等待>40us
00BA F6 lda ,X
00BB A114 cmp #20
00BD 25FA blo L24
00BF ; LcdData=cmd; //把指令碼送到Lcd數據傳送口
00BF E603 lda 3,X
00C1 B701 sta 0x1
00C3 ; LcdCtrl|=(1<<LcdE); //Lcd開始接收數據
00C3 1402 bset #2,0x2
00C5 ; asm("NOP");
00C5 9D NOP
00C6 ; asm("NOP");
00C6 9D NOP
00C7 ; asm("NOP");
00C7 9D NOP
00C8 ; LcdCtrl&=~(1<<LcdE); //Lcd結束接收數據
00C8 1502 bclr #2,0x2
00CA 7F clr ,X
00CB 2001 bra L31
00CD L28:
00CD L29:
00CD 7C inc ,X
00CE L31:
00CE ; for (i=0;i<20;i++); //等待>40us
00CE F6 lda ,X
00CF A114 cmp #20
00D1 25FA blo L28
00D3 L23:
00D3 A701 ais #1
00D5 .dbline 0 ; func end
00D5 81 rts
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -