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

📄 014.lst

📁 LCD1602液晶屏的四线驱动模块
💻 LST
📖 第 1 页 / 共 2 页
字号:
__start:
__text_start:
    002E E5CF      LDI	R28,0x5F
    002F E0D4      LDI	R29,4
    0030 BFCD      OUT	0x3D,R28
    0031 BFDE      OUT	0x3E,R29
    0032 51C0      SUBI	R28,0x10
    0033 40D0      SBCI	R29,0
    0034 EA0A      LDI	R16,0xAA
    0035 8308      STD	Y+0,R16
    0036 2400      CLR	R0
    0037 E6E8      LDI	R30,0x68
    0038 E0F0      LDI	R31,0
    0039 E010      LDI	R17,0
    003A 36E8      CPI	R30,0x68
    003B 07F1      CPC	R31,R17
    003C F011      BEQ	0x003F
    003D 9201      ST	R0,Z+
    003E CFFB      RJMP	0x003A
    003F 8300      STD	Z+0,R16
    0040 E5E4      LDI	R30,0x54
    0041 E0F0      LDI	R31,0
    0042 E6A0      LDI	R26,0x60
    0043 E0B0      LDI	R27,0
    0044 E010      LDI	R17,0
    0045 35EC      CPI	R30,0x5C
    0046 07F1      CPC	R31,R17
    0047 F021      BEQ	0x004C
    0048 95C8      LPM
    0049 9631      ADIW	R30,1
    004A 920D      ST	R0,X+
    004B CFF9      RJMP	0x0045
    004C 940E004F  CALL	_main
_exit:
    004E CFFF      RJMP	_exit
_main:
  temp                 --> R20
    004F 9721      SBIW	R28,1
