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

📄 8563.lst

📁 基于ATMEGA16的时钟芯片原代码
💻 LST
📖 第 1 页 / 共 3 页
字号:
__start:
__text_start:
    0050 E5CF      LDI	R28,0x5F
    0051 E0D4      LDI	R29,4
    0052 BFCD      OUT	0x3D,R28
    0053 BFDE      OUT	0x3E,R29
    0054 51C0      SUBI	R28,0x10
    0055 40D0      SBCI	R29,0
    0056 EA0A      LDI	R16,0xAA
    0057 8308      STD	Y+0,R16
    0058 2400      CLR	R0
    0059 EAEC      LDI	R30,0xAC
    005A E0F0      LDI	R31,0
    005B E010      LDI	R17,0
    005C 3AEF      CPI	R30,0xAF
    005D 07F1      CPC	R31,R17
    005E F011      BEQ	0x0061
    005F 9201      ST	R0,Z+
    0060 CFFB      RJMP	0x005C
    0061 8300      STD	Z+0,R16
    0062 E5E4      LDI	R30,0x54
    0063 E0F0      LDI	R31,0
    0064 E6A0      LDI	R26,0x60
    0065 E0B0      LDI	R27,0
    0066 E010      LDI	R17,0
    0067 3AE0      CPI	R30,0xA0
    0068 07F1      CPC	R31,R17
    0069 F021      BEQ	0x006E
    006A 95C8      LPM
    006B 9631      ADIW	R30,1
    006C 920D      ST	R0,X+
    006D CFF9      RJMP	0x0067
    006E 940E0265  CALL	_main
_exit:
    0070 CFFF      RJMP	_exit
_delay:
  i                    --> R20
  n                    --> R16
    0071 940E037C  CALL	push_gset1
