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

📄 lcd.s

📁 项目是为日本瑞萨工作所做的BAKE炉温控系统 整个文件夹包括设计文档
💻 S
📖 第 1 页 / 共 2 页
字号:
	.module lcd.c
	.area text
	.dbfile lcd.c
	.dbfunc e Lcdinit _Lcdinit fV
_Lcdinit::
	.dbline -1
	.dbline 33
; /*-----------------------------------------------------*
; *文件描述:本文件包含了液晶显示相关子程序,分别为:       *  
; *(1)Lcdinit:液晶初始化子程序                           *
; *(2)LcdShCh:在液晶显示屏上显示字符数据                 *
; *(3)LcdShGrRe:在Lcd的指定行上显示或取消矩型边框        *
; *(4)LcdShGrCil:在Lcd上显示或取消空心圆型               *
; *-----------------------------------------------------*/
; 
; //包含头文件 
; #include "gp32c.h"
; #include "lcd.h"
; //定义延时子程序
; #define delay1600us DelayTimes(4000)     //延时>1.6ms
; #define delay72us   DelayTimes(30)	      //延时>72us
; #define delay40ms   DelayTimes(10000)     //延时>40ms
; //内部调用函数声明
; void DelayTimes(unsigned int);         //延时指定时间
; void Wtite_Command(unsigned char);//将控制命令写入Lcd
; void Wtite_Data(unsigned char);       //将数据写入Lcd
; void LcdShGrClr(void);          //在Lcd上清图形显示屏
; //在Lcd指定位置上设置线型16个点的显示
; void LcdShGr16P(unsigned char,unsigned char,int);
; //在Lcd指定位置上画1个点
; void LcdShGr1P(unsigned char,unsigned char);
; 
; //==================[Lcd初始化操作]==========================
; /*Lcdinit:初始化液晶-----------------------------------*
; *功  能:初始化液晶,设置显示方式,清屏、C自动+1         *
; *参  数:无                                             *
; *返  回:无                                             *
; *-----------------------------------------------------*/
; void Lcdinit(void)
; {
	.dbline 34
;     LCD_CtrlPortDDR=0x07;      //控制口低三位设置为输出
	lda #7
	sta 0x6
	.dbline 35
; 	LCD_DataPortDDR=0xff;      //数据口设置为输出
	lda #-1
	sta 0x5
	.dbline 37
; 	//[Lcd初始化]
; 	delay40ms;                 //延时>40ms
	ldhx #10000
	pshx
	pshh
	jsr _DelayTimes
	ais #2
	.dbline 38
;     Wtite_Command(0b00110000); //8位数据,基本指令
	lda #48
	psha
	jsr _Wtite_Command
	ais #1
	.dbline 39
; 	Wtite_Command(0b00001100); //开显示
	lda #12
	psha
	jsr _Wtite_Command
	ais #1
	.dbline 40
;  	Wtite_Command(0b00000001); //清屏
	lda #1
	psha
	jsr _Wtite_Command
	ais #1
	.dbline 41
; 	delay1600us;               //延时>1.6ms
	ldhx #4000
	pshx
	pshh
	jsr _DelayTimes
	ais #2
	.dbline 42
; 	Wtite_Command(0b00000110); //进入模式设定
	lda #6
	psha
	jsr _Wtite_Command
	ais #1
	.dbline 43
;     LcdShGrClr();              //清Lcd图形显示屏
	jsr _LcdShGrClr
	tsx
	.dbline -2
L1:
	.dbline 0 ; func end
	rts
	.dbend
	.dbfunc e LcdShCh _LcdShCh fV
;              i -> 0,X
;       LcdSBuff -> 3,X
_LcdShCh::
	.dbline -1
	ais #-1
	tsx
	.dbline 53
; }
; 
; //==================[Lcd显示字符操作]========================
; /*LcdShCh:在液晶显示屏上显示字符数据-------------------*
; *功  能:在液晶显示屏上显示以LcdSBuff为首地址的64个数据 *
; *参  数:待显示的64个数据的首地址                       *
; *返  回:无                                             *
; *-----------------------------------------------------*/
; void LcdShCh(unsigned char *LcdSBuff)
; {
	.dbline 56
; 	unsigned char i;             //data数组计数器(0-63)
;   //[Lcd显示64个数据]   
;     Wtite_Command(0x80);         //DDRAM地址设置
	lda #-128
	psha
	jsr _Wtite_Command
	ais #1
	tsx
	.dbline 57
; 	for(i=0;i<64;i++)            //显示data中的64个数据
	clr ,X
	bra L6
L3:
	.dbline 58
;  	 { 
	.dbline 60
;  	  //[Lcd按行显示16个数据]
;  	  if((i<=15)||(i>=48))         //第一行和第四行不变
	lda ,X
	cmp #15
	bls L9
	cmp #48
	blo L7
L9:
	.dbline 61
;  	  	Wtite_Data(LcdSBuff[i]);   
	clr *__r0
	lda ,X
	add 4,X
	sta *__r1
	lda *__r0
	adc 3,X
	sta *__r0
	ldhx *__r0
	lda ,x
	psha
	jsr _Wtite_Data
	ais #1
	tsx
	bra L8
L7:
	.dbline 62
;  	  else if(i<=31)       //显示的第二行为缓冲的第三行
	lda ,X
	cmp #31
	bhi L10
	.dbline 63
;  	    Wtite_Data(LcdSBuff[i+16]);
	clr *__r0
	add 4,X
	sta *__r1
	lda *__r0
	adc 3,X
	sta *__r0
	ldhx *__r0
	aix #16
	lda ,x
	psha
	jsr _Wtite_Data
	ais #1
	tsx
	bra L11
L10:
	.dbline 65
;  	  else                 //显示的第三行为缓冲的第二行
;  	    Wtite_Data(LcdSBuff[i-16]);
	clr *__r0
	lda ,X
	sub #16
	sta *__r1
	lda *__r0
	sbc #0
	sta *__r0
	lda *__r1
	add 4,X
	sta *__r1
	lda *__r0
	adc 3,X
	sta *__r0
	ldhx *__r0
	lda ,x
	psha
	jsr _Wtite_Data
	ais #1
	tsx
L11:
L8:
	.dbline 66
L4:
	.dbline 57
	inc ,X
L6:
	.dbline 57
	lda ,X
	cmp #64
	blo L3
	.dbline -2
L2:
	ais #1
	.dbline 0 ; func end
	rts
	.dbsym l i 0 c
	.dbsym l LcdSBuff 3 pc
	.dbend
	.dbfunc e LcdShGrCil _LcdShGrCil fV
;              y -> 0,X
;        mistake -> 1,X
;              x -> 5,X
;            GrE -> 12,X
;        GrCilMV -> 11,X
;             CR -> 10,X
;             Cx -> 9,X
;             Cy -> 8,X
_LcdShGrCil::
	.dbline -1
	ais #-6
	tsx
	.dbline 81
;  	 }        
; }
; 
; //=====[Lcd画图操作:包括画圆,画矩形框,图形清屏,画点等]=====
; /*LcdShGrCil:在Lcd上显示或取消空心圆型-----------------*
; *功  能:在Lcd上的指定位置显示或取消空心圆型            *
; *参  数:Cx为圆心横坐标,Cy为圆心纵坐标                  *
; *       CR为圆的半径,GrE确定图形是否有效               *
; *       GrCilMV为显示圆型时的正误差值                  *
; *       例如:半径为10,误差为4;半径为30,误差为30     *
; *返  回:无                                             *
; *-----------------------------------------------------*/
; void LcdShGrCil(unsigned char Cy,unsigned char Cx,
;                 unsigned char CR,unsigned char 
;                 GrCilMV,unsigned char GrE)
; {
	.dbline 84
;   unsigned char x,y;            //坐标的循环控制变量
;   long int mistake;             //显示时的误差值
;   Wtite_Command(0b00110110);    //扩展指令,绘图开
	lda #54
	psha
	jsr _Wtite_Command
	ais #1
	tsx
	.dbline 85
;   for(y=Cy-CR;y<=Cy+CR;y++)
	lda 8,X
	sub 10,X
	sta ,X
	jmp L16
L13:
	.dbline 86
;       for(x=Cx-CR;x<=Cx+CR;x++)
	lda 9,X
	sub 10,X
	sta 5,X
	jmp L20
L17:
	.dbline 87
; 	     {  
	.dbline 88
; 	      mistake=(x-Cx)*(x-Cx)+(y-Cy)*(y-Cy)-CR*CR;
	clr *__r0
	lda 9,X
	sta *__r1
	clr *__r2
	lda 5,X
	sub *__r1
	sta *__r1
	lda *__r2
	sbc *__r0
	sta *__r0
	clr *__r2
	lda 8,X
	sta *__r3
	clr *__r4
	lda ,X
	sub *__r3
	sta *__r3
	lda *__r4
	sbc *__r2
	sta *__r2
	lda *__r3
	psha
	lda *__r2
	psha
	lda *__r3
	psha
	lda *__r2
	psha
	jsr __mul16
	ais #4
	mov *__rlo,*__r3
	mov *__rhi,*__r2
	lda *__r1
	psha
	lda *__r0
	psha
	lda *__r1
	psha
	lda *__r0
	psha
	jsr __mul16
	ais #4
	mov *__rlo,*__r1
	mov *__rhi,*__r0
	lda *__r1
	add *__r3
	sta *__r1
	lda *__r0
	adc *__r2
	sta *__r0
	clr *__r2
	lda 10,X
	sta *__r3
	clr *__r4
	lda 10,X
	psha
	lda *__r4
	psha
	lda *__r3
	psha
	lda *__r2
	psha
	jsr __mul16
	ais #4
	mov *__rlo,*__r3
	mov *__rhi,*__r2
	lda *__r1
	sub *__r3
	sta *__r1
	lda *__r0
	sbc *__r2
	sta *__r0
	clra
	sta 2,X
	sta 1,X
	lda *__r1
	sta 4,X
	lda *__r0
	sta 3,X
	bpl X0
	com 2,X
	com 1,X
X0:
	.dbline 90
; 	      //误差在范围之内时,显示该点
; 	      if((mistake<=GrCilMV)&&(mistake>=-GrCilMV))
	clr *__r2
	clr *__r1
	clr *__r0
	lda 11,X
	sta *__r3
	lda 4,X
	psha
	lda 3,X
	psha
	lda 2,X
	psha
	lda 1,X
	psha
	lda *__r3
	psha
	lda *__r2
	psha
	lda *__r1
	psha
	lda *__r0
	psha
	jsr __cmp32
	ais #8
	ble X2
	jmp L21
X2:
	clr *__r0
	lda 11,X
	sta *__r1
	lda *__r0
	nega
	psha
	lda *__r1
	nega
	sta *__r1
	pula
	sbc #0
	sta *__r0
	mov *__r1,*__r3
	mov *__r0,*__r2
	clr *__r1
	clr *__r0
	tst *__r2
	bpl X1
	com *__r1
	com *__r0
X1:
	lda 4,X
	psha
	lda 3,X
	psha
	lda 2,X
	psha
	lda 1,X
	psha
	lda *__r3
	psha
	lda *__r2
	psha
	lda *__r1
	psha
	lda *__r0
	psha
	jsr __cmp32
	ais #8
	blt L21
	.dbline 91
; 	 	     {
	.dbline 92
;  	          if(GrE==1)   LcdShGr1P(y,x);//显示该点
	lda 12,X
	cmp #1
	bne L23
	.dbline 92
	lda 5,X
	psha
	lda ,X
	psha
	jsr _LcdShGr1P
	ais #2
	tsx
	bra L24
L23:
	.dbline 94
; 	 	      //清除该点
; 	 	      else if(y<=31) LcdShGr16P(y,(x/16),0);        
	lda ,X
	cmp #31
	bhi L25
	.dbline 94
	ldhx #0
	pshx
	pshh
	tsx
	aix #2
	lda 5,X
	ldx #16
	clrh
	div
	tsx
	aix #2
	psha
	lda ,X
	psha
	jsr _LcdShGr16P
	ais #4
	tsx
	bra L26
L25:
	.dbline 95
; 	 	      else           LcdShGr16P(y-32,x/16+8,0); 
	ldhx #0
	pshx
	pshh
	tsx
	aix #2
	lda 5,X
	ldx #16
	clrh
	div
	tsx
	aix #2
	add #8
	psha
	lda ,X
	sub #32
	psha
	jsr _LcdShGr16P
	ais #4
	tsx
L26:
L24:
	.dbline 96
; 	 	     }
L21:
	.dbline 97
L18:
	.dbline 86
	inc 5,X
L20:
	.dbline 86
	lda 9,X
	add 10,X
	sta *__r0
	lda 5,X
	cmp *__r0
	bhi X3
	jmp L17
X3:
L14:
	.dbline 85
	inc ,X
L16:
	.dbline 85
	lda 8,X
	add 10,X
	sta *__r0
	lda ,X
	cmp *__r0
	bhi X4
	jmp L13
X4:
	.dbline 99
; 	 	 } 
;  // LcdShGr1P(Cy,Cx);//显示圆心       	   
;   Wtite_Command(0b00110000);//基本指令
	lda #48
	psha
	jsr _Wtite_Command
	ais #1
	tsx
	.dbline -2
L12:
	ais #6
	.dbline 0 ; func end
	rts
	.dbsym l y 0 c
	.dbsym l mistake 1 L
	.dbsym l x 5 c
	.dbsym l GrE 12 c
	.dbsym l GrCilMV 11 c
	.dbsym l CR 10 c
	.dbsym l Cx 9 c
	.dbsym l Cy 8 c
	.dbend
	.dbfunc e LcdShGrRe _LcdShGrRe fV
;             RC -> 0,X
;             LC -> 2,X
;            TBC -> 4,X
;              i -> 6,X
;              y -> 7,X
;             Px -> 8,X
;            GrE -> 12,X
;             ln -> 11,X
_LcdShGrRe::
	.dbline -1
	ais #-9
	tsx
	.dbline 108
; }
; 
; /*LcdShGrRe:在Lcd的指定行上显示或取消矩型边框--------*
; *功  能:在Lcd上指定行上显示或取消矩型边框            *
; *参  数:ln为指定的行数(0-3), GrE确定图形是否有效     *
; *返  回:无                                           *
; *---------------------------------------------------*/
; void LcdShGrRe(unsigned char ln,unsigned char GrE)
; {  
	.dbline 113
	lda 11,X
	beq L30
	cmp #2
	bne L28
L30:
	.dbline 113
;   unsigned char Px,y;//行页号坐标,列坐标
;   unsigned char i;   //循环变量
;   int LC,RC,TBC;     //左,右和上下边框色
;   //[确定ln所在行的起始坐标(左上角)]
;   if((ln==0)||(ln==2))  y=0;
	clr 7,X
	bra L29
L28:

⌨️ 快捷键说明

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