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

📄 project.lst

📁 AVR单片机 C语言程序设计经典实用
💻 LST
📖 第 1 页 / 共 5 页
字号:
    073C 9508      RET
_LCD_Write_Char:
  y_address            --> R20
  x_address            --> R22
  i                    --> R10
  disp                 --> R12
  y                    --> R14
  x                    --> Y+11
    073D 940E0A54  CALL	push_arg4
    073F 940E0A9D  CALL	push_gset5
    0741 2EE2      MOV	R14,R18
    0742 9721      SBIW	R28,1
    0743 84CF      LDD	R12,Y+15
    0744 88D8      LDD	R13,Y+16
(0337) 
(0338) //******************************************************************************
(0339) // Function    : LCD_Write_Char
(0340) // Input       : x in [0,3] and y in [0,15],disp - start address of display buffer
(0341) // Output      : none
(0342) // Description : Application Level Function,在LCD的指定显示单元显示一个字符。
(0343) //               每个显示单元默认为8*16点阵字体,对128*64点阵LCD,x最多显示4行
(0344) //               字符,y最多显示16个字符
(0345) //******************************************************************************
(0346) void LCD_Write_Char(INT8U x,INT8U y,const INT8U *disp)
(0347) {
(0348) 	INT8U i;
(0349) 	INT8U x_address;
(0350) 	INT8U y_address;
(0351) 	if((x < 4) && (y < 16))
    0745 858B      LDD	R24,Y+11
    0746 3084      CPI	R24,4
    0747 F008      BCS	0x0749
    0748 C033      RJMP	0x077C
    0749 2D8E      MOV	R24,R14
    074A 3180      CPI	R24,0x10
    074B F008      BCS	0x074D
    074C C02F      RJMP	0x077C
(0352) 	{
(0353) 		for(i = 0;i < 8;i++)
    074D 24AA      CLR	R10
    074E C012      RJMP	0x0761
(0354) 		{
(0355) 			x_address = x << 1;
    074F 856B      LDD	R22,Y+11
    0750 0F66      LSL	R22
(0356) 			y_address = (y << 3) + i;
    0751 2D4E      MOV	R20,R14
    0752 0F44      LSL	R20
    0753 0F44      LSL	R20
    0754 0F44      LSL	R20
    0755 0D4A      ADD	R20,R10
(0357) 			LCD_Write_Data(x_address,y_address,*disp++);
    0756 0116      MOVW	R2,R12
    0757 01C1      MOVW	R24,R2
    0758 9601      ADIW	R24,1
    0759 016C      MOVW	R12,R24
    075A 01F1      MOVW	R30,R2
    075B 91E4      LPM	R30,0(Z)
    075C 83E8      STD	Y+0,R30
    075D 2F24      MOV	R18,R20
    075E 2F06      MOV	R16,R22
    075F DF9D      RCALL	_LCD_Write_Data
    0760 94A3      INC	R10
    0761 2D8A      MOV	R24,R10
    0762 3088      CPI	R24,0x8
    0763 F358      BCS	0x074F
(0358) 		}
(0359) 		for(i = 0;i < 8;i++)
    0764 24AA      CLR	R10
    0765 C013      RJMP	0x0779
(0360) 		{
(0361) 			x_address = (x << 1) + 1;
    0766 856B      LDD	R22,Y+11
    0767 0F66      LSL	R22
    0768 5F6F      SUBI	R22,0xFF
(0362) 			y_address = (y << 3) + i;
    0769 2D4E      MOV	R20,R14
    076A 0F44      LSL	R20
    076B 0F44      LSL	R20
    076C 0F44      LSL	R20
    076D 0D4A      ADD	R20,R10
(0363) 			LCD_Write_Data(x_address,y_address,*disp++);
    076E 0116      MOVW	R2,R12
    076F 01C1      MOVW	R24,R2
    0770 9601      ADIW	R24,1
    0771 016C      MOVW	R12,R24
    0772 01F1      MOVW	R30,R2
    0773 91E4      LPM	R30,0(Z)
    0774 83E8      STD	Y+0,R30
    0775 2F24      MOV	R18,R20
    0776 2F06      MOV	R16,R22
    0777 DF85      RCALL	_LCD_Write_Data
    0778 94A3      INC	R10
    0779 2D8A      MOV	R24,R10
    077A 3088      CPI	R24,0x8
    077B F350      BCS	0x0766
(0364) 		}
(0365) 	}
(0366) }
    077C 9621      ADIW	R28,1
    077D 940E0A77  CALL	pop_gset5
    077F 9624      ADIW	R28,4
    0780 9508      RET
