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

📄 m16_vs1003_test.lst

📁 AVR单片机系统开发经典实例部分源程序
💻 LST
📖 第 1 页 / 共 5 页
字号:
    0592 2422      CLR	R2
    0593 9220042E  STS	key_num,R2
    0595 CD9F      RJMP	0x0335
    0596 966A      ADIW	R28,0x1A
    0597 940E141F  CALL	pop_gset5
    0599 9508      RET
FILE: C:\AVR\M\1\Usart.c
(0001) #include "Usart.h"
(0002) 
(0003) //定义fosc频率
(0004) #define fosc 16000000  
(0005) 
(0006) 
(0007) //---------------------------------
(0008) //
(0009) // USART初始化函数 
(0010) // baud:波特率
(0011) //
(0012) //---------------------------------
(0013) void Usart_Init(unsigned int baud)
(0014) {
(0015)  UCSR1B = 0x00; //disable while setting baud rate
_Usart_Init:
  baud                 --> R16
    059A 2422      CLR	R2
    059B 9220009A  STS	0x9A,R2
(0016)  UCSR1A = 0x00;
    059D 9220009B  STS	0x9B,R2
(0017)  UCSR1C = BIT(UCSZ11) | 0x06;
    059F E086      LDI	R24,6
    05A0 9380009D  STS	0x9D,R24
(0018)  UBRR1L = 0x2F; //set baud rate lo
    05A2 E28F      LDI	R24,0x2F
    05A3 93800099  STS	0x99,R24
(0019)  UBRR1H = 0x00; //set baud rate hi
    05A5 92200098  STS	0x98,R2
(0020)  UCSR1B = 0x18;
    05A7 E188      LDI	R24,0x18
    05A8 9380009A  STS	0x9A,R24
    05AA 9508      RET
(0021) }
(0022) 
(0023) 
(0024) //-----------------------------------
(0025) //
(0026) // USART发送函数 
(0027) // data:要发送的数据
(0028) //
(0029) //-----------------------------------
(0030) void Usart_Transmit(unsigned char data)
(0031) {
(0032) while(!(UCSR1A&(1<<UDRE1)));
_Usart_Transmit:
  data                 --> R16
    05AB 9020009B  LDS	R2,0x9B
    05AD FE25      SBRS	R2,5
    05AE CFFC      RJMP	_Usart_Transmit
(0033) UDR1=data;
    05AF 9300009C  STS	0x9C,R16
    05B1 9508      RET
(0034) }
(0035) 
(0036) 
(0037) //-----------------------------------
(0038) //
(0039) // USART接收函数 
(0040) // UDR:返回的数据
(0041) //
(0042) //-----------------------------------
(0043) unsigned char Usart_Receive(void)
(0044) {
(0045) while(!(UCSR1A&(1<<RXC1)));
_Usart_Receive:
    05B2 9020009B  LDS	R2,0x9B
    05B4 FE27      SBRS	R2,7
    05B5 CFFC      RJMP	_Usart_Receive
(0046) return UDR1;
    05B6 9100009C  LDS	R16,0x9C
    05B8 9508      RET
FILE: C:\AVR\M\1\3310LCD_function.c
(0001) #include <iom128v.h>
(0002) #include <macros.h>
(0003) #include "3310LCD_function.h"
(0004) #include "english_6x8_pixel.h"
(0005) #include "write_chinese_string_pixel.h"
(0006) #include "move_chinese_string_pixel.h"
(0007) #include "SPI.h"
(0008) 
(0009) void LCD_init(void)
(0010)   {
(0011)     DDRA |= LCD_RST | LCD_DC | LCD_CE;
_LCD_init:
    05B9 B38A      IN	R24,0x1A
    05BA 6780      ORI	R24,0x70
    05BB BB8A      OUT	0x1A,R24
(0012)     PORTA &= ~LCD_RST;          // 产生一个让LCD复位的低电平脉冲
    05BC 98DD      CBI	0x1B,5
(0013)     delay_1us();
    05BD 940E1302  CALL	_delay_1us
(0014)     PORTA |= LCD_RST;
    05BF 9ADD      SBI	0x1B,5
(0015)     
(0016)     PORTA &= ~LCD_CE ;		// 关闭LCD
    05C0 98DC      CBI	0x1B,4
(0017)     delay_1us();
    05C1 940E1302  CALL	_delay_1us
(0018)     PORTA |= LCD_CE;		// 使能LCD
    05C3 9ADC      SBI	0x1B,4
(0019)     delay_1us();
    05C4 940E1302  CALL	_delay_1us
(0020) 
(0021)     LCD_write_byte(0x21, 0);	// 使用扩展命令设置LCD模式
    05C6 2722      CLR	R18
    05C7 E201      LDI	R16,0x21
    05C8 D1A6      RCALL	_LCD_write_byte
(0022)     LCD_write_byte(0xc8, 0);	// 设置偏置电压
    05C9 2722      CLR	R18
    05CA EC08      LDI	R16,0xC8
    05CB D1A3      RCALL	_LCD_write_byte
(0023)     LCD_write_byte(0x06, 0);	// 温度校正
    05CC 2722      CLR	R18
    05CD E006      LDI	R16,6
    05CE D1A0      RCALL	_LCD_write_byte
(0024)     LCD_write_byte(0x13, 0);	// 1:48
    05CF 2722      CLR	R18
    05D0 E103      LDI	R16,0x13
    05D1 D19D      RCALL	_LCD_write_byte
(0025)     LCD_write_byte(0x20, 0);	// 使用基本命令
    05D2 2722      CLR	R18
    05D3 E200      LDI	R16,0x20
    05D4 D19A      RCALL	_LCD_write_byte
(0026)     LCD_clear();	        // 清屏
    05D5 D005      RCALL	_LCD_clear
(0027)     LCD_write_byte(0x0c, 0);	// 设定显示模式,正常显示
    05D6 2722      CLR	R18
    05D7 E00C      LDI	R16,0xC
    05D8 D196      RCALL	_LCD_write_byte
(0028)         
(0029)     PORTA &= ~LCD_CE ;          // 关闭LCD
    05D9 98DC      CBI	0x1B,4
    05DA 9508      RET
_LCD_clear:
  i                    --> R20
    05DB 940E142A  CALL	push_gset1
(0030)   }
(0031) 
(0032) /*-----------------------------------------------------------------------
(0033) LCD_clear         : LCD清屏函数
(0034) 
(0035) 编写日期          :2004-8-10 
(0036) 最后修改日期      :2004-8-10 
(0037) -----------------------------------------------------------------------*/
(0038) void LCD_clear(void)
(0039)   {
(0040)     unsigned int i;
(0041) 
(0042)     LCD_write_byte(0x0c, 0);			
    05DD 2722      CLR	R18
    05DE E00C      LDI	R16,0xC
    05DF D18F      RCALL	_LCD_write_byte
(0043)     LCD_write_byte(0x80, 0);			
    05E0 2722      CLR	R18
    05E1 E800      LDI	R16,0x80
    05E2 D18C      RCALL	_LCD_write_byte
(0044) 
(0045)     for (i=0; i<504; i++)
    05E3 2744      CLR	R20
    05E4 2755      CLR	R21
    05E5 C005      RJMP	0x05EB
(0046)       LCD_write_byte(0, 1);			
    05E6 E021      LDI	R18,1
    05E7 2700      CLR	R16
    05E8 D186      RCALL	_LCD_write_byte
    05E9 5F4F      SUBI	R20,0xFF
    05EA 4F5F      SBCI	R21,0xFF
    05EB 3F48      CPI	R20,0xF8
    05EC E0E1      LDI	R30,1
    05ED 075E      CPC	R21,R30
    05EE F3B8      BCS	0x05E6
    05EF 940E142D  CALL	pop_gset1
    05F1 9508      RET
_LCD_set_XY:
  Y                    --> R22
  X                    --> R20
    05F2 940E1428  CALL	push_gset2
    05F4 2F62      MOV	R22,R18
    05F5 2F40      MOV	R20,R16
(0047)   }
(0048) 
(0049) /*-----------------------------------------------------------------------
(0050) LCD_set_XY        : 设置LCD坐标函数
(0051) 
(0052) 输入参数:X       :0-83
(0053)           Y       :0-5
(0054) 
(0055) 编写日期          :2004-8-10 
(0056) 最后修改日期      :2004-8-10 
(0057) -----------------------------------------------------------------------*/
(0058) void LCD_set_XY(unsigned char X, unsigned char Y)
(0059)   {
(0060)     LCD_write_byte(0x40 | Y, 0);		// column
    05F6 2722      CLR	R18
    05F7 2F06      MOV	R16,R22
    05F8 6400      ORI	R16,0x40
    05F9 D175      RCALL	_LCD_write_byte
(0061)     LCD_write_byte(0x80 | X, 0);          	// row
    05FA 2722      CLR	R18
    05FB 2F04      MOV	R16,R20
    05FC 6800      ORI	R16,0x80
    05FD D171      RCALL	_LCD_write_byte
    05FE 940E1416  CALL	pop_gset2
    0600 9508      RET
_LCD_write_char:
  line                 --> R20
  c                    --> R22
    0601 940E1428  CALL	push_gset2
    0603 2F60      MOV	R22,R16
(0062)   }
(0063) 
(0064) /*-----------------------------------------------------------------------
(0065) LCD_write_char    : 显示英文字符
(0066) 
(0067) 输入参数:c       :显示的字符;
(0068) 
(0069) 编写日期          :2004-8-10 
(0070) 最后修改日期      :2004-8-10 
(0071) -----------------------------------------------------------------------*/
(0072) void LCD_write_char(unsigned char c)
(0073)   {
(0074)     unsigned char line;
(0075) 
(0076)     c -= 32;
    0604 5260      SUBI	R22,0x20
(0077) 
(0078)     for (line=0; line<6; line++)
    0605 2744      CLR	R20
    0606 C00F      RJMP	0x0616
(0079)       LCD_write_byte(font6x8[c][line], 1);
    0607 E021      LDI	R18,1
    0608 E086      LDI	R24,6
    0609 9F86      MUL	R24,R22
    060A 0110      MOVW	R2,R0
    060B E88C      LDI	R24,0x8C
    060C E090      LDI	R25,0
    060D 0E28      ADD	R2,R24
    060E 1E39      ADC	R3,R25
    060F 2FE4      MOV	R30,R20
    0610 27FF      CLR	R31
    0611 0DE2      ADD	R30,R2
    0612 1DF3      ADC	R31,R3
    0613 9104      LPM	R16,0(Z)
    0614 D15A      RCALL	_LCD_write_byte
    0615 9543      INC	R20
    0616 3046      CPI	R20,6
    0617 F378      BCS	0x0607
    0618 940E1416  CALL	pop_gset2
    061A 9508      RET
_LCD_write_english_string:
  s                    --> R20
  Y                    --> R10
  X                    --> R22
    061B 940E1426  CALL	push_gset3
    061D 2EA2      MOV	R10,R18
    061E 2F60      MOV	R22,R16
    061F 814E      LDD	R20,Y+6
    0620 815F      LDD	R21,Y+7
(0080)   }
(0081) 
(0082) /*-----------------------------------------------------------------------
(0083) LCD_write_english_String  : 英文字符串显示函数
(0084) 
(0085) 输入参数:*s      :英文字符串指针;
(0086)           X、Y    : 显示字符串的位置,x 0-83 ,y 0-5
(0087) 
(0088) 编写日期          :2004-8-10 
(0089) 最后修改日期      :2004-8-10 		
(0090) -----------------------------------------------------------------------*/
(0091) void LCD_write_english_string(unsigned char X,unsigned char Y,char *s)
(0092)   {
(0093)     LCD_set_XY(X,Y);
    0621 2D2A      MOV	R18,R10
    0622 2F06      MOV	R16,R22
    0623 DFCE      RCALL	_LCD_set_XY
    0624 C005      RJMP	0x062A
(0094) 	////if(X+sizeof(s)*6 >83)  X = 83- sizeof(s)*6;
(0095)     while (*s) 
(0096)       {
(0097) 	 LCD_write_char(*s);
    0625 01FA      MOVW	R30,R20
    0626 8100      LDD	R16,Z+0
    0627 DFD9      RCALL	_LCD_write_char
(0098) 	 s++;
    0628 5F4F      SUBI	R20,0xFF
    0629 4F5F      SBCI	R21,0xFF
    062A 01FA      MOVW	R30,R20
    062B 8020      LDD	R2,Z+0
    062C 2022      TST	R2
    062D F7B9      BNE	0x0625
    062E 940E1419  CALL	pop_gset3
    0630 9508      RET
_LCD_write_chinese_string:
  i                    --> R20
  n                    --> R14
  row                  --> R10
  line                 --> R12
  num                  --> R22
  ch_with              --> Y+14
  Y                    --> Y+12
  X                    --> Y+10
    0631 940E132C  CALL	push_arg4
    0633 940E1422  CALL	push_gset5
    0635 8968      LDD	R22,Y+16
    0636 88CA      LDD	R12,Y+18
    0637 88AC      LDD	R10,Y+20
(0099)       }
(0100)   }
(0101) /*-----------------------------------------------------------------------
(0102) LCD_write_chinese_string: 在LCD上显示汉字
(0103) 
(0104) 输入参数:X、Y    :显示汉字的起始X、Y坐标;
(0105)           ch_with :汉字点阵的宽度
(0106)           num     :显示汉字的个数;  
(0107)           line    :汉字点阵数组中的起始行数
(0108)           row     :汉字显示的行间距
(0109) 编写日期          :2004-8-11 
(0110) 最后修改日期      :2004-8-12 
(0111) 测试:
(0112) 	LCD_write_chi(0,0,12,7,0,0);
(0113) 	LCD_write_chi(0,2,12,7,0,0);
(0114) 	LCD_write_chi(0,4,12,7,0,0);	
(0115) -----------------------------------------------------------------------*/                        
(0116) void LCD_write_chinese_string(unsigned char X, unsigned char Y, 
(0117)                    unsigned char ch_with,unsigned char num,
(0118)                    unsigned char line,unsigned char row)
(0119)   {
(0120)     
(0121)     unsigned char i,n;
(0122)     LCD_set_XY(X,Y);                             //设置初始位置
    0638 852C      LDD	R18,Y+12
    0639 850A      LDD	R16,Y+10
    063A DFB7      RCALL	_LCD_set_XY
(0123)     
(0124)     for (i=0;i<num;)
    063B 2744      CLR	R20
    063C C032      RJMP	0x066F
(0125)       {
(0126)       	for (n=0; n<ch_with*2; n++)              //写一个汉字
    063D 24EE      CLR	R14
    063E C023      RJMP	0x0662
(0127)       	  { 
(0128)       	    if (n==ch_with)                      //写汉字的下半部分
    063F 840E      LDD	R0,Y+14
    0640 14E0      CP	R14,R0
    0641 F479      BNE	0x0651
(0129)       	      {
(0130)       	        if (i==0) LCD_set_XY(X,Y+1);
    0642 2344      TST	R20
    0643 F429      BNE	0x0649
    0644 852C      LDD	R18,Y+12
    0645 5F2F      SUBI	R18,0xFF
    0646 850A      LDD	R16,Y+10
    0647 DFAA      RCALL	_LCD_set_XY
    0648 C008      RJMP	0x0651
(0131)       	        else
(0132)       	           LCD_set_XY((X+(ch_with+row)*i),Y+1);
    0649 852C      LDD	R18,Y+12
    064A 5F2F      SUBI	R18,0xFF
    064B 842E      LDD	R2,Y+14
    064C 0C2A      ADD	R2,R10
    064D 9E24      MUL	R2,R20
    064E 850A      LDD	R16,Y+10
    064F 0D00      ADD	R16,R0
    0650 DFA1      RCALL	_LCD_set_XY
(0133)               }
(0134)       	    LCD_write_byte(write_chinese_string[line+i][n],1);
    0651 E021      LDI	R18,1
    0652 2C2C      MOV	R2,R12
    0653 0E24      ADD	R2,R20
    0654 E188      LDI	R24,0x18
    0655 9D82      MUL	R24,R2
    0656 0110      MOVW	R2,R0
    0657 EB84      LDI	R24,0xB4
    0658 E092      LDI	R25,2
    0659 0E28      ADD	R2,R24
    065A 1E39      ADC	R3,R25
    065B 2DEE      MOV	R30,R14
    065C 27FF      CLR	R31
    065D 0DE2      ADD	R30,R2
    065E 1DF3      ADC	R31,R3
    065F 9104      LPM	R16,0(Z)
    0660 D10E      RCALL	_LCD_write_byte
    0661 94E3      INC	R14
    0662 E082      LDI	R24,2
    0663 840E      LDD	R0,Y+14
    0664 9D80      MUL	R24,R0
    0665 14E0      CP	R14,R0
    0666 F2C0      BCS	0x063F
(0135)       	  }
(0136)       	i++;
    0667 9543      INC	R20
(0137)       	LCD_set_XY((X+(ch_with+row)*i),Y);
    0668 852C      LDD	R18,Y+12
    0669 842E      LDD	R2,Y+14
    066A 0C2A      ADD	R2,R10
    066B 9E24      MUL	R2,R20
    066C 850A      LDD	R16,Y+10
    066D 0D00      ADD	R16,R0
    066E DF83      RCALL	_LCD_set_XY
    066F 1746      CP	R20,R22
    0670 F408      BCC	0x0672
    0671 CFCB      RJMP	0x063D
    0672 940E141F  CALL	pop_gset5

⌨️ 快捷键说明

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