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

📄 ds1302_18b20_1602.lst

📁 这是一个用温度计和时钟程序,芯片是ATmega16,电路稳定,绝对好用而且易懂
💻 LST
📖 第 1 页 / 共 4 页
字号:
__text_start:
__start:
      78 E5CF      LDI	R28,0x5F
      79 E0D4      LDI	R29,4
      7A BFCD      OUT	0x3D,R28
      7B BFDE      OUT	0x3E,R29
      7C 51CE      SUBI	R28,0x1E
      7D 40D0      SBCI	R29,0
      7E EA0A      LDI	R16,0xAA
      7F 8308      STD	Y+0,R16
      80 2400      CLR	R0
      81 ECEA      LDI	R30,0xCA
      82 E0F0      LDI	R31,0
      83 E010      LDI	R17,0
      84 3DE2      CPI	R30,0xD2
      85 07F1      CPC	R31,R17
      86 F011      BEQ	0x0089
      87 9201      ST	R0,Z+
      88 CFFB      RJMP	0x0084
      89 8300      STD	Z+0,R16
      8A E8E5      LDI	R30,0x85
      8B E0F0      LDI	R31,0
      8C E6A0      LDI	R26,0x60
      8D E0B0      LDI	R27,0
      8E E010      LDI	R17,0
      8F E000      LDI	R16,0
      90 BF0B      OUT	0x3B,R16
      91 3EEF      CPI	R30,0xEF
      92 07F1      CPC	R31,R17
      93 F021      BEQ	0x0098
      94 95C8      LPM
      95 9631      ADIW	R30,1
      96 920D      ST	R0,X+
      97 CFF9      RJMP	0x0091
      98 940E 02A0 CALL	_main
_exit:
      9A CFFF      RJMP	_exit