_LCD_Write_Word:
  y_address            --> R20
  x_address            --> R22
  i                    --> R10
  disp                 --> R12
  y                    --> R14
  x                    --> Y+11
    0781 940E0A54  CALL	push_arg4
    0783 940E0A9D  CALL	push_gset5
    0785 2EE2      MOV	R14,R18
    0786 9721      SBIW	R28,1
    0787 84CF      LDD	R12,Y+15
    0788 88D8      LDD	R13,Y+16
(0367) 
(0368) //******************************************************************************
(0369) // Function    : LCD_Write_Word
(0370) // Input       : x in [0,3] and y in [0,14],disp - start address of display buffer
(0371) // Output      : none
(0372) // Description : Application Level Function,在LCD的指定显示单元显示一个中文。
(0373) //               每个显示单元默认为16*16点阵字体,对128*64点阵LCD,x最多显示4行
(0374) //               字符,y最多显示16个字符,但不允许显示半个汉字
(0375) //******************************************************************************
(0376) void LCD_Write_Word(INT8U x,INT8U y,const INT8U *disp)
(0377) {
(0378) 	INT8U i;
(0379) 	INT8U x_address;
(0380) 	INT8U y_address;
(0381) 	if((x < 4) && (y < 15))
    0789 858B      LDD	R24,Y+11
    078A 3084      CPI	R24,4
    078B F008      BCS	0x078D
    078C C033      RJMP	0x07C0
    078D 2D8E      MOV	R24,R14
    078E 308F      CPI	R24,0xF
    078F F008      BCS	0x0791
    0790 C02F      RJMP	0x07C0
(0382) 	{
(0383) 		for(i = 0;i < 16;i++)
    0791 24AA      CLR	R10
    0792 C012      RJMP	0x07A5
(0384) 		{
(0385) 			x_address = x << 1;
    0793 856B      LDD	R22,Y+11
    0794 0F66      LSL	R22
(0386) 			y_address = (y << 3) + i;
    0795 2D4E      MOV	R20,R14
    0796 0F44      LSL	R20
    0797 0F44      LSL	R20
    0798 0F44      LSL	R20
    0799 0D4A      ADD	R20,R10
(0387) 			LCD_Write_Data(x_address,y_address,*disp++);
    079A 0116      MOVW	R2,R12
    079B 01C1      MOVW	R24,R2
    079C 9601      ADIW	R24,1
    079D 016C      MOVW	R12,R24
    079E 01F1      MOVW	R30,R2
    079F 91E4      LPM	R30,0(Z)
    07A0 83E8      STD	Y+0,R30
    07A1 2F24      MOV	R18,R20
    07A2 2F06      MOV	R16,R22
    07A3 DF59      RCALL	_LCD_Write_Data
    07A4 94A3      INC	R10
    07A5 2D8A      MOV	R24,R10
    07A6 3180      CPI	R24,0x10
    07A7 F358      BCS	0x0793
(0388) 		}
(0389) 		for(i = 0;i < 16;i++)
    07A8 24AA      CLR	R10
    07A9 C013      RJMP	0x07BD
(0390) 		{
(0391) 			x_address = (x << 1) + 1;
    07AA 856B      LDD	R22,Y+11
    07AB 0F66      LSL	R22
    07AC 5F6F      SUBI	R22,0xFF
(0392) 			y_address = (y << 3) + i;
    07AD 2D4E      MOV	R20,R14
    07AE 0F44      LSL	R20
    07AF 0F44      LSL	R20
    07B0 0F44      LSL	R20
    07B1 0D4A      ADD	R20,R10
(0393) 			LCD_Write_Data(x_address,y_address,*disp++);
    07B2 0116      MOVW	R2,R12
    07B3 01C1      MOVW	R24,R2
    07B4 9601      ADIW	R24,1
    07B5 016C      MOVW	R12,R24
    07B6 01F1      MOVW	R30,R2
    07B7 91E4      LPM	R30,0(Z)
    07B8 83E8      STD	Y+0,R30
    07B9 2F24      MOV	R18,R20
    07BA 2F06      MOV	R16,R22
    07BB DF41      RCALL	_LCD_Write_Data
    07BC 94A3      INC	R10
    07BD 2D8A      MOV	R24,R10
    07BE 3180      CPI	R24,0x10
    07BF F350      BCS	0x07AA
(0394) 		}
(0395) 	}
(0396) }
    07C0 9621      ADIW	R28,1
    07C1 940E0A77  CALL	pop_gset5
    07C3 9624      ADIW	R28,4
    07C4 9508      RET