FILE: D:\MYJOB~1\AVR资料\示例程序\DS1302-LCD1602-4bitBUS\main.c
(0001) /*
(0002) 实验LCD四线驱动程序:
(0003) 
(0004) 	DS1302时钟实险,LCD1602四线驱动显示。
(0005) 	1、设置和读取DS1302内部时钟,并通过LCD1602四线驱动显示。
(0006) 	2、内部1 M晶振,程序采用单任务方式,软件延时。
(0007) 	3、进行此实验请插上PB4-PB7、PD3、PD4、PD6,PC4、PC7短路块。
(0008) 	4、DS1302芯片接口占用JTAG仿真接口,在做实验时需要关闭mega16的JTAG功能。
(0009) 	5、此实验需要有LCD1602显示屏才可以显示。
(0010) 	6、此实验对硬件及芯片的综合知识要求比较高,所以建议大家把此实验放到后面。
(0011) 
(0012) 	此实验参照了版主tonghe的DS1302时钟程序。
(0013) 
(0014) 	AVR  mega16学习板
(0015) 	www.iccavr.com
(0016) 	10:44 2007-8-7
(0017) */
(0018) 
(0019) #include "iom16v.h"
(0020) #include "ds1302.h"
(0021) #include "lcd1602.h"
(0022) 
(0023) void main(void) {
(0024) 
(0025) 	unsigned char temp;
(0026) 
(0027) 	PORTA = 0xFF;				/*打开上拉*/
    0050 EF8F      LDI	R24,0xFF
    0051 BB8B      OUT	0x1B,R24
(0028) 	DDRA = 0x00;				/*方向输入*/
    0052 2422      CLR	R2
    0053 BA2A      OUT	0x1A,R2
(0029) 	PORTB = 0xF0;				/*电平设置*/
    0054 EF80      LDI	R24,0xF0
    0055 BB88      OUT	0x18,R24
(0030) 	DDRB = 0xFF;				/*方向输出*/
    0056 EF8F      LDI	R24,0xFF
    0057 BB87      OUT	0x17,R24
(0031) 	PORTC = 0x7F;
    0058 E78F      LDI	R24,0x7F
    0059 BB85      OUT	0x15,R24
(0032) 	DDRC = 0x80;
    005A E880      LDI	R24,0x80
    005B BB84      OUT	0x14,R24
(0033) 	PORTD = 0xFF;
    005C EF8F      LDI	R24,0xFF
    005D BB82      OUT	0x12,R24
(0034) 	DDRD = 0x00;
    005E BA21      OUT	0x11,R2
(0035) 
(0036) 	delay_ms(200);
    005F EC08      LDI	R16,0xC8
    0060 940E01B5  CALL	_delay_ms
(0037) 	LCD_init();
    0062 940E0240  CALL	_LCD_init
(0038) 	ds1302_init();
    0064 940E01A5  CALL	_ds1302_init
(0039) 	delay_ms(10);
    0066 E00A      LDI	R16,0xA
    0067 940E01B5  CALL	_delay_ms
(0040) 	ds1302_write_time();
    0069 940E015C  CALL	_ds1302_write_time
    006B C0A4      RJMP	0x0110
(0041) 
(0042) 	while (1) {
(0043) 		delay_ms(200);
    006C EC08      LDI	R16,0xC8
    006D 940E01B5  CALL	_delay_ms
(0044) 		ds1302_read_time();
    006F 940E0186  CALL	_ds1302_read_time
(0045) 		LCD_clear();
    0071 940E020D  CALL	_LCD_clear
(0046) 				
(0047) 		temp = (time_buf[0] >> 4) + '0';
    0073 91400060  LDS	R20,time_buf
    0075 9542      SWAP	R20
    0076 704F      ANDI	R20,0xF
    0077 5D40      SUBI	R20,0xD0
(0048) 		LCD_write_char(0, 0, temp);/*年*/
    0078 8348      STD	Y+0,R20
    0079 2722      CLR	R18
    007A 2700      CLR	R16
    007B 940E022E  CALL	_LCD_write_char
(0049) 		temp = (time_buf[0] & 0x0F) + '0';
    007D 91400060  LDS	R20,time_buf
    007F 704F      ANDI	R20,0xF
    0080 5D40      SUBI	R20,0xD0
(0050) 		LCD_write_char(1, 0, temp);
    0081 8348      STD	Y+0,R20
    0082 2722      CLR	R18
    0083 E001      LDI	R16,1
    0084 940E022E  CALL	_LCD_write_char
(0051) 		temp = (time_buf[1] >> 4) + '0';
    0086 91400061  LDS	R20,time_buf+1
    0088 9542      SWAP	R20
    0089 704F      ANDI	R20,0xF
    008A 5D40      SUBI	R20,0xD0
(0052) 		LCD_write_char(2, 0, temp);
    008B 8348      STD	Y+0,R20
    008C 2722      CLR	R18
    008D E002      LDI	R16,2
    008E 940E022E  CALL	_LCD_write_char
(0053) 		temp = (time_buf[1] & 0x0F) + '0';
    0090 91400061  LDS	R20,time_buf+1
    0092 704F      ANDI	R20,0xF
    0093 5D40      SUBI	R20,0xD0
(0054) 		LCD_write_char(3, 0, temp);
    0094 8348      STD	Y+0,R20
    0095 2722      CLR	R18
    0096 E003      LDI	R16,3
    0097 940E022E  CALL	_LCD_write_char
(0055) 		LCD_write_char(4, 0, '-');
    0099 E28D      LDI	R24,0x2D
    009A 8388      STD	Y+0,R24
    009B 2722      CLR	R18
    009C E004      LDI	R16,4
    009D 940E022E  CALL	_LCD_write_char
(0056) 		
(0057) 		temp = (time_buf[2] >> 4) + '0';
    009F 91400062  LDS	R20,time_buf+2
    00A1 9542      SWAP	R20
    00A2 704F      ANDI	R20,0xF
    00A3 5D40      SUBI	R20,0xD0
(0058) 		LCD_write_char(5, 0, temp);/*月*/
    00A4 8348      STD	Y+0,R20
    00A5 2722      CLR	R18
    00A6 E005      LDI	R16,5
    00A7 940E022E  CALL	_LCD_write_char
(0059) 		temp = (time_buf[2] & 0x0F) + '0';
    00A9 91400062  LDS	R20,time_buf+2
    00AB 704F      ANDI	R20,0xF
    00AC 5D40      SUBI	R20,0xD0
(0060) 		LCD_write_char(6, 0, temp);
    00AD 8348      STD	Y+0,R20
    00AE 2722      CLR	R18
    00AF E006      LDI	R16,6
    00B0 940E022E  CALL	_LCD_write_char
(0061) 		LCD_write_char(7, 0, '-');
    00B2 E28D      LDI	R24,0x2D
    00B3 8388      STD	Y+0,R24
    00B4 2722      CLR	R18
    00B5 E007      LDI	R16,7
    00B6 940E022E  CALL	_LCD_write_char
(0062) 		
(0063) 		temp = (time_buf[3] >> 4) + '0';
    00B8 91400063  LDS	R20,time_buf+3
    00BA 9542      SWAP	R20
    00BB 704F      ANDI	R20,0xF
    00BC 5D40      SUBI	R20,0xD0
(0064) 		LCD_write_char(8, 0, temp);/*日*/
    00BD 8348      STD	Y+0,R20
    00BE 2722      CLR	R18
    00BF E008      LDI	R16,0x8
    00C0 940E022E  CALL	_LCD_write_char
(0065) 		temp = (time_buf[3] & 0x0F) + '0';
    00C2 91400063  LDS	R20,time_buf+3
    00C4 704F      ANDI	R20,0xF
    00C5 5D40      SUBI	R20,0xD0
(0066) 		LCD_write_char(9, 0, temp);
    00C6 8348      STD	Y+0,R20
    00C7 2722      CLR	R18
    00C8 E009      LDI	R16,0x9
    00C9 940E022E  CALL	_LCD_write_char
(0067) 		
(0068) 		temp = (time_buf[4] >> 4) + '0';
    00CB 91400064  LDS	R20,0x64
    00CD 9542      SWAP	R20
    00CE 704F      ANDI	R20,0xF
    00CF 5D40      SUBI	R20,0xD0
(0069) 		LCD_write_char(8, 1, temp);/*时*/
    00D0 8348      STD	Y+0,R20
    00D1 E021      LDI	R18,1
    00D2 E008      LDI	R16,0x8
    00D3 940E022E  CALL	_LCD_write_char
(0070) 		temp = (time_buf[4] & 0x0F) + '0';
    00D5 91400064  LDS	R20,0x64
    00D7 704F      ANDI	R20,0xF
    00D8 5D40      SUBI	R20,0xD0
(0071) 		LCD_write_char(9, 1, temp);
    00D9 8348      STD	Y+0,R20
    00DA E021      LDI	R18,1
    00DB E009      LDI	R16,0x9
    00DC 940E022E  CALL	_LCD_write_char
(0072) 		LCD_write_char(10, 1, ':');
    00DE E38A      LDI	R24,0x3A
    00DF 8388      STD	Y+0,R24
    00E0 E021      LDI	R18,1
    00E1 E00A      LDI	R16,0xA
    00E2 940E022E  CALL	_LCD_write_char
(0073) 		
(0074) 		temp = (time_buf[5] >> 4) + '0';
    00E4 91400065  LDS	R20,0x65
    00E6 9542      SWAP	R20
    00E7 704F      ANDI	R20,0xF
    00E8 5D40      SUBI	R20,0xD0
(0075) 		LCD_write_char(11, 1, temp);/*分*/
    00E9 8348      STD	Y+0,R20
    00EA E021      LDI	R18,1
    00EB E00B      LDI	R16,0xB
    00EC 940E022E  CALL	_LCD_write_char
(0076) 		temp = (time_buf[5] & 0x0F) + '0';
    00EE 91400065  LDS	R20,0x65
    00F0 704F      ANDI	R20,0xF
    00F1 5D40      SUBI	R20,0xD0
(0077) 		LCD_write_char(12, 1, temp);
    00F2 8348      STD	Y+0,R20
    00F3 E021      LDI	R18,1
    00F4 E00C      LDI	R16,0xC
    00F5 940E022E  CALL	_LCD_write_char
(0078) 		LCD_write_char(13, 1, ':');
    00F7 E38A      LDI	R24,0x3A
    00F8 8388      STD	Y+0,R24
    00F9 E021      LDI	R18,1
    00FA E00D      LDI	R16,0xD
    00FB 940E022E  CALL	_LCD_write_char
(0079) 		
(0080) 		temp = (time_buf[6] >> 4) + '0';
    00FD 91400066  LDS	R20,0x66
    00FF 9542      SWAP	R20
    0100 704F      ANDI	R20,0xF
    0101 5D40      SUBI	R20,0xD0
(0081) 		LCD_write_char(14, 1, temp);/*秒*/
    0102 8348      STD	Y+0,R20
    0103 E021      LDI	R18,1
    0104 E00E      LDI	R16,0xE
    0105 940E022E  CALL	_LCD_write_char
(0082) 		temp = (time_buf[6] & 0x0F) + '0';
    0107 91400066  LDS	R20,0x66
    0109 704F      ANDI	R20,0xF
    010A 5D40      SUBI	R20,0xD0
(0083) 		LCD_write_char(15, 1, temp);
    010B 8348      STD	Y+0,R20
    010C E021      LDI	R18,1
    010D E00F      LDI	R16,0xF
    010E 940E022E  CALL	_LCD_write_char
    0110 CF5B      RJMP	0x006C
    0111 9621      ADIW	R28,1
    0112 9508      RET
_ds1302_write_byte:
  i                    --> R20
  d                    --> R18
  addr                 --> R16
    0113 940E026C  CALL	push_gset1
FILE: D:\MYJOB~1\AVR资料\示例程序\DS1302-LCD1602-4bitBUS\ds1302.c
(0001) 
(0002) #include "iom16v.h"
(0003) 
(0004) /*复位脚*/
(0005) #define RST_CLR	PORTC &= ~(1 << PC4)/*电平置低*/
(0006) #define RST_SET	PORTC |= (1 << PC4)/*电平置高*/
(0007) #define RST_IN	DDRC &= ~(1 << PC4)/*方向输入*/
(0008) #define RST_OUT	DDRC |= (1 << PC4)/*方向输出*/
(0009) 
(0010) /*双向数据*/
(0011) #define IO_CLR	PORTC &= ~(1 << PC3)/*电平置低*/
(0012) #define IO_SET	PORTC |= (1 << PC3)/*电平置高*/
(0013) #define IO_R	PINC & (1 << PC3)/*电平读取*/
(0014) #define IO_IN	DDRC &= ~(1 << PC3)/*方向输入*/
(0015) #define IO_OUT	DDRC |= (1 << PC3)/*方向输出*/
(0016) 
(0017) /*时钟信号*/
(0018) #define SCK_CLR	PORTC &= ~(1 << PC2)/*时钟信号*/
(0019) #define SCK_SET	PORTC |= (1 << PC2)/*电平置高*/
(0020) #define SCK_IN	DDRC &= ~(1 << PC2)/*方向输入*/
(0021) #define SCK_OUT	DDRC |= (1 << PC2)/*方向输出*/
(0022) 
(0023) #define ds1302_sec_add			0x80		//秒数据地址
(0024) #define ds1302_min_add			0x82		//分数据地址
(0025) #define ds1302_hr_add			0x84		//时数据地址
(0026) #define ds1302_date_add			0x86		//日数据地址
(0027) #define ds1302_month_add		0x88		//月数据地址
(0028) #define ds1302_day_add			0x8a		//星期数据地址
(0029) #define ds1302_year_add			0x8c		//年数据地址
(0030) #define ds1302_control_add		0x8e		//控制数据地址
(0031) #define ds1302_charger_add		0x90 					 
(0032) #define ds1302_clkburst_add		0xbe
(0033) 
(0034) unsigned char time_buf[8] = {0x20,0x07,0x08,0x07,0x11,0x15,0x00,0x02};
(0035) 
(0036) /*向DS1302写入一字节数据*/
(0037) void ds1302_write_byte(unsigned char addr, unsigned char d) {
(0038) 
(0039) 	unsigned char i;
(0040) 	RST_SET;					/*启动DS1302总线*/
    0115 9AAC      SBI	0x15,4
(0041) 	
(0042) 	/*写入目标地址:addr*/
(0043) 	IO_OUT;
    0116 9AA3      SBI	0x14,3
(0044) 	addr = addr & 0xFE;/*最低位置零*/
    0117 7F0E      ANDI	R16,0xFE
(0045) 	for (i = 0; i < 8; i ++) {
    0118 2744      CLR	R20
    0119 C009      RJMP	0x0123
(0046) 		if (addr & 0x01) {
    011A FF00      SBRS	R16,0
    011B C002      RJMP	0x011E
(0047) 			IO_SET;
    011C 9AAB      SBI	0x15,3
(0048) 			}
    011D C001      RJMP	0x011F
(0049) 		else {
(0050) 			IO_CLR;
    011E 98AB      CBI	0x15,3
(0051) 			}
(0052) 		SCK_SET;
    011F 9AAA      SBI	0x15,2
(0053) 		SCK_CLR;
    0120 98AA      CBI	0x15,2
(0054) 		addr = addr >> 1;
    0121 9506      LSR	R16
    0122 9543      INC	R20
    0123 3048      CPI	R20,0x8
    0124 F3A8      BCS	0x011A
(0055) 		}
(0056) 	
(0057) 	/*写入数据:d*/
(0058) 	IO_OUT;
    0125 9AA3      SBI	0x14,3
(0059) 	for (i = 0; i < 8; i ++) {
    0126 2744      CLR	R20
    0127 C009      RJMP	0x0131
(0060) 		if (d & 0x01) {
    0128 FF20      SBRS	R18,0
    0129 C002      RJMP	0x012C
(0061) 			IO_SET;
    012A 9AAB      SBI	0x15,3
(0062) 			}
    012B C001      RJMP	0x012D
(0063) 		else {
(0064) 			IO_CLR;
    012C 98AB      CBI	0x15,3
(0065) 			}
(0066) 		SCK_SET;
    012D 9AAA      SBI	0x15,2
(0067) 		SCK_CLR;
    012E 98AA      CBI	0x15,2
(0068) 		d = d >> 1;
    012F 9526      LSR	R18
    0130 9543      INC	R20
    0131 3048      CPI	R20,0x8
    0132 F3A8      BCS	0x0128
(0069) 		}
(0070) 	RST_CLR;					/*停止DS1302总线*/
    0133 98AC      CBI	0x15,4
    0134 940E026F  CALL	pop_gset1
    0136 9508      RET
_ds1302_read_byte:
  temp                 --> R20
  i                    --> R22
  addr                 --> R16
    0137 940E026A  CALL	push_gset2
(0071) }
(0072) 
(0073) /*从DS1302读出一字节数据*/
(0074) unsigned char ds1302_read_byte(unsigned char addr) {
(0075) 
(0076) 	unsigned char i;
(0077) 	unsigned char temp;
(0078) 	RST_SET;					/*启动DS1302总线*/
    0139 9AAC      SBI	0x15,4
(0079) 
(0080) 	/*写入目标地址:addr*/
(0081) 	IO_OUT;
    013A 9AA3      SBI	0x14,3
(0082) 	addr = addr | 0x01;/*最低位置高*/
    013B 6001      ORI	R16,1
(0083) 	for (i = 0; i < 8; i ++) {
    013C 2766      CLR	R22
    013D C009      RJMP	0x0147
(0084) 		if (addr & 0x01) {
    013E FF00      SBRS	R16,0
    013F C002      RJMP	0x0142
(0085) 			IO_SET;
    0140 9AAB      SBI	0x15,3
(0086) 			}
    0141 C001      RJMP	0x0143
(0087) 		else {
(0088) 			IO_CLR;
    0142 98AB      CBI	0x15,3
(0089) 			}
(0090) 		SCK_SET;
    0143 9AAA      SBI	0x15,2
(0091) 		SCK_CLR;
    0144 98AA      CBI	0x15,2
(0092) 		addr = addr >> 1;
    0145 9506      LSR	R16
    0146 9563      INC	R22
    0147 3068      CPI	R22,0x8
    0148 F3A8      BCS	0x013E
(0093) 		}
(0094) 	
(0095) 	/*输出数据:temp*/
(0096) 	IO_IN;
    0149 98A3      CBI	0x14,3
(0097) 	for (i = 0; i < 8; i ++) {
    014A 2766      CLR	R22
    014B C009      RJMP	0x0155
(0098) 		temp = temp >> 1;
    014C 9546      LSR	R20
(0099) 		if (IO_R) {
    014D 9B9B      SBIS	0x13,3
    014E C002      RJMP	0x0151
(0100) 			temp |= 0x80;
    014F 6840      ORI	R20,0x80
(0101) 			}
    0150 C001      RJMP	0x0152
(0102) 		else {
(0103) 			temp &= 0x7F;
    0151 774F      ANDI	R20,0x7F
(0104) 			}
(0105) 		SCK_SET;
    0152 9AAA      SBI	0x15,2
(0106) 		SCK_CLR;
    0153 98AA      CBI	0x15,2
    0154 9563      INC	R22
    0155 3068      CPI	R22,0x8
    0156 F3A8      BCS	0x014C
(0107) 		}
(0108) 	
(0109) 	RST_CLR;					/*停止DS1302总线*/
    0157 98AC      CBI	0x15,4
(0110) 	return temp;
    0158 2F04      MOV	R16,R20
    0159 940E025E  CALL	pop_gset2
    015B 9508      RET
(0111) }
(0112) 
(0113) /*向DS302写入时钟数据*/
(0114) void ds1302_write_time(void) {

⌨️ 快捷键说明

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