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