_LCD_Write_Picture:
  x_address            --> R20
  y_address            --> R14
  pdata                --> R22
  y_length             --> R10
  x_length             --> R12
  y1                   --> Y+13
  x1                   --> Y+11
    07C5 940E0A54  CALL	push_arg4
    07C7 940E0A9D  CALL	push_gset5
    07C9 9721      SBIW	R28,1
    07CA 84CF      LDD	R12,Y+15
    07CB 88A9      LDD	R10,Y+17
    07CC 896B      LDD	R22,Y+19
    07CD 897C      LDD	R23,Y+20
(0397) 
(0398) //******************************************************************************
(0399) // Function    : LCD_Write_Picture
(0400) // Input       : x in [0,7] and y in [0,127],
(0401) //               x1_length - 纵向象素 y1_length - 横向象素,x1_length必须为8的
(0402) //               整数倍,y1_length可以不必为8的整数倍。
(0403) // Output      : none
(0404) // Description : Application Level Function,在LCD的指定区域显示图片
(0405) //******************************************************************************
(0406) void LCD_Write_Picture(INT8U x1,INT8U y1,INT8U x_length,INT8U y_length,const INT8U *pdata)
(0407) {
(0408) 	INT8U x_address;
(0409) 	INT8U y_address;
(0410) 	for(x_address = x1;x_address <= x1 + (x_length >> 3) - 1;x_address++)
    07CE 854B      LDD	R20,Y+11
    07CF C011      RJMP	0x07E1
(0411) 	{
(0412) 		for(y_address = y1;y_address < y1 + y_length;y_address++)
    07D0 84ED      LDD	R14,Y+13
    07D1 C00A      RJMP	0x07DC
(0413) 		{
(0414) 			LCD_Write_Data(x_address,y_address,*pdata++);
    07D2 011B      MOVW	R2,R22
    07D3 5F6F      SUBI	R22,0xFF
    07D4 4F7F      SBCI	R23,0xFF
    07D5 01F1      MOVW	R30,R2
    07D6 91E4      LPM	R30,0(Z)
    07D7 83E8      STD	Y+0,R30
    07D8 2D2E      MOV	R18,R14
    07D9 2F04      MOV	R16,R20
    07DA DF22      RCALL	_LCD_Write_Data
    07DB 94E3      INC	R14
    07DC 842D      LDD	R2,Y+13
    07DD 0C2A      ADD	R2,R10
    07DE 14E2      CP	R14,R2
    07DF F390      BCS	0x07D2
    07E0 9543      INC	R20
    07E1 2C2C      MOV	R2,R12
    07E2 9426      LSR	R2
    07E3 9426      LSR	R2
    07E4 9426      LSR	R2
    07E5 858B      LDD	R24,Y+11
    07E6 0D82      ADD	R24,R2
    07E7 5081      SUBI	R24,1
    07E8 1784      CP	R24,R20
    07E9 F730      BCC	0x07D0
(0415) 		}
(0416) 	}
(0417) }
    07EA 9621      ADIW	R28,1
    07EB 940E0A77  CALL	pop_gset5
    07ED 9624      ADIW	R28,4
    07EE 9508      RET
FILE: E:\Steaven2000\AVR\AVR_Book\PROGRA~1\SOURCE~1\Code\点阵型LCD显示应用设计\main.c
(0001) //***************************************************************
(0002) // File Name : LED.c
(0003) // Author    : Steaven
(0004) // Created   : 2008-07-26
(0005) // Modified  : 
(0006) // Revision  : V0.0
(0007) //***************************************************************
(0008) 
(0009) #include "iom16v.h"
(0010) #include "DataType.h"
(0011) #include "app.h"
(0012) #include "lcd.h" 
(0013) #include "zimo.h"
(0014) 
(0015) void LCD_Write_Frame0(void);
(0016) void LCD_Write_Frame1(void);
(0017) void LCD_Write_Frame2(void);
(0018) void LCD_Display_Init(void);
(0019) void LCD_Display_Update(void);
(0020) 
(0021) INT8U wTimeCount = 0;
(0022) 
(0023) void main(void) 
(0024) { 
(0025) 	Hardware_Init();
_main:
    07EF 940E062D  CALL	_Hardware_Init
(0026) 	LCD_Init();
    07F1 940E06D9  CALL	_LCD_Init
(0027) 	LCD_Display_Init();
    07F3 D170      RCALL	_LCD_Display_Init
    07F4 C001      RJMP	0x07F6
(0028) 	while(1)
(0029) 	{
(0030) 		LCD_Display_Update();
    07F5 D17E      RCALL	_LCD_Display_Update
    07F6 CFFE      RJMP	0x07F5
(0031) 	}
(0032) } 
    07F7 9508      RET
_wTimeCountr0_Interrupt:
    07F8 940E0AA1  CALL	push_lset
(0033) 
(0034) //***************************************************************
(0035) // Function    : wTimeCountr0_Interrupt                                
(0036) // Input       : none                                            
(0037) // Output      : none                                            
(0038) // Description : ATmega16 T/C0 ISR                               
(0039) //***************************************************************
(0040) #pragma interrupt_handler wTimeCountr0_Interrupt:20                    
(0041) void wTimeCountr0_Interrupt(void)                                      
(0042) {                                                                
(0043) 	static INT8U int_count = 0;
(0044) 	static INT8U buzzer_count = 0;
(0045) 	static INT8U buzzer_status = 0;
(0046) 	                                      
(0047) 	//Clear wTimeCountr0 OCIF Flag                                     
(0048) 	TIFR  |= 0x02;                                               
    07FA B788      IN	R24,0x38
    07FB 6082      ORI	R24,2
    07FC BF88      OUT	0x38,R24
(0049) 	TCNT0  = 0x00;                                              
    07FD 2422      CLR	R2
    07FE BE22      OUT	0x32,R2
(0050) 	//Interrupt Count
(0051) 	int_count++;
    07FF 91800061  LDS	R24,0x61
    0801 5F8F      SUBI	R24,0xFF
    0802 93800061  STS	0x61,R24
(0052) 	if(int_count == 1)
    0804 3081      CPI	R24,1
    0805 F419      BNE	0x0809
(0053) 	{
(0054) 		Buzzer_ON();
    0806 940E064D  CALL	_Buzzer_ON
(0055) 	}
    0808 C01C      RJMP	0x0825
(0056) 	else if(int_count == 6)
    0809 91800061  LDS	R24,0x61
    080B 3086      CPI	R24,6
    080C F441      BNE	0x0815
(0057) 	{
(0058) 		if(wTimeCount <= 8)
    080D E088      LDI	R24,0x8
    080E 90200060  LDS	R2,0x60
    0810 1582      CP	R24,R2
    0811 F098      BCS	0x0825
(0059) 		{
(0060) 			Buzzer_OFF();
    0812 940E064F  CALL	_Buzzer_OFF
(0061) 		}
(0062) 	}
    0814 C010      RJMP	0x0825
(0063) 	else if(int_count == 100)
    0815 91800061  LDS	R24,0x61
    0817 3684      CPI	R24,0x64
    0818 F461      BNE	0x0825
(0064) 	{
(0065) 		int_count = 0;
    0819 2422      CLR	R2
    081A 92200061  STS	0x61,R2
(0066) 		if(wTimeCount <= 8)
    081C E088      LDI	R24,0x8
    081D 90200060  LDS	R2,0x60
    081F 1582      CP	R24,R2
    0820 F020      BCS	0x0825
(0067) 		{

⌨️ 快捷键说明

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