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

📄 lcd.s

📁 12C887 的驱动程序
💻 S
字号:
	.module lcd.c
	.area text(rom, con, rel)
	.dbfile C:\DOCUME~1\Administrator\桌面\USING07-07\Mega128\12c887\lcd.c
	.dbfunc e port_init _port_init fV
	.even
_port_init::
	.dbline -1
	.dbline 8
; #include <iom128v.h>
; #include <macros.h>
; #include "lcd.h"
; typedef unsigned char uchar;
; typedef unsigned int uint;
; 
; void port_init(void)
; {
	.dbline 10
;  //访问外部ram的总线端口
;  PORTA = 0x00;
	clr R2
	out 0x1b,R2
	.dbline 11
;  DDRA  = 0x00; 
	out 0x1a,R2
	.dbline 12
;  PORTC = 0x00; 
	out 0x15,R2
	.dbline 13
;  DDRC  = 0xFF;
	ldi R24,255
	out 0x14,R24
	.dbline -2
L1:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e check_busy _check_busy fV
;           temp -> R20
;             cs -> R16
	.even
_check_busy::
	xcall push_gset1
	.dbline -1
	.dbline 17
; }
; 	  
; void check_busy(uchar cs)               
; { 
	xjmp L4
L3:
	.dbline 20
;   uchar temp;
;   while(temp)          
;    { 
	.dbline 21
;      if(cs)
	tst R16
	breq L6
	.dbline 22
;         temp=R_staus&0X80;               //将忙状态读到temp中进行确定
	lds R20,39168
	andi R20,128
	xjmp L7
L6:
	.dbline 24
; 	 else
; 	    temp=L_staus&0X80;
	lds R20,38144
	andi R20,128
L7:
	.dbline 25
L4:
	.dbline 19
	tst R20
	brne L3
	.dbline -2
L2:
	xcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r temp 20 c
	.dbsym r cs 16 c
	.dbend
	.dbfunc e lcdcommand _lcdcommand fV
;            com -> R20
;             cs -> R22
	.even
_lcdcommand::
	xcall push_gset2
	mov R20,R18
	mov R22,R16
	.dbline -1
	.dbline 30
; 	}
; }
; 
; 
; void lcdcommand(uchar cs,uchar com)
; { 
	.dbline 31
;  if(cs)
	tst R22
	breq L9
	.dbline 32
;    {	
	.dbline 33
;     check_busy(1);
	ldi R16,1
	xcall _check_busy
	.dbline 34
;     R_command=com;
	sts 38912,R20
	.dbline 35
;    }
	xjmp L10
L9:
	.dbline 37
	.dbline 38
	clr R16
	xcall _check_busy
	.dbline 39
	sts 37888,R20
	.dbline 40
L10:
	.dbline -2
L8:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r com 20 c
	.dbsym r cs 22 c
	.dbend
	.dbfunc e lcddatas _lcddatas fV
;             dd -> R20
;             cs -> R22
	.even
_lcddatas::
	xcall push_gset2
	mov R20,R18
	mov R22,R16
	.dbline -1
	.dbline 46
;   else
;    { 	
;     check_busy(0);
;     L_command=com;
;    }
; }
; 
; /*************************向LCD写数据函数*************************/
; 
; void lcddatas(char cs,uchar dd)
; {  
	.dbline 47
;  if(cs)
	tst R22
	breq L12
	.dbline 48
;    {
	.dbline 49
;     check_busy(1);
	ldi R16,1
	xcall _check_busy
	.dbline 50
;     R_data=dd;
	sts 39424,R20
	.dbline 51
;    }
	xjmp L13
L12:
	.dbline 53
	.dbline 54
	clr R16
	xcall _check_busy
	.dbline 55
	sts 38400,R20
	.dbline 56
L13:
	.dbline -2
L11:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r dd 20 c
	.dbsym r cs 22 c
	.dbend
	.dbfunc e LCD_Clean _LCD_Clean fV
;              x -> R20
;              y -> R22
	.even
_LCD_Clean::
	xcall push_gset2
	.dbline -1
	.dbline 62
;  else
;    {
;     check_busy(0);
;     L_data=dd;
;     }
; }
; 
; /**************************** LCD清屏函数*******************************/
; 
; void LCD_Clean(void)
; {
	.dbline 64
;  unsigned char x,y;	 	
;  for(x=0xb8;x<=0xbf;x++)                                 //一页一页的写
	ldi R20,184
	xjmp L18
L15:
	.dbline 65
;    {	
	.dbline 66
;      lcdcommand(0,x); 
	mov R18,R20
	clr R16
	xcall _lcdcommand
	.dbline 67
;      lcdcommand(1,x);                                    //设定X方向地址,X地址不能自增。要靠程序加
	mov R18,R20
	ldi R16,1
	xcall _lcdcommand
	.dbline 68
;      lcdcommand(0,LCD_Y);                                //设置Y的初始地址,Y可自加
	ldi R18,64
	clr R16
	xcall _lcdcommand
	.dbline 69
;      lcdcommand(1,LCD_Y);
	ldi R18,64
	ldi R16,1
	xcall _lcdcommand
	.dbline 70
;      for(y=0;y<64;y++)
	clr R22
	xjmp L22
L19:
	.dbline 71
	.dbline 72
	clr R18
	clr R16
	xcall _lcddatas
	.dbline 73
	clr R18
	ldi R16,1
	xcall _lcddatas
	.dbline 74
L20:
	.dbline 70
	inc R22
L22:
	.dbline 70
	cpi R22,64
	brlo L19
	.dbline 75
L16:
	.dbline 64
	inc R20
L18:
	.dbline 64
	ldi R24,191
	cp R24,R20
	brsh L15
	.dbline -2
L14:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r x 20 c
	.dbsym r y 22 c
	.dbend
	.dbfunc e LCD_Init _LCD_Init fV
	.even
_LCD_Init::
	.dbline -1
	.dbline 79
;        {  	
;          lcddatas(0,0x00);
;          lcddatas(1,0x00);                               //Y地址可以自增
;        }		      
;     }
; }
;                                          
; void LCD_Init(void)                     //LCD初始化子函数
; {
	.dbline 81
;   /*首先关闭12864的显示*/
;   check_busy(0);                        //LCD左半屏正在工作,等待......
	clr R16
	xcall _check_busy
	.dbline 82
;   L_command=LCD_OFF;                    //先关闭LCD左半屏的显示
	ldi R24,62
	sts 37888,R24
	.dbline 83
;   check_busy(1);                        //LCD右半屏正在工作,等待......
	ldi R16,1
	xcall _check_busy
	.dbline 84
;   R_command=LCD_OFF;                    //先关闭LCD右半屏的显示
	ldi R24,62
	sts 38912,R24
	.dbline 87
;   
;   /*开启12864的显示*/
;   check_busy(0);
	clr R16
	xcall _check_busy
	.dbline 88
;   L_command=LCD_ON;                     //打开LCD左半屏的显示
	ldi R24,63
	sts 37888,R24
	.dbline 89
;   check_busy(1);
	ldi R16,1
	xcall _check_busy
	.dbline 90
;   R_command=LCD_ON;                     //打开LCD右半屏的显示
	ldi R24,63
	sts 38912,R24
	.dbline 93
;   
;   /*设置LCD显示的起始行*/
;   check_busy(0);
	clr R16
	xcall _check_busy
	.dbline 94
;   L_command=LCD_X;                      //LCD左半屏起始行为0
	ldi R24,192
	sts 37888,R24
	.dbline 95
;   check_busy(1);
	ldi R16,1
	xcall _check_busy
	.dbline 96
;   R_command=LCD_X;                      //LCD右半屏起始行为0
	ldi R24,192
	sts 38912,R24
	.dbline -2
L23:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e init_devices _init_devices fV
	.even
_init_devices::
	.dbline -1
	.dbline 100
; }
; 
; void init_devices(void)
; {
	.dbline 101
;  XMCRA = 0x00;                          //外部存储器控制
	clr R2
	sts 109,R2
	.dbline 102
;  XMCRB = 0x00; //外存储高位地址屏蔽,释放端口C
	sts 108,R2
	.dbline 103
;  port_init();
	xcall _port_init
	.dbline 104
;  MCUCR = 0x80;                          //外部SRAM使能
	ldi R24,128
	out 0x35,R24
	.dbline -2
L24:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e displaychar_left _displaychar_left fV
;              i -> R20
;              y -> y+4
;              x -> R20
;          array -> R22,R23
	.even
_displaychar_left::
	xcall push_gset2
	mov R20,R18
	movw R22,R16
	.dbline -1
	.dbline 110
; }
; 
; /**********************************LCD字符显示函数(8*8)**********************************************/
; 
; void displaychar_left(uchar *array,uchar x,uchar y)        
;  {
	.dbline 112
;   uchar i;
;   lcdcommand(0,LCD_PAGE+x);
	mov R18,R20
	subi R18,72    ; addi 184
	clr R16
	xcall _lcdcommand
	.dbline 113
;   lcdcommand(0,LCD_Y+y);
	ldd R18,y+4
	subi R18,192    ; addi 64
	clr R16
	xcall _lcdcommand
	.dbline 114
;   for(i=0;i<8;i++)
	clr R20
	xjmp L29
L26:
	.dbline 115
	.dbline 116
	mov R30,R20
	clr R31
	add R30,R22
	adc R31,R23
	ldd R18,z+0
	clr R16
	xcall _lcddatas
	.dbline 117
L27:
	.dbline 114
	inc R20
L29:
	.dbline 114
	cpi R20,8
	brlo L26
	.dbline -2
L25:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r i 20 c
	.dbsym l y 4 c
	.dbsym r x 20 c
	.dbsym r array 22 pc
	.dbend
	.dbfunc e displaychar_right _displaychar_right fV
;              i -> R20
;              y -> y+4
;              x -> R20
;          array -> R22,R23
	.even
_displaychar_right::
	xcall push_gset2
	mov R20,R18
	movw R22,R16
	.dbline -1
	.dbline 122
;     {
; 	 lcddatas(0,*(array+i));
; 	}
;  }
; 
; 
; void displaychar_right(uchar *array,uchar x,uchar y)        
; {
	.dbline 124
;   uchar i;
;   lcdcommand(1,LCD_PAGE+x);
	mov R18,R20
	subi R18,72    ; addi 184
	ldi R16,1
	xcall _lcdcommand
	.dbline 125
;   lcdcommand(1,LCD_Y+y);
	ldd R18,y+4
	subi R18,192    ; addi 64
	ldi R16,1
	xcall _lcdcommand
	.dbline 126
;   for(i=0;i<8;i++)
	clr R20
	xjmp L34
L31:
	.dbline 127
	.dbline 128
	mov R30,R20
	clr R31
	add R30,R22
	adc R31,R23
	ldd R18,z+0
	ldi R16,1
	xcall _lcddatas
	.dbline 129
L32:
	.dbline 126
	inc R20
L34:
	.dbline 126
	cpi R20,8
	brlo L31
	.dbline -2
L30:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r i 20 c
	.dbsym l y 4 c
	.dbsym r x 20 c
	.dbsym r array 22 pc
	.dbend
	.dbfunc e display_char _display_char fV
;           heng -> R10
;           zong -> R22
;         array2 -> R20,R21
;         array1 -> R12,R13
	.even
_display_char::
	xcall push_gset4
	movw R20,R18
	movw R12,R16
	sbiw R28,1
	ldd R22,y+9
	ldd R10,y+11
	.dbline -1
	.dbline 134
;      {
; 	  lcddatas(1,*(array+i));
; 	  }
; }
; 
;      
; void display_char(uchar*array1,uchar*array2,uchar zong,uchar heng)         
; {
	.dbline 135
;   if((heng>=0)&&(heng<=7))       
	mov R24,R10
	cpi R24,0
	brlo L36
	ldi R24,7
	cp R24,R10
	brlo L36
	.dbline 136
; 	{displaychar_left(array1,zong,heng*8);	displaychar_left(array2,zong+1,heng*8);}
	.dbline 136
	ldi R24,8
	mul R24,R10
	std y+0,R0
	mov R18,R22
	movw R16,R12
	xcall _displaychar_left
	.dbline 136
	ldi R24,8
	mul R24,R10
	std y+0,R0
	mov R18,R22
	subi R18,255    ; addi 1
	movw R16,R20
	xcall _displaychar_left
	.dbline 136
L36:
	.dbline 138
	mov R24,R10
	cpi R24,8
	brlo L38
	ldi R24,15
	cp R24,R10
	brlo L38
	.dbline 139
	.dbline 139
	ldi R24,8
	mul R24,R10
	mov R24,R0
	subi R24,64
	std y+0,R24
	mov R18,R22
	movw R16,R12
	xcall _displaychar_right
	.dbline 139
	ldi R24,8
	mul R24,R10
	mov R24,R0
	subi R24,64
	std y+0,R24
	mov R18,R22
	subi R18,255    ; addi 1
	movw R16,R20
	xcall _displaychar_right
	.dbline 139
L38:
	.dbline -2
L35:
	adiw R28,1
	xcall pop_gset4
	.dbline 0 ; func end
	ret
	.dbsym r heng 10 c
	.dbsym r zong 22 c
	.dbsym r array2 20 pc
	.dbsym r array1 12 pc
	.dbend
	.dbfunc e displayL _displayL fV
;              i -> R20
;              y -> y+4
;              x -> R20
;          array -> R22,R23
	.even
_displayL::
	xcall push_gset2
	mov R20,R18
	movw R22,R16
	.dbline -1
	.dbline 145
; 				 
;   if((heng>=8)&&(heng<=15))        
;     {displaychar_right(array1,zong,(heng-8)*8);	displaychar_right(array2,zong+1,(heng-8)*8);}
; }
; 
; /****************************** LCD汉字显示函数(8*16)****************************************/
; 
; void displayL(uchar*array,uchar x,uchar y)            //array是点阵字模指针,x是指屏竖方向的坐标,y是指屏横方向上的坐标
; {     
	.dbline 147
;    uchar i;
;    lcdcommand(0,0xb8+x);                              //设置显示本字符的初始地址                    
	mov R18,R20
	subi R18,72    ; addi 184
	clr R16
	xcall _lcdcommand
	.dbline 148
;    lcdcommand(0,0x40+y);
	ldd R18,y+4
	subi R18,192    ; addi 64
	clr R16
	xcall _lcdcommand
	.dbline 149
;    for(i=0;i<16;i++)                                  //每半个字代码为16元素的数组
	clr R20
	xjmp L44
L41:
	.dbline 150
	.dbline 151
	mov R30,R20
	clr R31
	add R30,R22
	adc R31,R23
	ldd R18,z+0
	clr R16
	xcall _lcddatas
	.dbline 153
L42:
	.dbline 149
	inc R20
L44:
	.dbline 149
	cpi R20,16
	brlo L41
	.dbline -2
L40:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r i 20 c
	.dbsym l y 4 c
	.dbsym r x 20 c
	.dbsym r array 22 pc
	.dbend
	.dbfunc e displayR _displayR fV
;              i -> R20
;              y -> y+4
;              x -> R20
;          array -> R22,R23
	.even
_displayR::
	xcall push_gset2
	mov R20,R18
	movw R22,R16
	.dbline -1
	.dbline 159
;      {	
;       lcddatas(0,*(array+i));
; 	 						
;      }
; 
; }
; 
; 
; void displayR(uchar*array,uchar x,uchar y)            //array是点阵字模指针,x是指屏竖方向的坐标,y是指屏横方向上的坐标
; {     
	.dbline 162
;    uchar i;
; 
;    lcdcommand(1,0xb8+x);                             
	mov R18,R20
	subi R18,72    ; addi 184
	ldi R16,1
	xcall _lcdcommand
	.dbline 163
;    lcdcommand(1,0x40+y);
	ldd R18,y+4
	subi R18,192    ; addi 64
	ldi R16,1
	xcall _lcdcommand
	.dbline 165
; 
;    for(i=0;i<16;i++)                                  //每半个字代码为16元素的数组
	clr R20
	xjmp L49
L46:
	.dbline 166
	.dbline 167
	mov R30,R20
	clr R31
	add R30,R22
	adc R31,R23
	ldd R18,z+0
	ldi R16,1
	xcall _lcddatas
	.dbline 168
L47:
	.dbline 165
	inc R20
L49:
	.dbline 165
	cpi R20,16
	brlo L46
	.dbline -2
L45:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r i 20 c
	.dbsym l y 4 c
	.dbsym r x 20 c
	.dbsym r array 22 pc
	.dbend
	.dbfunc e display_chinese _display_chinese fV
;           heng -> R10
;           zong -> R22
;         array2 -> R20,R21
;         array1 -> R12,R13
	.even
_display_chinese::
	xcall push_gset4
	movw R20,R18
	movw R12,R16
	sbiw R28,1
	ldd R22,y+9
	ldd R10,y+11
	.dbline -1
	.dbline 173
;      {	
;       lcddatas(1,*(array+i));		 						
;      }
; 
; }	
; 
; void display_chinese(uchar*array1,uchar*array2,uchar zong,uchar heng)
; {
	.dbline 174
;   if((heng>=0)&&(heng<=3))         //左半屏显示
	mov R24,R10
	cpi R24,0
	brlo L51
	ldi R24,3
	cp R24,R10
	brlo L51
	.dbline 175
;    {
	.dbline 176
;     displayL(array1,zong*2,heng*16);	displayL(array2,zong*2+1,heng*16);
	ldi R24,16
	mul R24,R10
	std y+0,R0
	ldi R24,2
	mul R24,R22
	mov R18,R0
	movw R16,R12
	xcall _displayL
	.dbline 176
	ldi R24,16
	mul R24,R10
	std y+0,R0
	ldi R24,2
	mul R24,R22
	mov R18,R0
	subi R18,255    ; addi 1
	movw R16,R20
	xcall _displayL
	.dbline 177
;    }
L51:
	.dbline 178
	mov R24,R10
	cpi R24,4
	brlo L53
	ldi R24,7
	cp R24,R10
	brlo L53
	.dbline 179
	.dbline 180
	ldi R24,16
	mul R24,R10
	mov R24,R0
	subi R24,64
	std y+0,R24
	ldi R24,2
	mul R24,R22
	mov R18,R0
	movw R16,R12
	xcall _displayR
	.dbline 180
	ldi R24,16
	mul R24,R10
	mov R24,R0
	subi R24,64
	std y+0,R24
	ldi R24,2
	mul R24,R22
	mov R18,R0
	subi R18,255    ; addi 1
	movw R16,R20
	xcall _displayR
	.dbline 181
L53:
	.dbline -2
L50:
	adiw R28,1
	xcall pop_gset4
	.dbline 0 ; func end
	ret
	.dbsym r heng 10 c
	.dbsym r zong 22 c
	.dbsym r array2 20 pc
	.dbsym r array1 12 pc
	.dbend

⌨️ 快捷键说明

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