FILE: E:\MyDesign\ICCAVR\ATmega16_DEV\DS1302\LCD_1602_4wires.h
(0001) /*============================================================
(0002) 工程:字符型液晶通用六线驱动
(0003) 作者:朱海峰		
(0004) 日期:2007.02.28
(0005) E_mail:ntzhf100@163.com
(0006) 液晶指令说明:
(0007) 0x08==============>关闭显示
(0008) 0x0c==============>开显示
(0009) 0x01==============>清除LCD的显示内容
(0010) 0x06==============>移动光标
(0011) 0x0c==============>显示开,光标关
(0012) 0x28==============>16*2显示,5*7点阵,4位数据
(0013) 0x1c==============>字符右移一格
(0014) 0x18==============>字符左移一格
(0015) 0x10==============>光标右移一格
(0016) 0x14==============>光标左移一格
(0017) 显示地址:
(0018) ===============================================================
(0019) =0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07 ................ 0x27=
(0020) =0x40 0x41 0x42 0x43 0x44 0x45 0x46 0x47 ................ 0x67=
(0021) ===============================================================
(0022) 每行可以显示40个字符,可以看到的只有16个字符,可以通过指令使字符
(0023) 整体移动来显示所有字符。
(0024) LCD_write_byte函数功能:当cmd=0时,向LCD写入数据,否则向LCD写
(0025)                    入命令
(0026) 四线控制的方式:先送字节的高四位,在送低四位。
(0027) 值得注意的是当使用的I/O口为高四位时数据先给另一个变量,变量再将
(0028) 数据高四位送到I/O口,接着是将变量左移四位,再送到I/O口上去。
(0029) 当使用的I/O口为低四位时数据先给另一个变量,变量右移四位后送到I/O
(0030) 口上去,接着将数据给变量直接送入I/O口。
(0031) 使用时注意一下。
(0032) ============================================================*/
(0033) #include <iom16v.h>
(0034) #include <macros.h>
(0035) #include "def.h"
(0036) /*-----------------------------------------------------
(0037) Public function prototypes
(0038) -------------------------------------------------------*/
(0039) void LCD_init         		(void);
(0040) void LCD_write_byte         (uint8_t cmd,uint8_t data);
(0041) void LCD_Write_half_byte    (void);
(0042) void LCD_set_xy             (uint8_t x, uint8_t y);
(0043) void LCD_write_string       (uint8_t X,uint8_t Y,uint8_t *s);
(0044) void Move					(uint8_t step,uint8_t dirction,uint16_t time);
(0045) void Flash_lcd				(uint16_t delay_t,uint8_t times);
(0046) void Delay_nms				(uint16_t ms);
(0047) 
(0048) uint8_t data_temp;
(0049) //==================================================
(0050) void LCD_init(void)
(0051)   {
(0052) 	Delay_nms(50);                 
_LCD_init:
      9B E302      LDI	R16,0x32
      9C E010      LDI	R17,0
      9D D096      RCALL	_Delay_nms
(0053)     Delay_nms(1); 
      9E E001      LDI	R16,1
      9F E010      LDI	R17,0
      A0 D093      RCALL	_Delay_nms
(0054)     LCD_write_byte(1,0x28); 	  //4bit test    显示模式设置(不检测忙信号) 
      A1 E228      LDI	R18,0x28
      A2 E001      LDI	R16,1
      A3 D01C      RCALL	_LCD_write_byte
(0055)     Delay_nms(1);  
      A4 E001      LDI	R16,1
      A5 E010      LDI	R17,0
      A6 D08D      RCALL	_Delay_nms
(0056)     LCD_write_byte(1,0x08);         // 显示关闭 
      A7 E028      LDI	R18,0x8
      A8 E001      LDI	R16,1
      A9 D016      RCALL	_LCD_write_byte
(0057)     Delay_nms(1); 
      AA E001      LDI	R16,1
      AB E010      LDI	R17,0
      AC D087      RCALL	_Delay_nms
(0058)     LCD_write_byte(1,0x01);         // 显示清屏 
      AD E021      LDI	R18,1
      AE E001      LDI	R16,1
      AF D010      RCALL	_LCD_write_byte
(0059)     Delay_nms(1); 
      B0 E001      LDI	R16,1
      B1 E010      LDI	R17,0
      B2 D081      RCALL	_Delay_nms
(0060)     LCD_write_byte(1,0x06);         // 显示光标移动设置 
      B3 E026      LDI	R18,6
      B4 E001      LDI	R16,1
      B5 D00A      RCALL	_LCD_write_byte
(0061)     Delay_nms(1); 
      B6 E001      LDI	R16,1
      B7 E010      LDI	R17,0
      B8 D07B      RCALL	_Delay_nms
(0062)     LCD_write_byte(1,0x0C);         // 显示开及光标设置 
      B9 E02C      LDI	R18,0xC
      BA E001      LDI	R16,1
      BB D004      RCALL	_LCD_write_byte
(0063)     Delay_nms(10);
      BC E00A      LDI	R16,0xA
      BD E010      LDI	R17,0
      BE D075      RCALL	_Delay_nms
      BF 9508      RET
_LCD_write_byte:
  data                 --> R10
  cmd                  --> R20
      C0 92AA      ST	R10,-Y
      C1 934A      ST	R20,-Y
      C2 2EA2      MOV	R10,R18
      C3 2F40      MOV	R20,R16
(0064)   }
(0065) /*--------------------------------------------------
(0066) LCD_write_byte    : 英文字符显示函数
(0067) 输入参数:*s      :英文字符串指针;
(0068)           X、Y    : 显示字符串的位置,X:1-16,Y:1-2 		
(0069) ---------------------------------------------------*/
(0070) void LCD_write_byte(uint8_t cmd,uint8_t data)
(0071)   {       
(0072)     if (cmd==1)
      C4 3041      CPI	R20,1
      C5 F409      BNE	0x00C7
(0073) 	{
(0074) 	   CLR_RS();
      C6 98DA      CBI	0x1B,2
(0075) 	}
(0076) 	if (cmd==0)
      C7 2344      TST	R20
      C8 F409      BNE	0x00CA
(0077) 	{
(0078) 	   SET_RS();
      C9 9ADA      SBI	0x1B,2
(0079) 	}
(0080) 	data_temp=data;
      CA 92A0 00D1 STS	data_temp,R10
(0081) 	data_temp=data_temp>>4;
      CC 2D8A      MOV	R24,R10
      CD 9582      SWAP	R24
      CE 708F      ANDI	R24,0xF
      CF 9380 00D1 STS	data_temp,R24
(0082)     LCD_Write_half_byte();
      D1 D009      RCALL	_LCD_Write_half_byte
(0083) 	data_temp=data;
      D2 92A0 00D1 STS	data_temp,R10
(0084)     LCD_Write_half_byte();
      D4 D006      RCALL	_LCD_Write_half_byte
(0085) 	Delay_nms(1);	 
      D5 E001      LDI	R16,1
      D6 E010      LDI	R17,0
      D7 D05C      RCALL	_Delay_nms
      D8 9149      LD	R20,Y+
      D9 90A9      LD	R10,Y+
      DA 9508      RET
(0086)   }
(0087) /*----------------写高4bit到LCD------------------------*/
(0088) void LCD_Write_half_byte(void)
(0089)   {  
(0090)   	 LCD_DATA_PORT&=0xf0;	  //pc0~pc3=0
_LCD_Write_half_byte:
      DB B388      IN	R24,0x18
      DC 7F80      ANDI	R24,0xF0
      DD BB88      OUT	0x18,R24
(0091)    	 LCD_DATA_PORT=data_temp;//send high 4bit
      DE 9020 00D1 LDS	R2,data_temp
      E0 BA28      OUT	0x18,R2
(0092) 	 SET_EN();
      E1 9ADB      SBI	0x1B,3
(0093) 	 NOP();
      E2 0000      NOP
(0094) 	 CLR_EN(); 
      E3 98DB      CBI	0x1B,3
(0095) 	 NOP();
      E4 0000      NOP
      E5 9508      RET
_LCD_set_xy:
  address              --> R20
  y                    --> R20
  x                    --> R22
      E6 940E 045B CALL	push_xgsetF000
      E8 2F42      MOV	R20,R18
      E9 2F60      MOV	R22,R16
(0096)    }
(0097) 
(0098) /*----------------------------------------------------
(0099) LCD_set_xy        : 设置LCD显示的起始位置
(0100) 输入参数:x、y    : 显示字符串的位置,X:1-16,Y:1-2		
(0101) -----------------------------------------------------*/
(0102) void LCD_set_xy( uint8_t x, uint8_t y )
(0103)   {
(0104)     unsigned char address;
(0105)     if (y==1) 
      EA 3041      CPI	R20,1
      EB F419      BNE	0x00EF
(0106) 	{
(0107) 	   address=0x80-1+x;
      EC 2F46      MOV	R20,R22
      ED 5841      SUBI	R20,0x81
(0108) 	}
      EE C002      RJMP	0x00F1
(0109)     else 
(0110)     {
(0111) 	   address=0xc0-1+x;
      EF 2F46      MOV	R20,R22
      F0 5441      SUBI	R20,0x41
(0112) 	}
(0113)     LCD_write_byte(1,address);
      F1 2F24      MOV	R18,R20
      F2 E001      LDI	R16,1
      F3 DFCC      RCALL	_LCD_write_byte
      F4 940C 0460 JMP	pop_xgsetF000
_LCD_write_string:
  s                    --> R20
  Y                    --> R12
  X                    --> R10
      F6 940E 0473 CALL	push_xgset303C
      F8 2EC2      MOV	R12,R18
      F9 2EA0      MOV	R10,R16
      FA 814E      LDD	R20,Y+6
      FB 815F      LDD	R21,Y+7
(0114)   }
(0115) /*---------------------------------------------------
(0116) LCD_write_string  : 英文字符串显示函数
(0117) 输入参数:*s      :英文字符串指针;
(0118)           X、Y    : 显示字符串的位置		
(0119) ---------------------------------------------------*/
(0120) void LCD_write_string(uint8_t X,uint8_t Y,uint8_t *s)
(0121)   {
(0122)     LCD_set_xy( X, Y );   
      FC 2D2C      MOV	R18,R12
      FD 2D0A      MOV	R16,R10
      FE DFE7      RCALL	_LCD_set_xy
      FF C006      RJMP	0x0106
(0123)     while (*s) 
(0124)       {
(0125)         LCD_write_byte(0,*s);
     100 01FA      MOVW	R30,R20
     101 8120      LDD	R18,Z+0
     102 2700      CLR	R16
     103 DFBC      RCALL	_LCD_write_byte
(0126) 		s++;
     104 5F4F      SUBI	R20,0xFF
     105 4F5F      SBCI	R21,0xFF
     106 01FA      MOVW	R30,R20
     107 8020      LDD	R2,Z+0
     108 2022      TST	R2
     109 F7B1      BNE	0x0100
     10A 940C 047A JMP	pop_xgset303C
_Move:
  i                    --> R10
  time                 --> Y,+6
  dirction             --> R12
  step                 --> R20
     10C 940E 0473 CALL	push_xgset303C
     10E 2EC2      MOV	R12,R18
     10F 2F40      MOV	R20,R16
(0127)       }
(0128)   }
(0129) //=======================================================
(0130) void Move(uint8_t step,uint8_t dirction,uint16_t time)
(0131) {
(0132)  	 uint8_t i;
(0133) 	 for(i=0;i<step-1;i++)
     110 24AA      CLR	R10
     111 C007      RJMP	0x0119
(0134) 	 {
(0135) 	  	 LCD_write_byte(1,dirction);      //字符移动方向                                    
     112 2D2C      MOV	R18,R12
     113 E001      LDI	R16,1
     114 DFAB      RCALL	_LCD_write_byte
(0136)          Delay_nms(time);                //控制移动时间
     115 810E      LDD	R16,Y+6
     116 811F      LDD	R17,Y+7
     117 D01C      RCALL	_Delay_nms
     118 94A3      INC	R10
     119 2F84      MOV	R24,R20
     11A 5081      SUBI	R24,1
     11B 16A8      CP	R10,R24
     11C F3A8      BCS	0x0112
     11D 940C 047A JMP	pop_xgset303C
_Flash_lcd:
  j                    --> R10
  times                --> R14
  delay_t              --> R12
     11F 940E 0454 CALL	push_xgset00FC
     121 2EE2      MOV	R14,R18
     122 0168      MOVW	R12,R16
(0137) 	 }
(0138) }
(0139) //=========================================================
(0140) void Flash_lcd(uint16_t delay_t,uint8_t times)
(0141) {
(0142)  	 uint8_t j;
(0143) 	 for(j=0;j<times;j++)
     123 24AA      CLR	R10
     124 C00B      RJMP	0x0130
(0144) 	 {
(0145) 	  	LCD_write_byte(1,0x08);
     125 E028      LDI	R18,0x8
     126 E001      LDI	R16,1
     127 DF98      RCALL	_LCD_write_byte
(0146) 		Delay_nms(delay_t);
     128 0186      MOVW	R16,R12
     129 D00A      RCALL	_Delay_nms
(0147) 		LCD_write_byte(1,0x0c);
     12A E02C      LDI	R18,0xC
     12B E001      LDI	R16,1
     12C DF93      RCALL	_LCD_write_byte
(0148) 		Delay_nms(delay_t);
     12D 0186      MOVW	R16,R12
     12E D005      RCALL	_Delay_nms
     12F 94A3      INC	R10
     130 14AE      CP	R10,R14
     131 F398      BCS	0x0125
     132 940C 0435 JMP	pop_xgset00FC
_Delay_nms:
  i                    --> R20
  ms                   --> R16
     134 934A      ST	R20,-Y
     135 935A      ST	R21,-Y
(0149) 	 }
(0150) }
(0151) //========================================================
(0152) void Delay_nms(uint16_t ms) 
(0153) { 
     136 C00A      RJMP	0x0141
(0154)     uint16_t i; 
(0155)     while(ms--)    
(0156)    { 
(0157)      for(i=1;i<(uint16_t)(xtal*143-2);i++) 
     137 E041      LDI	R20,1
     138 E050      LDI	R21,0
     139 C002      RJMP	0x013C
     13A 5F4F      SUBI	R20,0xFF
     13B 4F5F      SBCI	R21,0xFF
     13C E786      LDI	R24,0x76
     13D E094      LDI	R25,4
     13E 1748      CP	R20,R24
     13F 0759      CPC	R21,R25
     140 F3C8      BCS	0x013A
     141 0118      MOVW	R2,R16
     142 5001      SUBI	R16,1
     143 4010      SBCI	R17,0
     144 2022      TST	R2
     145 F789      BNE	0x0137
     146 2033      TST	R3
     147 F779      BNE	0x0137
     148 9159      LD	R21,Y+
     149 9149      LD	R20,Y+
     14A 9508      RET
_Temp_display:
  temp_decimal         --> R20
  temp_num             --> R12
  temp_l               --> R22
  temp_h               --> R10
  Th                   --> R22
  Tl                   --> R12
     14B 940E 0481 CALL	push_xgsetF03C
     14D 2F62      MOV	R22,R18
     14E 2EC0      MOV	R12,R16
     14F 9722      SBIW	R28,2
FILE: E:\MyDesign\ICCAVR\ATmega16_DEV\DS1302\DS18B20.h
(0001) /**************************************************
(0002) *Progect: Temperature measure with DS18B20
(0003) */
(0004) #include <iom16v.h>
(0005) #include <macros.h>
(0006) #include "def.h"
(0007) 
(0008) void Delay_us(uint16_t us);
(0009) uint8_t Init_18b20(void);
(0010) uint8_t Read_1_byte(void);
(0011) void Write_1_byte(uint8_t cmd);
(0012) void Write_1(void);
(0013) void Write_0(void);
(0014) void Temperature(uint8_t Th,uint8_t Tl);
(0015) void Temp_display(uint8_t Tl,uint8_t Th);
(0016) /*************************************************/
(0017) void Temp_display(uint8_t Tl,uint8_t Th)
(0018) {
(0019)  	 	uint8_t temp_h,temp_l,temp_num,temp_decimal;
(0020) 		temp_decimal=Tl;
     150 2D4C      MOV	R20,R12
(0021) 		temp_h=Th<<4;
     151 2F86      MOV	R24,R22
     152 708F      ANDI	R24,0xF
     153 9582      SWAP	R24
(0022) 		temp_l=Tl>>4;
     154 2D6C      MOV	R22,R12
     155 9562      SWAP	R22
     156 706F      ANDI	R22,0xF
(0023) 		temp_num=(temp_h|temp_l);
     157 2EC8      MOV	R12,R24
     158 2AC6      OR	R12,R22
(0024) 		temp_decimal&=0x0f;
     159 704F      ANDI	R20,0xF
(0025) 		temp_h=(temp_num/10);
     15A E01A      LDI	R17,0xA
     15B 2D0C      MOV	R16,R12
     15C 940E 041F CALL	div8u
     15E 2EA0      MOV	R10,R16
(0026) 		temp_l=(temp_num%10);
     15F E01A      LDI	R17,0xA
     160 2D0C      MOV	R16,R12
     161 940E 041D CALL	mod8u
     163 2F60      MOV	R22,R16

⌨️ 快捷键说明

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