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

📄 lcd.s

📁 项目是为日本瑞萨工作所做的BAKE炉温控系统 整个文件夹包括设计文档
💻 S
📖 第 1 页 / 共 2 页
字号:
	.module LCD.c
	.area text
	.dbfile LCD.c
	.dbfunc e LCDInit _LCDInit fV
_LCDInit::
	.dbline -1
	.dbline 34
; /*-------------------------------------------------------------------------*
; *文件描述:本文件包含了液晶显示相关子程序,分别为:                           *  
; *(1)Lcdinit:液晶初始化子程序                                               *
; *(2)LcdShCh:在液晶显示屏上显示字符数据                                     *
; *(3)LcdShGrRe:在Lcd的指定行上显示或取消矩型边框                            *
; *(4)LcdShGrCil:在Lcd上显示或取消空心圆型                                   *
; *-------------------------------------------------------------------------*/
; 
; //包含头文件 
; #include "LCD.h"    //Lcd头文件
; 
; //定义延时子程序
; #define delay1600us DelayTimes(4000)      //延时>1.6ms
; #define delay72us   DelayTimes(30)	      //延时>72us
; #define delay40ms   DelayTimes(10000)     //延时>40ms
; 
; //内部调用函数声明
; //在Lcd指定位置上设置线型16个点的显示
; void LcdShGr16P(INT8U,INT8U,INT16S);
; //在Lcd指定位置上画1个点
; void LcdShGr1P(INT8U,INT8U);
; void DelayTimes(INT16U);                  //延时指定时间
; void Wtite_Command(INT8U);                //将控制命令写入Lcd
; void Wtite_Data(INT8U);                   //将数据写入Lcd
; void LcdShGrClr(void);                    //在Lcd上清图形显示屏
; 
; /*===========================[Lcd初始化操作]==============================*/
; //Lcdinit:初始化液晶-------------------------------------------------------*
; //功  能:初始化液晶,设置显示方式,清屏、C自动+1                            *
; //参  数:无                                                                *
; //返  回:无                                                                *
; //-------------------------------------------------------------------------*
; void LCDInit(void)
; {
	.dbline 37
;     /*控制口高四位设置为输出*/
; //    LCD_CtrlPort|=1<<LCD_BL;//BL=1,关掉背光
;     LCD_CtrlPortDDR|=(1<<LCD_RS);//RS的方向为输出
	bset #1,0x6
	.dbline 38
; 	LCD_CtrlPortDDR|=(1<<LCD_RW);//RW的方向为输出
	bset #2,0x6
	.dbline 39
; 	LCD_CtrlPortDDR|=(1<<LCD_E); // E的方向为输出
	bset #3,0x6
	.dbline 40
; 	LCD_CtrlPortDDR|=(1<<LCD_BL);//BL的方向为输出
	bset #4,0x6
	.dbline 42
; 	//数据口设置为输出
; 	LCD_DataPortDDR=0xff;      
	lda #-1
	sta 0x5
	.dbline 44
; 	//[Lcd初始化]
; 	delay40ms;                 //延时>40ms
	ldhx #10000
	pshx
	pshh
	jsr _DelayTimes
	ais #2
	.dbline 45
;     Wtite_Command(0b00110000); //8位数据,基本指令
	lda #48
	psha
	jsr _Wtite_Command
	ais #1
	.dbline 46
; 	Wtite_Command(0b00001100); //开显示
	lda #12
	psha
	jsr _Wtite_Command
	ais #1
	.dbline 47
;  	Wtite_Command(0b00000001); //清屏
	lda #1
	psha
	jsr _Wtite_Command
	ais #1
	.dbline 48
; 	delay1600us;               //延时>1.6ms
	ldhx #4000
	pshx
	pshh
	jsr _DelayTimes
	ais #2
	.dbline 49
; 	Wtite_Command(0b00000110); //进入模式设定
	lda #6
	psha
	jsr _Wtite_Command
	ais #1
	.dbline 50
;     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 61
; //    LCD_CtrlPort&=~(1<<LCD_BL);//BL=0,打开背光
; }
; 
; /*=======================[Lcd显示字符操作]================================*/
; /*LcdShCh:在液晶显示屏上显示字符数据---------------------------------------*
; *功  能:在液晶显示屏上显示以LcdSBuff为首地址的64个数据                     *
; *参  数:待显示的64个数据的首地址                                           *
; *返  回:无                                                                 *
; *-------------------------------------------------------------------------*/
; void LcdShCh(INT8U *LcdSBuff)
; {
	.dbline 64
; 	unsigned char i;             //data数组计数器(0-63)
;   //[Lcd显示64个数据]   
;     Wtite_Command(0x80);         //DDRAM地址设置
	lda #-128
	psha
	jsr _Wtite_Command
	ais #1
	tsx
	.dbline 65
; 	for(i=0;i<64;i++)            //显示data中的64个数据
	clr ,X
	bra L6
L3:
	.dbline 66
;  	 { 
	.dbline 68
;  	  //[Lcd按行显示16个数据]
;  	  if((i<=15)||(i>=48))         //第一行和第四行不变
	lda ,X
	cmp #15
	bls L9
	cmp #48
	blo L7
L9:
	.dbline 69
;  	  	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 70
;  	  else if(i<=31)       //显示的第二行为缓冲的第三行
	lda ,X
	cmp #31
	bhi L10
	.dbline 71
;  	    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 73
;  	  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 74
L4:
	.dbline 65
	inc ,X
L6:
	.dbline 65
	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 87
;  	 }        
; }
; 
; /*===[Lcd画图操作:包括画圆,画矩形框,图形清屏,画点等]===================*/
; /*LcdShGrCil:在Lcd上显示或取消空心圆型-------------------------------------*
; *功  能:在Lcd上的指定位置显示或取消空心圆型                                *
; *参  数:Cx为圆心横坐标,Cy为圆心纵坐标                                      *
; *       CR为圆的半径,GrE确定图形是否有效                                   *
; *       GrCilMV为显示圆型时的正误差值                                      *
; *       例如:半径为10,误差为4;半径为30,误差为30                         *
; *返  回:无                                                                 *
; *-------------------------------------------------------------------------*/
; void LcdShGrCil(INT8U Cy,INT8U Cx,INT8U CR,INT8U GrCilMV,INT8U GrE)
; {
	.dbline 90
;   INT8U x,y;                    //坐标的循环控制变量
;   INT32S mistake;               //显示时的误差值
;   Wtite_Command(0b00110110);    //扩展指令,绘图开
	lda #54
	psha
	jsr _Wtite_Command
	ais #1
	tsx
	.dbline 91
;   for(y=Cy-CR;y<=Cy+CR;y++)
	lda 8,X
	sub 10,X
	sta ,X
	jmp L16
L13:
	.dbline 92
;       for(x=Cx-CR;x<=Cx+CR;x++)
	lda 9,X
	sub 10,X
	sta 5,X
	jmp L20
L17:
	.dbline 93
; 	     {  
	.dbline 94
; 	      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 96
; 	      //误差在范围之内时,显示该点
; 	      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 97
; 	 	     {
	.dbline 98
;  	          if(GrE==1)     LcdShGr1P(y,x);//显示该点
	lda 12,X
	cmp #1
	bne L23
	.dbline 98
	lda 5,X
	psha
	lda ,X
	psha
	jsr _LcdShGr1P
	ais #2
	tsx
	bra L24
L23:
	.dbline 100
; 	 	      //清除该点
; 	 	      else if(y<=31) LcdShGr16P(y,(x/16),0);        
	lda ,X
	cmp #31
	bhi L25
	.dbline 100
	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 101
; 	 	      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 102
; 	 	     }
L21:
	.dbline 103
L18:
	.dbline 92
	inc 5,X
L20:
	.dbline 92
	lda 9,X
	add 10,X
	sta *__r0
	lda 5,X
	cmp *__r0
	bhi X3
	jmp L17
X3:
L14:
	.dbline 91
	inc ,X
L16:
	.dbline 91
	lda 8,X
	add 10,X
	sta *__r0
	lda ,X
	cmp *__r0
	bhi X4
	jmp L13
X4:
	.dbline 105
; 	 	 } 
;   //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 114
; }
; 
; /*LcdShGrRe:在Lcd的指定行上显示或取消矩型边框------------------------------*
; *功  能:在Lcd上指定行上显示或取消矩型边框                                  *
; *参  数:ln为指定的行数(0-3), GrE确定图形是否有效                           *
; *返  回:无                                                                 *
; *-------------------------------------------------------------------------*/
; void LcdShGrRe(INT8U ln,INT8U GrE)
; {  
	.dbline 119
	lda 11,X
	beq L30
	cmp #2
	bne L28
L30:
	.dbline 119
;   INT8U  Px,y;       //行页号坐标,列坐标
;   INT8U  i;          //循环变量
;   INT16S LC,RC,TBC;  //左,右和上下边框色
;   //[确定ln所在行的起始坐标(左上角)]
;   if((ln==0)||(ln==2))  y=0;
	clr 7,X
	bra L29
L28:
	.dbline 120
;   else  y=16;
	lda #16
	sta 7,X
L29:
	.dbline 121
;   if(ln<=1)  Px=0;
	lda 11,X
	cmp #1
	bhi L31
	.dbline 121
	clr 8,X
	bra L32
L31:
	.dbline 122
;   else  Px=8;
	lda #8
	sta 8,X
L32:
	.dbline 124
;   //[确定有无边框(有GrE决定)]
;   if(GrE==1)   //有表框
	lda 12,X
	cmp #1
	bne L33
	.dbline 125
;   	 {TBC=65535;LC=32768;RC=1;}
	.dbline 125
	lda #-1
	sta 4,X
	lda #-1
	sta 5,X
	.dbline 125
	lda #-128
	sta 2,X
	lda #0
	sta 3,X
	.dbline 125
	clra
	sta ,X
	lda #1
	sta 1,X
	.dbline 125
	bra L34
L33:
	.dbline 127
;   else         //无边框
;      {TBC=0;LC=0;RC=0;}
	.dbline 127
	clr 5,X
	clr 4,X
	.dbline 127
	clr 3,X
	clr 2,X
	.dbline 127
	clr 1,X
	clr ,X
	.dbline 127
L34:
	.dbline 128
;   Wtite_Command(0b00110110);//扩展指令,绘图开
	lda #54
	psha
	jsr _Wtite_Command
	ais #1
	tsx
	.dbline 130
;   //[在Lcd上指定行上显示矩型边框]
;   for(i=0;i<=7;i++,Px++)
	clr 6,X
	bra L38
L35:
	.dbline 131
	.dbline 132
	lda 5,X
	psha
	lda 4,X
	psha
	lda 8,X
	psha
	lda 7,X
	psha
	jsr _LcdShGr16P
	ais #4
	tsx
	.dbline 133
	lda 5,X
	psha
	lda 4,X
	psha
	lda 8,X
	psha
	lda 7,X
	add #15
	psha
	jsr _LcdShGr16P
	ais #4
	tsx
	.dbline 134
L36:
	.dbline 130
	inc 6,X
	inc 8,X
L38:
	.dbline 130
	lda 6,X
	cmp #7
	bls L35
	.dbline 135
;      {   
;         LcdShGr16P(y,Px,TBC);    //显示上边框 
;         LcdShGr16P(y+15,Px,TBC); //显示下边框
;      }  
;   for(i=1,y++,Px--;i<=14;i++,y++)
	lda #1
	sta 6,X
	inc 7,X
	dec 8,X
	bra L42
L39:
	.dbline 136
	.dbline 137
	lda 1,X
	psha
	lda ,X
	psha
	lda 8,X
	psha
	lda 7,X
	psha
	jsr _LcdShGr16P
	ais #4
	tsx
	.dbline 138
	lda 3,X
	psha
	lda 2,X
	psha
	lda 8,X
	sub #7
	psha
	lda 7,X
	psha
	jsr _LcdShGr16P
	ais #4
	tsx
	.dbline 139
L40:
	.dbline 135
	inc 6,X
	inc 7,X
L42:
	.dbline 135
	lda 6,X
	cmp #14
	bls L39
	.dbline 140
;      {
;         LcdShGr16P(y,Px,RC);    //显示右边框 
;         LcdShGr16P(y,Px-7,LC);  //显示左边框      
;      }
;   Wtite_Command(0b00110000);//基本指令
	lda #48
	psha
	jsr _Wtite_Command
	ais #1
	tsx

⌨️ 快捷键说明

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