📄 project.lst
字号:
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 + -