FILE: H:\bbi项目源程序\8563时钟芯片\lcd.h
(0001) #define LCD_DATAL PORTA&=~BIT(1)
(0002) #define LCD_DATAH PORTA|=BIT(1) 
(0003) #define LCD_CLKL PORTA&=~BIT(3)
(0004) #define LCD_CLKH PORTA|=BIT(3)
(0005) void delay(unsigned char n)
(0006) {	 
(0007) 	 unsigned char i;
(0008)  	 for(i=0;i<n;i++)                //延时
    0073 2744      CLR	R20
    0074 C002      RJMP	0x0077
(0009) 	 {asm("nop");}
    0075 0000      NOP
    0076 9543      INC	R20
    0077 1740      CP	R20,R16
    0078 F3E0      BCS	0x0075
    0079 940E037F  CALL	pop_gset1
    007B 9508      RET
_lcd_out:
  i                    --> R20
  send_byte            --> R22
    007C 940E037A  CALL	push_gset2
    007E 2F60      MOV	R22,R16
(0010) }
(0011) //*************************************************************************
(0012) 
(0013) //***************************************************************************
(0014) void lcd_out(unsigned char send_byte)
(0015) {    
(0016)     unsigned char i;
(0017)  	for (i=0;i<8;i++)
    007F 2744      CLR	R20
    0080 C009      RJMP	0x008A
(0018) 	{
(0019) 	 if((send_byte&0x80)==0)
    0081 FD67      SBRC	R22,7
    0082 C002      RJMP	0x0085
(0020) 	 {
(0021) 	     LCD_DATAL;
    0083 98D9      CBI	0x1B,1
(0022) 	 }
    0084 C001      RJMP	0x0086
(0023) 	 else
(0024) 	 {
(0025) 	     LCD_DATAH;
    0085 9AD9      SBI	0x1B,1
(0026) 	 }      //送数据
(0027) 	 LCD_CLKL;
    0086 98DB      CBI	0x1B,3
(0028) 	 LCD_CLKH;
    0087 9ADB      SBI	0x1B,3
(0029) 	 send_byte=send_byte<<1;
    0088 0F66      LSL	R22
    0089 9543      INC	R20
    008A 3048      CPI	R20,0x8
    008B F3A8      BCS	0x0081
(0030) 	}
(0031) 	delay(256);
    008C E000      LDI	R16,0
    008D DFE3      RCALL	_delay
    008E 940E036E  CALL	pop_gset2
    0090 9508      RET
_WR_dat:
  s                    --> R20
  dat                  --> R22
    0091 940E037A  CALL	push_gset2
    0093 2F60      MOV	R22,R16
(0032) }
(0033) //***************************************************************************
(0034) 
(0035) void WR_dat(unsigned char dat)
(0036) {
(0037)      unsigned char s;
(0038) 	 s=dat&0xf0;
    0094 2F46      MOV	R20,R22
    0095 7F40      ANDI	R20,0xF0
(0039) 	 lcd_out(0xfa);
    0096 EF0A      LDI	R16,0xFA
    0097 DFE4      RCALL	_lcd_out
(0040) 	 lcd_out(s);
    0098 2F04      MOV	R16,R20
    0099 DFE2      RCALL	_lcd_out
(0041) 	 s=dat&0x0f;
    009A 2F46      MOV	R20,R22
    009B 704F      ANDI	R20,0xF
(0042) 	 s<<=4;
    009C 2F84      MOV	R24,R20
    009D 708F      ANDI	R24,0xF
    009E 9582      SWAP	R24
    009F 2F48      MOV	R20,R24
(0043) 	 lcd_out(s);
    00A0 2F08      MOV	R16,R24
    00A1 DFDA      RCALL	_lcd_out
    00A2 940E036E  CALL	pop_gset2
    00A4 9508      RET
_WR_control:
  s                    --> R20
  dat                  --> R22
    00A5 940E037A  CALL	push_gset2
    00A7 2F60      MOV	R22,R16
(0044) }
(0045) //**************************************************************************
(0046) void WR_control(unsigned char dat)
(0047) {
(0048)      unsigned char s;
(0049) 	 s=dat&0xf0;
    00A8 2F46      MOV	R20,R22
    00A9 7F40      ANDI	R20,0xF0
(0050) 	 lcd_out(0xf8);
    00AA EF08      LDI	R16,0xF8
    00AB DFD0      RCALL	_lcd_out
(0051) 	 lcd_out(s);
    00AC 2F04      MOV	R16,R20
    00AD DFCE      RCALL	_lcd_out
(0052) 	 s=dat&0x0f;
    00AE 2F46      MOV	R20,R22
    00AF 704F      ANDI	R20,0xF
(0053) 	 s<<=4;
    00B0 2F84      MOV	R24,R20
    00B1 708F      ANDI	R24,0xF
    00B2 9582      SWAP	R24
    00B3 2F48      MOV	R20,R24
(0054) 	 lcd_out(s);
    00B4 2F08      MOV	R16,R24
    00B5 DFC6      RCALL	_lcd_out
    00B6 940E036E  CALL	pop_gset2
    00B8 9508      RET
(0055) }
(0056) //**************************************************************************
(0057) void lcd_control()
(0058) {
(0059) 	WR_control(0x30);
_lcd_control:
    00B9 E300      LDI	R16,0x30
    00BA DFEA      RCALL	_WR_control
(0060) 	WR_control(0x0c);
    00BB E00C      LDI	R16,0xC
    00BC DFE8      RCALL	_WR_control
    00BD 9508      RET
_lcd_clear:
  i                    --> R20
    00BE 940E037C  CALL	push_gset1
(0061) }
(0062) /**************************************************************************/
(0063) void lcd_clear()
(0064) {
(0065)   int i;
(0066)   WR_control(0x01);
    00C0 E001      LDI	R16,1
    00C1 DFE3      RCALL	_WR_control
(0067)   for(i=0;i<5000;i++)	//	延时5ms
    00C2 2744      CLR	R20
    00C3 2755      CLR	R21
(0068) 	{
(0069) 		asm("nop");
    00C4 0000      NOP
(0070) 		asm("nop");
    00C5 0000      NOP
    00C6 5F4F      SUBI	R20,0xFF
    00C7 4F5F      SBCI	R21,0xFF
    00C8 3848      CPI	R20,0x88
    00C9 E1E3      LDI	R30,0x13
    00CA 075E      CPC	R21,R30
    00CB F3C4      BLT	0x00C4
    00CC 940E037F  CALL	pop_gset1
    00CE 9508      RET
_LCD_address:
  address              --> R20
  y                    --> R22
  x                    --> R20
    00CF 940E037A  CALL	push_gset2
    00D1 2F62      MOV	R22,R18
    00D2 2F40      MOV	R20,R16
(0071) 		
(0072) 	} 
(0073) }
(0074) /*******************************************************/
(0075) /******   函数名称: LCD_set_xy()                  ******/
(0076) /******   功    能: 设置LCD显示坐标               ******/
(0077) /******   参    数: 显示字符串的位置,X:0-15,Y:0-1*****/
(0078) /******   返回值  : 无                            ******/
(0079) /*******************************************************/
(0080) void LCD_address( unsigned char x, unsigned char y )
(0081) {
(0082)  	unsigned char address;
(0083) 	switch(x)
    00D3 2755      CLR	R21
    00D4 3040      CPI	R20,0
    00D5 0745      CPC	R20,R21
    00D6 F069      BEQ	0x00E4
    00D7 3041      CPI	R20,1
    00D8 E0E0      LDI	R30,0
    00D9 075E      CPC	R21,R30
    00DA F061      BEQ	0x00E7
    00DB 3042      CPI	R20,2
    00DC E0E0      LDI	R30,0
    00DD 075E      CPC	R21,R30
    00DE F059      BEQ	0x00EA
    00DF 3043      CPI	R20,3
    00E0 E0E0      LDI	R30,0
    00E1 075E      CPC	R21,R30
    00E2 F051      BEQ	0x00ED
    00E3 C00C      RJMP	0x00F0
(0084) 	{
(0085) 	 	case 0:
(0086) 			   address = 0x80 + y;		   //计算显示地址
    00E4 2F46      MOV	R20,R22
    00E5 5840      SUBI	R20,0x80
(0087) 			   break;
    00E6 C00B      RJMP	0x00F2
(0088) 		case 1:
(0089) 			   address = 0x90 + y;		   //计算显示地址
    00E7 2F46      MOV	R20,R22
    00E8 5740      SUBI	R20,0x70
(0090) 			   break;
    00E9 C008      RJMP	0x00F2
(0091) 		case 2:
(0092) 			   address = 0x88 + y;		   //计算显示地址
    00EA 2F46      MOV	R20,R22
    00EB 5748      SUBI	R20,0x78
(0093) 			   break;
    00EC C005      RJMP	0x00F2
(0094) 		case 3:
(0095) 			   address = 0x98 + y;		   //计算显示地址
    00ED 2F46      MOV	R20,R22
    00EE 5648      SUBI	R20,0x68
(0096) 			   break;
    00EF C002      RJMP	0x00F2
(0097) 		default:address = 0x80 + y;
    00F0 2F46      MOV	R20,R22
    00F1 5840      SUBI	R20,0x80
(0098) 	}
(0099) 	WR_control( address);	  	   	   		   //写地址命令
    00F2 2F04      MOV	R16,R20
    00F3 DFB1      RCALL	_WR_control
    00F4 940E036E  CALL	pop_gset2
    00F6 9508      RET
_LCD_Write_string:
  s                    --> R20
  Y                    --> R10
  X                    --> R22
    00F7 940E0378  CALL	push_gset3
    00F9 2EA2      MOV	R10,R18
    00FA 2F60      MOV	R22,R16
    00FB 814E      LDD	R20,Y+6
    00FC 815F      LDD	R21,Y+7
(0100) }
(0101) //**************************************************************************
(0102) /*******************************************************/
(0103) /******   函数名称: LCD_write_string()            ******/
(0104) /******   功    能: 中英文字符串显示函数          ******/
(0105) /******   参    数: *s--英文字符串指针            ******/
(0106) /******             X、Y--显示字符串的位置        ******/
(0107) /******   返回值  : 无                            ******/
(0108) /*******************************************************/
(0109) void LCD_Write_string(unsigned char X,unsigned char Y,unsigned char *s)
(0110) {
(0111)     
(0112)  	LCD_address( X, Y );		   				//写显示地址
    00FD 2D2A      MOV	R18,R10
    00FE 2F06      MOV	R16,R22
    00FF DFCF      RCALL	_LCD_address
    0100 C005      RJMP	0x0106
(0113)     while (*s) 	   	 						//是否到字符串尾
(0114)     {
(0115)      	WR_dat (*s );						//写显示数据
    0101 01FA      MOVW	R30,R20
    0102 8100      LDD	R16,Z+0
    0103 DF8D      RCALL	_WR_dat
(0116) 		s ++;								//字符串地址加1
    0104 5F4F      SUBI	R20,0xFF
    0105 4F5F      SBCI	R21,0xFF
    0106 01FA      MOVW	R30,R20
    0107 8020      LDD	R2,Z+0
    0108 2022      TST	R2
    0109 F7B9      BNE	0x0101
    010A 940E0371  CALL	pop_gset3
    010C 9508      RET
(0117)  	}
(0118) }
(0119) 
(0120) 
(0121) /******************************************************************************/ 
(0122) //函数功能:将BCD码转换为ASCII码函数 
(0123) //输入数据:BCD
(0124) //输出:ASCII
(0125) //作者:韩红瑞
(0126) //修改时间:2006-08-31
(0127) /******************************************************************************/ 
(0128) unsigned char BCD_ASCII(unsigned char bcd) 
(0129) { 
(0130)     bcd &= 0x0F; 
_BCD_ASCII:
  bcd                  --> R16
    010D 700F      ANDI	R16,0xF
(0131)     if(bcd > 9)  
    010E E089      LDI	R24,0x9
    010F 1780      CP	R24,R16
    0110 F410      BCC	0x0113
(0132)     bcd +=('7');     // 将A~F转换为ASCII 
    0111 5C09      SUBI	R16,0xC9
    0112 C001      RJMP	0x0114
(0133)     else 
(0134)     bcd += '0';         // 将0~9转换为ASCII 0~9 
    0113 5D00      SUBI	R16,0xD0
(0135)     return(bcd); 
    0114 9508      RET
_LCD_writeasc:
  data                 --> Y+4
  y                    --> R22
  x                    --> R20
    0115 940E037A  CALL	push_gset2
    0117 2F62      MOV	R22,R18
    0118 2F40      MOV	R20,R16
(0136) } 
(0137)  
(0138) 
(0139) void  LCD_writeasc(unsigned char x, unsigned char y, unsigned char data)
(0140) {
(0141)     LCD_address(x,y);
    0119 2F26      MOV	R18,R22
    011A 2F04      MOV	R16,R20
    011B DFB3      RCALL	_LCD_address
(0142) 	WR_dat(data);
    011C 810C      LDD	R16,Y+4
    011D DF73      RCALL	_WR_dat
    011E 940E036E  CALL	pop_gset2
    0120 9508      RET
(0143) }
(0144)   
(0145) void Lcd_INT()
(0146) {
(0147)   DDRA|=BIT(1);
_Lcd_INT:
    0121 9AD1      SBI	0x1A,1
(0148)   DDRA|=BIT(3);
    0122 9AD3      SBI	0x1A,3
(0149)   lcd_control();
    0123 DF95      RCALL	_lcd_control
    0124 9508      RET
_lcd_writechar:
  number               --> Y+4
  Y                    --> R22
  X                    --> R20
    0125 940E037A  CALL	push_gset2
    0127 2F62      MOV	R22,R18
    0128 2F40      MOV	R20,R16
(0150) }
(0151) 
(0152) void lcd_writechar(unsigned char X,unsigned char Y,unsigned char number)
(0153) {
(0154)     LCD_address(X,Y);
    0129 2F26      MOV	R18,R22
    012A 2F04      MOV	R16,R20
    012B DFA3      RCALL	_LCD_address
(0155) 	WR_dat(BCD_ASCII(number>>4));
    012C 810C      LDD	R16,Y+4
    012D 9502      SWAP	R16
    012E 700F      ANDI	R16,0xF
    012F DFDD      RCALL	_BCD_ASCII
    0130 DF60      RCALL	_WR_dat
(0156) 	WR_dat(BCD_ASCII(number));
    0131 810C      LDD	R16,Y+4
    0132 DFDA      RCALL	_BCD_ASCII
    0133 DF5D      RCALL	_WR_dat
    0134 940E036E  CALL	pop_gset2
    0136 9508      RET
_lcd_write2:
  number               --> Y+4
  Y                    --> R22
  X                    --> R20
    0137 940E037A  CALL	push_gset2
    0139 2F62      MOV	R22,R18
    013A 2F40      MOV	R20,R16
(0157) }
(0158) 
(0159) void lcd_write2(unsigned char X,unsigned char Y,unsigned char number)
(0160) {
(0161)     LCD_address(X,Y);
    013B 2F26      MOV	R18,R22
    013C 2F04      MOV	R16,R20
    013D DF91      RCALL	_LCD_address
(0162) 	WR_dat(BCD_ASCII(number%100/10));
    013E E614      LDI	R17,0x64
    013F 810C      LDD	R16,Y+4
    0140 940E0356  CALL	mod8u
    0142 E01A      LDI	R17,0xA
    0143 940E0358  CALL	div8u
    0145 DFC7      RCALL	_BCD_ASCII
    0146 DF4A      RCALL	_WR_dat
(0163) 	WR_dat(BCD_ASCII(number%10));
    0147 E01A      LDI	R17,0xA
    0148 810C      LDD	R16,Y+4
    0149 940E0356  CALL	mod8u
    014B DFC1      RCALL	_BCD_ASCII
    014C DF44      RCALL	_WR_dat
    014D 940E036E  CALL	pop_gset2
    014F 9508      RET
FILE: H:\bbi项目源程序\8563时钟芯片\delay.h
(0001) //#define 	F_CPU 		12000000
(0002) #define 	F_CPU 		11059200

⌨️ 快捷键说明

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