📄 lcdshow.s
字号:
.module lcdshow.c
.area data
_flat::
.blkb 1
.area idata
.byte 0
.area data
.area text
; i -> 0,X
; str -> 3,X
_lcdshow2::
ais #-1
tsx
; /*文件描述:本文件包含了用HD44780显示相关的3个子程序 *
; * 1. LCDShow:在LCD上显示32个字符 *
; * 2. LcdInit:初始化Lcd *
; * 3. Lcd_Command:执行给定的cmd命令 *
; *-------------《嵌入式应用技术基础教程》--------------*/
; //[以下为子程序源代码]
; //[头文件]
; #include "GP32C.h" //包含头文件
; #define LcdData PTB //Lcd显示数据传送口
; #define LcdData_D DDRB //数据口方向寄存器
; #define LcdCtrl PTC //Lcd控制信号传送口
; #define LcdCtrl_D DDRC //控制口方向寄存器
; #define LcdRS 0 //Lcd寄存器选择信号PTC0
; #define LcdRW 1 //读写信号接PTC1
; #define LcdE 2 //Lcd使能信号接PTC2
; //内部调用子程序
; void Lcd_Command(unsigned char cmd); //命令执行子程序
; void LcdInit(void); //Lcd初始化子程序
; unsigned char flat=0;
; extern unsigned char clockstr[8]; /*时间显示的LCD显示*/
; extern unsigned char alartstr[5]; /*闹钟显示的LCD显示*/
; extern unsigned char datestr[10]; /*日期显示LCD显示*/
; unsigned char data[3];time[3];
; /*LcdShow:在HD44780显示屏上显示数据--------------------*
; *功能描述:在HD44780显示屏上显示str中的32个数据 *
; *参 数:str:待显示数组 *
; *返 回:无 *
; *------------------以上为子程序说明-------------------*/
; void lcdshow2(unsigned char str[])
; {
; unsigned char i;
; LcdInit(); //调用Lcd初始化子程序
jsr _LcdInit
; //显示第1行16个字符
; LcdCtrl&=~(1<<LcdRS); //RS、R/W=00,写指令
bclr #0,0x2
; LcdCtrl&=~(1<<LcdRW);
bclr #1,0x2
; Lcd_Command(0b10000000); //后7位为DDRAM地址0x00
lda #-128
psha
jsr _Lcd_Command
ais #1
tsx
; LcdCtrl|=1<<LcdRS; //RS、R/W=10,写数据到DDRAM中
bset #0,0x2
; LcdCtrl&=~(1<<LcdRW);
bclr #1,0x2
; for (i=0;i<16;i++) //逐个显示
clr ,X
bra L5
L2:
clr *__r0
lda ,X
add 4,X
sta *__r1
lda *__r0
adc 3,X
sta *__r0
ldhx *__r0
lda ,x
psha
jsr _Lcd_Command
ais #1
tsx
L3:
inc ,X
L5:
lda ,X
cmp #16
blo L2
; Lcd_Command(str[i]);
; //显示第2行16个字符
; LcdCtrl&=~(1<<LcdRS); //RS、R/W=00,写指令
bclr #0,0x2
; LcdCtrl&=~(1<<LcdRW);
bclr #1,0x2
; Lcd_Command(0b11000000); //后7位为DDRAM地址0x40
lda #-64
psha
jsr _Lcd_Command
ais #1
tsx
; LcdCtrl|=1<<LcdRS; //RS、R/W=10,写数据到DDRAM中
bset #0,0x2
; LcdCtrl&=~(1<<LcdRW);
bclr #1,0x2
; for (i=16;i<32;i++) //逐个显示
lda #16
sta ,X
bra L9
L6:
clr *__r0
lda ,X
add 4,X
sta *__r1
lda *__r0
adc 3,X
sta *__r0
ldhx *__r0
lda ,x
psha
jsr _Lcd_Command
ais #1
tsx
L7:
inc ,X
L9:
lda ,X
cmp #32
blo L6
L1:
ais #1
.dbline 0 ; func end
rts
; i -> 0,X
; strl2 -> 5,X
; strl1 -> 3,X
_lcdshow::
ais #-1
tsx
; Lcd_Command(str[i]);
; }
; void lcdshow(unsigned char strl1[],unsigned char strl2[])
; {
; unsigned char i;
; LcdInit(); //调用Lcd初始化子程序
jsr _LcdInit
; //显示第1行16个字符
; LcdCtrl&=~(1<<LcdRS); //RS、R/W=00,写指令
bclr #0,0x2
; LcdCtrl&=~(1<<LcdRW);
bclr #1,0x2
; Lcd_Command(0b10000011); //后7位为DDRAM地址0x03
lda #-125
psha
jsr _Lcd_Command
ais #1
tsx
; LcdCtrl|=1<<LcdRS; //RS、R/W=10,写数据到DDRAM中
bset #0,0x2
; LcdCtrl&=~(1<<LcdRW);
bclr #1,0x2
; for (i=0;i<16;i++) //逐个显示
clr ,X
bra L14
L11:
clr *__r0
lda ,X
add 4,X
sta *__r1
lda *__r0
adc 3,X
sta *__r0
ldhx *__r0
lda ,x
psha
jsr _Lcd_Command
ais #1
tsx
L12:
inc ,X
L14:
lda ,X
cmp #16
blo L11
; Lcd_Command(strl1[i]);
; //显示第2行16个字符
; LcdCtrl&=~(1<<LcdRS); //RS、R/W=00,写指令
bclr #0,0x2
; LcdCtrl&=~(1<<LcdRW);
bclr #1,0x2
; Lcd_Command(0b11000100); //后7位为DDRAM地址0x44
lda #-60
psha
jsr _Lcd_Command
ais #1
tsx
; LcdCtrl|=1<<LcdRS; //RS、R/W=10,写数据到DDRAM中
bset #0,0x2
; LcdCtrl&=~(1<<LcdRW);
bclr #1,0x2
; for (i=16;i<32;i++) //逐个显示
lda #16
sta ,X
bra L18
L15:
clr *__r0
lda ,X
add 6,X
sta *__r1
lda *__r0
adc 5,X
sta *__r0
ldhx *__r0
lda ,x
psha
jsr _Lcd_Command
ais #1
tsx
L16:
inc ,X
L18:
lda ,X
cmp #32
blo L15
L10:
ais #1
.dbline 0 ; func end
rts
; i -> 0,X
; data -> 5,X
; y -> 4,X
; x -> 3,X
_lcdshow1::
ais #-1
tsx
; Lcd_Command(strl2[i]);
; }
;
; void lcdshow1(unsigned char x,unsigned char y,unsigned char data)
; {
; unsigned char i;
; LcdCtrl&=~(1<<LcdRS); //RS、R/W=00,写指令
bclr #0,0x2
; LcdCtrl&=~(1<<LcdRW);
bclr #1,0x2
; Lcd_Command(0b10000000|(x*0x40+y)); //DDRAM地址
lda 3,X
nsa
and #-16
lsla
lsla
add 4,X
ora #-128
psha
jsr _Lcd_Command
ais #1
tsx
; LcdCtrl|=1<<LcdRS; //RS、R/W=10,写数据到DDRAM中
bset #0,0x2
; LcdCtrl&=~(1<<LcdRW);
bclr #1,0x2
; Lcd_Command(data);
lda 5,X
psha
jsr _Lcd_Command
ais #1
tsx
L19:
ais #1
.dbline 0 ; func end
rts
; y -> 3,X
; x -> 2,X
_guangbiao::
tsx
; }
;
; void guangbiao(unsigned char x,unsigned char y)
; {
; LcdCtrl&=~(1<<LcdRS); //RS、R/W=00,写指令
bclr #0,0x2
; LcdCtrl&=~(1<<LcdRW);
bclr #1,0x2
; Lcd_Command(0b10000000|(x*0x40+y)); //DDRAM地址 0x03
lda 2,X
nsa
and #-16
lsla
lsla
add 3,X
ora #-128
psha
jsr _Lcd_Command
ais #1
; Lcd_Command(0b00001111);
lda #15
psha
jsr _Lcd_Command
ais #1
tsx
L20:
.dbline 0 ; func end
rts
; i -> 0,X
_LcdInit::
ais #-1
tsx
;
; }
;
; /*LcdInit:初始化Lcd------------------------------------*
; *功 能:初始化Lcd(HD44780),设置显示方式,清屏,AC自动+1 *
; *参 数:无 *
; *返 回:无 *
; *-----------------------------------------------------*/
;
; void LcdInit(void)
; {
; unsigned char i;
; LcdData_D=0b11111111; //数据口为输出
lda #-1
sta 0x5
; LcdCtrl_D|=(1<<LcdE); //控制口低三位为输出
bset #2,0x6
; LcdCtrl_D|=(1<<LcdRS);
bset #0,0x6
; LcdCtrl_D|=(1<<LcdRW);
bset #1,0x6
; LcdCtrl|=(1<<LcdE); //E=1
bset #2,0x2
; LcdCtrl&=~(1<<LcdRS); //RS、R/W=00,写指令
bclr #0,0x2
; LcdCtrl&=~(1<<LcdRW);
bclr #1,0x2
; Lcd_Command(0b00111000); //8位数据接口,2行,5*7点阵
lda #56
psha
jsr _Lcd_Command
ais #1
; Lcd_Command(0b00001000); //关显示,关光标显示,不闪烁
lda #8
psha
jsr _Lcd_Command
ais #1
; Lcd_Command(0b00000001); //清屏
lda #1
psha
jsr _Lcd_Command
ais #1
tsx
clr ,X
bra L25
L22:
L23:
inc ,X
L25:
; for(i=0;i<250;i++); //延时>1.6ms
lda ,X
cmp #-6
blo L22
clr ,X
bra L29
L26:
L27:
inc ,X
L29:
; for(i=0;i<250;i++);
lda ,X
cmp #-6
blo L26
; Lcd_Command(0b00010100); //光标右移一个字符位,AC自
lda #20
psha
jsr _Lcd_Command
ais #1
; // 动加1 (是否错误?)
; Lcd_Command(0b00001100); //开显示,关光标显示,不闪烁
lda #12
psha
jsr _Lcd_Command
ais #1
tsx
L21:
ais #1
.dbline 0 ; func end
rts
; i -> 0,X
; cmd -> 3,X
_Lcd_Command::
ais #-1
tsx
; }
; /*Lcd_Command:执行给定的cmd命令------------------------*
; *功 能:执行给定的cmd命令,且延时 *
; *参 数:cmd:待执行的命令 *
; *返 回:无 *
; *-----------------------------------------------------*/
; void Lcd_Command(unsigned char cmd)
; {
clr ,X
bra L34
L31:
L32:
inc ,X
L34:
; unsigned char i;
; for (i=0;i<20;i++); //等待>40us
lda ,X
cmp #20
blo L31
; LcdData=cmd; //把指令码送到Lcd数据传送口
lda 3,X
sta 0x1
; LcdCtrl|=(1<<LcdE); //Lcd开始接收数据
bset #2,0x2
; asm("NOP");
NOP
; asm("NOP");
NOP
; asm("NOP");
NOP
; LcdCtrl&=~(1<<LcdE); //Lcd结束接收数据
bclr #2,0x2
clr ,X
bra L38
L35:
L36:
inc ,X
L38:
; for (i=0;i<20;i++); //等待>40us
lda ,X
cmp #20
blo L35
L30:
ais #1
.dbline 0 ; func end
rts
_left::
; }
;
;
;
; void left(void) ////进入左移时间模式
; {
;
; if(flat>10)
lda *_flat
cmp #10
bls L40
; {
; flat--;
dec *_flat
; LcdCtrl&=~(1<<LcdRS); //RS、R/W=00,写指令
bclr #0,0x2
; LcdCtrl&=~(1<<LcdRW);
bclr #1,0x2
; Lcd_Command(0b00010000); //后7位为DDRAM地址0x10
lda #16
psha
jsr _Lcd_Command
ais #1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -