⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ledshow.s

📁 飞思卡尔的电子钟和电子琴的课程设计,包括源代码
💻 S
字号:
	.module ledshow.c
	.area text
;              i -> 0,X
;            str -> 3,X
_lcdshow::
	ais #-1
	tsx
; /*文件描述:本文件包含了用HD44780显示相关的3个子程序    *
; *         1. LCDShow:在LCD上显示32个字符               *
; *         2. LcdInit:初始化Lcd                         *
; *         3. Lcd_Command:执行给定的cmd命令             *
; *-------------《嵌入式应用技术基础教程》--------------*/
; //[以下为子程序源代码]
; //[头文件]
; #include "GP32C.h"         //包含头文件
; #include "clock.h"
; //内部调用子程序
; /*LcdShow:在HD44780显示屏上显示数据--------------------*
; *功能描述:在HD44780显示屏上显示str中的32个数据         *
; *参  数:str:待显示数组;以e标志结束                                 *
; *返  回:无                                             *
; *------------------以上为子程序说明-------------------*/
; void lcdshow(unsigned char str[])
;   {	 	
;     unsigned char i=0;             
	clr ,X
;     //调用Lcd初始化子程序
;  	//显示第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
	bra L3
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
	inc ,X
L3:
;    	while(str[i]!='E'&&i<16)       //逐个显示
	clr *__r0
	lda ,X
	add 4,X
	sta *__r1
	lda *__r0
	adc 3,X
	sta *__r0
	ldhx *__r0
	lda ,x
	tsx
	cmp #69
	beq L5
	lda ,X
	cmp #16
	blo L2
L5:
;        {Lcd_Command(str[i]);i++;}
;     if(str[i]=='E')i++;
	clr *__r0
	lda ,X
	add 4,X
	sta *__r1
	lda *__r0
	adc 3,X
	sta *__r0
	ldhx *__r0
	lda ,x
	tsx
	cmp #69
	bne L6
	inc ,X
L6:
;     //显示第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
	bra L9
L8:
	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
	inc ,X
L9:
;     while(str[i]!='E'&&i<32)       //逐个显示
	clr *__r0
	lda ,X
	add 4,X
	sta *__r1
	lda *__r0
	adc 3,X
	sta *__r0
	ldhx *__r0
	lda ,x
	tsx
	cmp #69
	beq L11
	lda ,X
	cmp #32
	blo L8
L11:
L1:
	ais #1
	.dbline 0 ; func end
	rts
;              i -> 0,X
;             AC -> 4,X
;            str -> 3,X
_lcdshow1::
	ais #-1
	tsx
;        {Lcd_Command(str[i]);i++;}
;    }
;    
; void lcdshow1(unsigned char str,unsigned char AC)
;   {	
;      unsigned char i;
;   	AC|=0b10000000; 	
	lda 4,X
	ora #-128
	sta 4,X
;     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(AC);          //后7位为DDRAM地址
	psha
	jsr _Lcd_Command
	ais #1
	tsx
	clr ,X
	bra L16
L13:
L14:
	inc ,X
L16:
;   	    for(i=0;i<250;i++);       //延时>1.6ms
	lda ,X
	cmp #-6
	blo L13
	clr ,X
	bra L20
L17:
L18:
	inc ,X
L20:
;     for(i=0;i<250;i++);
	lda ,X
	cmp #-6
	blo L17
;     LcdCtrl|=(1<<LcdE);       //E=1
	bset #2,0x2
; 	LcdCtrl|=1<<LcdRS;		 //RS、R/W=10,写数据到DDRAM中
	bset #0,0x2
;     LcdCtrl&=~(1<<LcdRW);
	bclr #1,0x2
;     Lcd_Command(str);
	lda 3,X
	psha
	jsr _Lcd_Command
	ais #1
	tsx
;     
;         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(AC);
	lda 4,X
	psha
	jsr _Lcd_Command
	ais #1
	tsx
L12:
	ais #1
	.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
;   }
;   
;   
; /*LcdInit:设时间时初始化Lcd------------------------------------*
; *功  能:初始化Lcd(HD44780),设置显示方式,清屏,AC自动+1  *
; *参  数:无                                             *
; *返  回:无                                             *
; *-----------------------------------------------------*/
;   
; /*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
_shilf::
;   }
; 
; void shilf(void){
; 	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(0b00010000);  //开显示,光标显示,闪烁
	lda #16
	psha
	jsr _Lcd_Command
	ais #1
	tsx
L39:
	.dbline 0 ; func end
	rts

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -