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

📄 lcd.s

📁 基于ATMEGA16的AD转换的C程序源代码
💻 S
📖 第 1 页 / 共 2 页
字号:
	.module lcd.c
	.area text(rom, con, rel)
	.dbfile D:\垃圾站\lcd.c
	.dbfile D:\垃圾站\delay.h
	.dbfunc e delay_nus _delay_nus fV
;           time -> R16,R17
	.even
_delay_nus::
	.dbline -1
	.dbline 33
; //#define 	F_CPU 		12000000
; #define 	F_CPU 		11059200
; //#define 	F_CPU 			8000000
; //#define 	F_CPU 			7372800
; //#define 	F_CPU 			4000000
; /*************************************************************************
; 通用延时头文件:
; 			   delay_nus(n)延时n微秒
; 			   delay_nms(n)延时n毫秒
; *************************************************************************/
; #if F_CPU == 12000000
; 	void delay_nus(unsigned int time)
; 	{
; 	 	while (time!=0)
; 		{
; 		 	NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();
; 			time--;
; 		}
; 	}
; 	void delay_nms(unsigned int time)
; 	{
;  	 	unsigned int i;
; 		while (time!=0)
; 		{
; 		 	for(i=0;i<1740;i++);
; 			time--;
; 		}
; 	}
; #endif
; 
; #if F_CPU == 11059200
; 	void delay_nus(unsigned int time)
; 	{
	xjmp L3
L2:
	.dbline 35
; 	 	while (time!=0)
; 		{
	.dbline 36
; 		 	NOP();NOP();NOP();NOP();NOP();NOP();NOP();
	nop
	.dbline 36
	nop
	.dbline 36
	nop
	.dbline 36
	nop
	.dbline 36
	nop
	.dbline 36
	nop
	.dbline 36
	nop
	.dbline 37
; 			time--;
	subi R16,1
	sbci R17,0
	.dbline 38
; 		}
L3:
	.dbline 34
	cpi R16,0
	cpc R16,R17
	brne L2
X0:
	.dbline -2
L1:
	.dbline 0 ; func end
	ret
	.dbsym r time 16 i
	.dbend
	.dbfunc e delay_nms _delay_nms fV
;              i -> R20,R21
;           time -> R16,R17
	.even
_delay_nms::
	st -y,R20
	st -y,R21
	.dbline -1
	.dbline 41
; 	}
; 	void delay_nms(unsigned int time)
; 	{
	xjmp L7
L6:
	.dbline 44
;  	 	unsigned int i;
; 		while (time!=0)
; 		{
	.dbline 45
; 		 	for(i=0;i<1580;i++);	
	clr R20
	clr R21
	xjmp L12
L9:
	.dbline 45
L10:
	.dbline 45
	subi R20,255  ; offset = 1
	sbci R21,255
L12:
	.dbline 45
	cpi R20,44
	ldi R30,6
	cpc R21,R30
	brlo L9
X1:
	.dbline 46
; 			time--;
	subi R16,1
	sbci R17,0
	.dbline 47
; 		}
L7:
	.dbline 43
	cpi R16,0
	cpc R16,R17
	brne L6
X2:
	.dbline -2
L5:
	.dbline 0 ; func end
	ld R21,y+
	ld R20,y+
	ret
	.dbsym r i 20 i
	.dbsym r time 16 i
	.dbend
	.dbfile D:\垃圾站\lcd.c
	.dbfunc e delay _delay fV
;              i -> R10
;              n -> R16
	.even
_delay::
	st -y,R10
	st -y,R11
	.dbline -1
	.dbline 10
; #include <iom16v.h> 
; #include <macros.h>
; #define LCD12864 TRUE 
; #include "delay.h"
; #define LCD_DATAL PORTA&=~BIT(1)
; #define LCD_DATAH PORTA|=BIT(1) 
; #define LCD_CLKL PORTA&=~BIT(3)
; #define LCD_CLKH PORTA|=BIT(3)
; void delay(unsigned char n)
; {	 
	.dbline 12
; 	 unsigned char i;
;  	 for(i=0;i<n;i++)                //延时
	clr R10
	xjmp L17
L14:
	.dbline 13
; 	 {asm("nop");}
	.dbline 13
	nop
	.dbline 13
L15:
	.dbline 12
	inc R10
L17:
	.dbline 12
	cp R10,R16
	brlo L14
X3:
	.dbline -2
L13:
	.dbline 0 ; func end
	ld R11,y+
	ld R10,y+
	ret
	.dbsym r i 10 c
	.dbsym r n 16 c
	.dbend
	.dbfunc e lcd_out _lcd_out fV
;              s -> <dead>
;              i -> R20
;      send_byte -> R10
	.even
_lcd_out::
	xcall push_xgset300C
	mov R10,R16
	.dbline -1
	.dbline 19
; }
; //*************************************************************************
; 
; //***************************************************************************
; void lcd_out(unsigned char send_byte)
; {    
	.dbline 21
;     unsigned char i,s;
;  	for (i=0;i<8;i++)
	clr R20
	xjmp L22
L19:
	.dbline 22
; 	{
	.dbline 23
; 	 if((send_byte&0x80)==0)
	sbrc R10,7
	rjmp L23
X4:
	.dbline 24
; 	 {
	.dbline 25
; 	     LCD_DATAL;
	cbi 0x1b,1
	.dbline 26
; 	 }
	xjmp L24
L23:
	.dbline 28
; 	 else
; 	 {
	.dbline 29
; 	     LCD_DATAH;
	sbi 0x1b,1
	.dbline 30
; 	 }      //送数据
L24:
	.dbline 31
; 	 LCD_CLKL;
	cbi 0x1b,3
	.dbline 32
; 	 LCD_CLKH;
	sbi 0x1b,3
	.dbline 33
; 	 send_byte=send_byte<<1;
	lsl R10
	.dbline 34
; 	}
L20:
	.dbline 21
	inc R20
L22:
	.dbline 21
	cpi R20,8
	brlo L19
X5:
	.dbline 35
; 	delay(256);
	ldi R16,0
	xcall _delay
	.dbline -2
L18:
	.dbline 0 ; func end
	xjmp pop_xgset300C
	.dbsym l s 1 c
	.dbsym r i 20 c
	.dbsym r send_byte 10 c
	.dbend
	.dbfunc e WR_dat _WR_dat fV
;              s -> R20
;            dat -> R22
	.even
_WR_dat::
	xcall push_xgsetF000
	mov R22,R16
	.dbline -1
	.dbline 40
; }
; //***************************************************************************
; 
; void WR_dat(unsigned char dat)
; {
	.dbline 42
;      unsigned char s;
; 	 s=dat&0xf0;
	mov R20,R22
	andi R20,240
	.dbline 43
; 	 lcd_out(0xfa);
	ldi R16,250
	xcall _lcd_out
	.dbline 44
; 	 lcd_out(s);
	mov R16,R20
	xcall _lcd_out
	.dbline 45
; 	 s=dat&0x0f;
	mov R20,R22
	andi R20,15
	.dbline 46
; 	 s<<=4;
	mov R24,R20
	andi R24,#0x0F
	swap R24
	mov R20,R24
	.dbline 47
; 	 lcd_out(s);
	mov R16,R24
	xcall _lcd_out
	.dbline -2
L25:
	.dbline 0 ; func end
	xjmp pop_xgsetF000
	.dbsym r s 20 c
	.dbsym r dat 22 c
	.dbend
	.dbfunc e WR_control _WR_control fV
;              s -> R20
;            dat -> R22
	.even
_WR_control::
	xcall push_xgsetF000
	mov R22,R16
	.dbline -1
	.dbline 51
; }
; //**************************************************************************
; void WR_control(unsigned char dat)
; {
	.dbline 53
;      unsigned char s;
; 	 s=dat&0xf0;
	mov R20,R22
	andi R20,240
	.dbline 54
; 	 lcd_out(0xf8);
	ldi R16,248
	xcall _lcd_out
	.dbline 55
; 	 lcd_out(s);
	mov R16,R20
	xcall _lcd_out
	.dbline 56
; 	 s=dat&0x0f;
	mov R20,R22
	andi R20,15
	.dbline 57
; 	 s<<=4;
	mov R24,R20
	andi R24,#0x0F
	swap R24
	mov R20,R24
	.dbline 58
; 	 lcd_out(s);
	mov R16,R24
	xcall _lcd_out
	.dbline -2
L26:
	.dbline 0 ; func end
	xjmp pop_xgsetF000
	.dbsym r s 20 c
	.dbsym r dat 22 c
	.dbend
	.dbfunc e lcd_control _lcd_control fV
	.even
_lcd_control::
	.dbline -1
	.dbline 62
; }
; //**************************************************************************
; void lcd_control()
; {
	.dbline 63
; 	WR_control(0x30);
	ldi R16,48
	xcall _WR_control
	.dbline 64
; 	WR_control(0x0c);
	ldi R16,12
	xcall _WR_control
	.dbline -2
L27:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e lcd_clear _lcd_clear fV
;              i -> R20,R21
	.even
_lcd_clear::
	st -y,R20
	st -y,R21
	.dbline -1
	.dbline 68
; }
; //**************************************************************************
; void lcd_clear()
; {
	.dbline 70
;   int i;
;   WR_control(0x01);
	ldi R16,1
	xcall _WR_control
	.dbline 71
;   for(i=0;i<5000;i++)	//	延时5ms
	clr R20
	clr R21
L29:
	.dbline 72
; 	{
	.dbline 73
; 		asm("nop");
	nop
	.dbline 74
; 		asm("nop");
	nop
	.dbline 76
; 		
; 	} 
L30:
	.dbline 71
	subi R20,255  ; offset = 1
	sbci R21,255
	.dbline 71
	cpi R20,136
	ldi R30,19
	cpc R21,R30
	brlt L29
X6:
	.dbline -2
L28:
	.dbline 0 ; func end
	ld R21,y+
	ld R20,y+
	ret
	.dbsym r i 20 I
	.dbend
	.dbfunc e LCD_address _LCD_address fV
;        address -> R20
;              y -> R22
;              x -> R10
	.even
_LCD_address::
	xcall push_xgsetF00C
	mov R22,R18
	mov R10,R16
	.dbline -1
	.dbline 85
; }
; /*******************************************************/
; /******   函数名称: LCD_set_xy()                  ******/
; /******   功    能: 设置LCD显示坐标               ******/
; /******   参    数: 显示字符串的位置,X:0-15,Y:0-1*****/
; /******   返回值  : 无                            ******/
; /*******************************************************/
; void LCD_address( unsigned char x, unsigned char y )
; {
	.dbline 87
;  	unsigned char address;
; 	switch(x)
	mov R20,R10
	clr R21
	cpi R20,0
	cpc R20,R21
	breq L37
X7:
	cpi R20,1
	ldi R30,0
	cpc R21,R30
	breq L38
X8:
	cpi R20,2
	ldi R30,0
	cpc R21,R30
	breq L39
X9:
	cpi R20,3
	ldi R30,0
	cpc R21,R30
	breq L40
X10:
	xjmp L34
L37:
	.dbline 90
; 	{
; 	 	case 0:
; 			   address = 0x80 + y;		   //计算显示地址
	mov R20,R22
	subi R20,128    ; addi 128
	.dbline 91
; 			   break;
	xjmp L35
L38:
	.dbline 93
; 		case 1:
; 			   address = 0x90 + y;		   //计算显示地址
	mov R20,R22
	subi R20,112    ; addi 144
	.dbline 94
; 			   break;
	xjmp L35
L39:
	.dbline 96
; 		case 2:
; 			   address = 0x88 + y;		   //计算显示地址
	mov R20,R22
	subi R20,120    ; addi 136
	.dbline 97
; 			   break;
	xjmp L35
L40:
	.dbline 99
; 		case 3:
; 			   address = 0x98 + y;		   //计算显示地址
	mov R20,R22
	subi R20,104    ; addi 152
	.dbline 100
; 			   break;
	xjmp L35
L34:
	.dbline 101
; 		default:address = 0x80 + y;
	mov R20,R22
	subi R20,128    ; addi 128
	.dbline 102
; 	}
L35:
	.dbline 103
; 	WR_control( address);	  	   	   		   //写地址命令
	mov R16,R20
	xcall _WR_control
	.dbline -2
L33:
	.dbline 0 ; func end
	xjmp pop_xgsetF00C
	.dbsym r address 20 c
	.dbsym r y 22 c
	.dbsym r x 10 c
	.dbend
	.dbfunc e LCD_Write_string _LCD_Write_string fV
;              s -> R20,R21
;              Y -> R12
;              X -> R10
	.even
_LCD_Write_string::
	xcall push_xgset303C
	mov R12,R18
	mov R10,R16
	ldd R20,y+6
	ldd R21,y+7
	.dbline -1
	.dbline 114
; }
; //**************************************************************************
; /*******************************************************/
; /******   函数名称: LCD_write_string()            ******/
; /******   功    能: 中英文字符串显示函数          ******/
; /******   参    数: *s--英文字符串指针            ******/
; /******             X、Y--显示字符串的位置        ******/
; /******   返回值  : 无                            ******/
; /*******************************************************/
; void LCD_Write_string(unsigned char X,unsigned char Y,unsigned char *s)
; {
	.dbline 116
;     
;  	LCD_address( X, Y );		   				//写显示地址
	mov R18,R12
	mov R16,R10
	xcall _LCD_address
	xjmp L43
L42:
	.dbline 118
;     while (*s) 	   	 						//是否到字符串尾
;     {
	.dbline 119
;      	WR_dat (*s );						//写显示数据
	movw R30,R20
	ldd R16,z+0
	xcall _WR_dat
	.dbline 120
; 		s ++;								//字符串地址加1
	subi R20,255  ; offset = 1
	sbci R21,255
	.dbline 121
;  	}
L43:
	.dbline 117
	movw R30,R20
	ldd R2,z+0
	tst R2
	brne L42
X11:
	.dbline -2
L41:
	.dbline 0 ; func end
	xjmp pop_xgset303C
	.dbsym r s 20 pc
	.dbsym r Y 12 c
	.dbsym r X 10 c
	.dbend
	.dbfunc e BCD_ASCII _BCD_ASCII fc
;            bcd -> R16
	.even
_BCD_ASCII::
	.dbline -1
	.dbline 133
; }
; 
; 
; /******************************************************************************/ 
; //函数功能:将BCD码转换为ASCII码函数 
; //输入数据:BCD
; //输出:ASCII
; //作者:韩红瑞
; //修改时间:2006-08-31
; /******************************************************************************/ 
; unsigned char BCD_ASCII(unsigned char bcd) 
; { 
	.dbline 134
;     bcd &= 0x0F; 
	andi R16,15
	.dbline 135
;     if(bcd > 9)  
	ldi R24,9
	cp R24,R16
	brsh L46
X12:
	.dbline 136
;     bcd +=('7');     // 将A~F转换为ASCII 
	subi R16,201    ; addi 55
	xjmp L47
L46:
	.dbline 138
;     else 
;     bcd += '0';         // 将0~9转换为ASCII 0~9 
	subi R16,208    ; addi 48
L47:
	.dbline 139
;     return(bcd); 
	.dbline -2
L45:
	.dbline 0 ; func end
	ret
	.dbsym r bcd 16 c
	.dbend
	.dbfunc e LCD_writeasc _LCD_writeasc fV
;           data -> y+4
;              y -> R12
;              x -> R10
	.even
_LCD_writeasc::
	xcall push_xgset003C
	mov R12,R18
	mov R10,R16
	.dbline -1
	.dbline 144
; } 
;  
; 
; void  LCD_writeasc(unsigned char x, unsigned char y, unsigned char data)
; {
	.dbline 145
;     LCD_address(x,y);
	mov R18,R12
	mov R16,R10
	xcall _LCD_address
	.dbline 146
; 	WR_dat(data);
	ldd R16,y+4
	xcall _WR_dat
	.dbline -2
L48:
	.dbline 0 ; func end
	xjmp pop_xgset003C
	.dbsym l data 4 c
	.dbsym r y 12 c
	.dbsym r x 10 c
	.dbend
	.dbfunc e Lcd_INT _Lcd_INT fV
	.even
_Lcd_INT::
	.dbline -1
	.dbline 150
; }
;   
; void Lcd_INT()
; {
	.dbline 151
;   DDRA|=BIT(1);
	sbi 0x1a,1
	.dbline 152
;   DDRA|=BIT(3);
	sbi 0x1a,3
	.dbline 153
;   lcd_control();
	xcall _lcd_control
	.dbline -2
L49:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e lcd_writechar _lcd_writechar fV
;         number -> R10
;              Y -> R14
;              X -> R12
	.even
_lcd_writechar::
	xcall push_xgset00FC
	mov R14,R18
	mov R12,R16
	ldd R10,y+6
	.dbline -1
	.dbline 157
; }
; 
; void lcd_writechar(unsigned char X,unsigned char Y,unsigned char number)
; {
	.dbline 158
;     LCD_address(X,Y);
	mov R18,R14
	mov R16,R12
	xcall _LCD_address
	.dbline 159
; 	WR_dat(BCD_ASCII(number>>4));
	mov R16,R10
	swap R16
	andi R16,#0x0F
	xcall _BCD_ASCII
	xcall _WR_dat
	.dbline 160
; 	WR_dat(BCD_ASCII(number));
	mov R16,R10
	xcall _BCD_ASCII
	xcall _WR_dat
	.dbline -2
L50:
	.dbline 0 ; func end
	xjmp pop_xgset00FC
	.dbsym r number 10 c
	.dbsym r Y 14 c
	.dbsym r X 12 c
	.dbend
	.dbfunc e lcd_write2 _lcd_write2 fV
;         number -> R10
;              Y -> R14
;              X -> R12
	.even
_lcd_write2::
	xcall push_xgset00FC
	mov R14,R18
	mov R12,R16
	ldd R10,y+6
	.dbline -1
	.dbline 164
; }
; 
; void lcd_write2(unsigned char X,unsigned char Y,unsigned char number)
; {
	.dbline 165
;     LCD_address(X,Y);
	mov R18,R14
	mov R16,R12
	xcall _LCD_address
	.dbline 166
; 	WR_dat(BCD_ASCII(number%100/10));
	ldi R17,100
	mov R16,R10
	xcall mod8u
	ldi R17,10
	xcall div8u
	xcall _BCD_ASCII
	xcall _WR_dat
	.dbline 167
; 	WR_dat(BCD_ASCII(number%10));
	ldi R17,10
	mov R16,R10
	xcall mod8u
	xcall _BCD_ASCII
	xcall _WR_dat
	.dbline -2
L51:
	.dbline 0 ; func end
	xjmp pop_xgset00FC
	.dbsym r number 10 c
	.dbsym r Y 14 c
	.dbsym r X 12 c
	.dbend
	.area lit(rom, con, rel)
_Bitmap::
	.byte 0,0
	.byte 0,0
	.byte 0,128
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,130
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 1,6
	.byte 12,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 2,4
	.byte 8,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 4,4

⌨️ 快捷键说明

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