📄 32x16hanzi.lst
字号:
__text_start:
__start:
079C E5CF LDI R28,0x5F
079D E0D4 LDI R29,4
079E BFCD OUT 0x3D,R28
079F BFDE OUT 0x3E,R29
07A0 51C0 SUBI R28,0x10
07A1 40D0 SBCI R29,0
07A2 EA0A LDI R16,0xAA
07A3 8308 STD Y+0,R16
07A4 2400 CLR R0
07A5 E0E8 LDI R30,0x8
07A6 E0F1 LDI R31,1
07A7 E011 LDI R17,1
07A8 34E9 CPI R30,0x49
07A9 07F1 CPC R31,R17
07AA F011 BEQ 0x07AD
07AB 9201 ST R0,Z+
07AC CFFB RJMP 0x07A8
07AD 8300 STD Z+0,R16
07AE E9E0 LDI R30,0x90
07AF E0FE LDI R31,0xE
07B0 E6A0 LDI R26,0x60
07B1 E0B0 LDI R27,0
07B2 E01F LDI R17,0xF
07B3 33E8 CPI R30,0x38
07B4 07F1 CPC R31,R17
07B5 F021 BEQ 0x07BA
07B6 95C8 LPM
07B7 9631 ADIW R30,1
07B8 920D ST R0,X+
07B9 CFF9 RJMP 0x07B3
07BA 940E0970 CALL _main
_exit:
07BC CFFF RJMP _exit
FILE: E:\32x16汉字\32x16led.h
(0001) /**********************************************
(0002) 功能:32x16LED汉字字幕程序
(0003) 编译:ICC AVR
(0004) 作者:刘伟
(0005) **********************************************/
(0006)
(0007)
(0008)
(0009) #include <iom16v.h>
(0010) #include <macros.h>
(0011) #include <font.h>
(0012) #define LED_DATA_LOW PORTA
(0013) #define LED_DDR_LOW DDRA
(0014) #define LED_DATA_HIGH PORTB
(0015) #define LED_DDR_HIGH DDRB
(0016) #define LED_SCAN_DATA PORTC
(0017) #define LED_SCAN_DDR DDRC
(0018) #define uchar unsigned char
(0019) #define uint unsigned int
(0020) //缓存大小,对应LED屏的大小
(0021) #define buffer_long 64
(0022) //定义字模数据数组的大小,即所存字的个数
(0023) #define gb16_tabel_long 62
(0024) /* 利用定时器1 定时扫描LED屏 */
(0025) /* 定时参数对显示效果影响很大 */
(0026) #define T1_TIME_H 0xe7
(0027) #define T1_TIME_L 0x50
(0028)
(0029) enum direction {right,left}dir_f;
(0030) uchar display_buffer[buffer_long];
(0031)
(0032) /**************** LED屏初始化**************************/
(0033) void led_initial ( void )
(0034) {
(0035) uchar i;
(0036) //display_buffer initial
(0037) for (i=0; i<buffer_long; i++)
_led_initial:
i --> R16
07BD 2700 CLR R16
07BE C009 RJMP 0x07C8
(0038) display_buffer[i] = 0x00;
07BF E088 LDI R24,0x8
07C0 E091 LDI R25,1
07C1 2FE0 MOV R30,R16
07C2 27FF CLR R31
07C3 0FE8 ADD R30,R24
07C4 1FF9 ADC R31,R25
07C5 2422 CLR R2
07C6 8220 STD Z+0,R2
07C7 9503 INC R16
07C8 3400 CPI R16,0x40
07C9 F3A8 BCS 0x07BF
(0039)
(0040) // port initial
(0041) LED_DDR_LOW = 0xff;
07CA EF8F LDI R24,0xFF
07CB BB8A OUT 0x1A,R24
(0042) LED_DDR_HIGH = 0xff;
07CC BB87 OUT 0x17,R24
(0043) LED_SCAN_DDR = 0x1f;
07CD E18F LDI R24,0x1F
07CE BB84 OUT 0x14,R24
(0044)
(0045) //移动方向 right or left
(0046) dir_f = left;
07CF E081 LDI R24,1
07D0 93800148 STS _dir_f,R24
(0047) //t0 initial
(0048) CLI(); //disable all interrupts
07D2 94F8 BCLR 7
(0049) TCCR1B = 0xe0; //stop
07D3 EE80 LDI R24,0xE0
07D4 BD8E OUT 0x2E,R24
(0050) TCNT1H = T1_TIME_H; //setup
07D5 EE87 LDI R24,0xE7
07D6 BD8D OUT 0x2D,R24
(0051) TCNT1L = T1_TIME_L;
07D7 E580 LDI R24,0x50
07D8 BD8C OUT 0x2C,R24
(0052) OCR1AH = 0x01;
07D9 E081 LDI R24,1
07DA BD8B OUT 0x2B,R24
(0053) OCR1AL = 0xF4;
07DB EF84 LDI R24,0xF4
07DC BD8A OUT 0x2A,R24
(0054) OCR1BH = 0x01;
07DD E081 LDI R24,1
07DE BD89 OUT 0x29,R24
(0055) OCR1BL = 0xF4;
07DF EF84 LDI R24,0xF4
07E0 BD88 OUT 0x28,R24
(0056)
(0057) ICR1H = 0x01;
07E1 E081 LDI R24,1
07E2 BD87 OUT 0x27,R24
(0058) ICR1L = 0xF4;
07E3 EF84 LDI R24,0xF4
07E4 BD86 OUT 0x26,R24
(0059) TCCR1A = 0x00;
07E5 2422 CLR R2
07E6 BC2F OUT 0x2F,R2
(0060) TCCR1B = 0x02; //start Timer
07E7 E082 LDI R24,2
07E8 BD8E OUT 0x2E,R24
(0061) MCUCR = 0x00;
07E9 BE25 OUT 0x35,R2
(0062) GICR = 0x00;
07EA BE2B OUT 0x3B,R2
(0063) TIMSK = 0x04; //timer interrupt sources
07EB E084 LDI R24,4
07EC BF89 OUT 0x39,R24
(0064) SEI(); //re-enable interrupts
07ED 9478 BSET 7
(0065) }
07EE 9508 RET
_print_char:
tab_n --> Y+1
i --> R22
d1 --> R12
d0 --> R14
j --> R10
k --> R20
p --> Y+10
07EF 931A ST R17,-Y
07F0 930A ST R16,-Y
07F1 940E09B3 CALL push_gset5
(0066) /*************** 字符串输出子程序***********************/
(0067)
(0068) void print_char (char *p)
(0069) {
(0070) uchar tab_n,j,i=0;
07F3 2766 CLR R22
07F4 C0F8 RJMP 0x08ED
(0071) int k;
(0072) uchar d0,d1;
(0073) while(p[i] > 0)
(0074) {
(0075) if (p[i] >=128)//如果是汉字
07F5 2FE6 MOV R30,R22
07F6 27FF CLR R31
07F7 840A LDD R0,Y+10
07F8 841B LDD R1,Y+11
07F9 0DE0 ADD R30,R0
07FA 1DF1 ADC R31,R1
07FB 8180 LDD R24,Z+0
07FC 3880 CPI R24,0x80
07FD F408 BCC 0x07FF
07FE C093 RJMP 0x0892
(0076) {
(0077) /* 查找 移位输出 */
(0078) for(j=0; j<=gb16_tabel_long; j++)
07FF 24AA CLR R10
0800 C076 RJMP 0x0877
(0079) {
(0080) if ((gb_16[j].index[0] == p[i]) && (gb_16[j].index[1] == p[i+1]))
0801 E282 LDI R24,0x22
0802 9D8A MUL R24,R10
0803 0110 MOVW R2,R0
0804 2E46 MOV R4,R22
0805 2455 CLR R5
0806 840A LDD R0,Y+10
0807 841B LDD R1,Y+11
0808 0C40 ADD R4,R0
0809 1C51 ADC R5,R1
080A E584 LDI R24,0x54
080B E096 LDI R25,6
080C 01F1 MOVW R30,R2
080D 0FE8 ADD R30,R24
080E 1FF9 ADC R31,R25
080F 91E4 LPM R30,0(Z)
0810 01D2 MOVW R26,R4
0811 906C LD R6,0(X)
0812 15E6 CP R30,R6
0813 F009 BEQ 0x0815
0814 C061 RJMP 0x0876
0815 E585 LDI R24,0x55
0816 E096 LDI R25,6
0817 01F1 MOVW R30,R2
0818 0FE8 ADD R30,R24
0819 1FF9 ADC R31,R25
081A 91E4 LPM R30,0(Z)
081B 9611 ADIW R26,1
081C 902C LD R2,0(X)
081D 15E2 CP R30,R2
081E F009 BEQ 0x0820
081F C056 RJMP 0x0876
(0081) {
(0082) if ( dir_f == left )//如果字向左移动就顺序读字模
0820 91800148 LDS R24,_dir_f
0822 3081 CPI R24,1
0823 F549 BNE 0x084D
(0083) for (k=0; k<32; k++)
0824 2744 CLR R20
0825 2755 CLR R21
(0084) {
(0085) d0 = gb_16[j].mask[k];
0826 E282 LDI R24,0x22
0827 9D8A MUL R24,R10
0828 0110 MOVW R2,R0
0829 E586 LDI R24,0x56
082A E096 LDI R25,6
082B 0E28 ADD R2,R24
082C 1E39 ADC R3,R25
082D 01FA MOVW R30,R20
082E 0DE2 ADD R30,R2
082F 1DF3 ADC R31,R3
0830 90E4 LPM R14,0(Z)
(0086) k++;
0831 5F4F SUBI R20,0xFF
0832 4F5F SBCI R21,0xFF
(0087) d1 = gb_16[j].mask[k];
0833 E282 LDI R24,0x22
0834 9D8A MUL R24,R10
0835 0110 MOVW R2,R0
0836 E586 LDI R24,0x56
0837 E096 LDI R25,6
0838 0E28 ADD R2,R24
0839 1E39 ADC R3,R25
083A 01FA MOVW R30,R20
083B 0DE2 ADD R30,R2
083C 1DF3 ADC R31,R3
083D 90C4 LPM R12,0(Z)
(0088) move_to_buffer (d0,d1);
083E 2D2C MOV R18,R12
083F 2733 CLR R19
0840 2D0E MOV R16,R14
0841 2711 CLR R17
0842 D0B9 RCALL _move_to_buffer
(0089) delay(1);
0843 E001 LDI R16,1
0844 E010 LDI R17,0
0845 D11A RCALL _delay
0846 5F4F SUBI R20,0xFF
0847 4F5F SBCI R21,0xFF
0848 3240 CPI R20,0x20
0849 E0E0 LDI R30,0
084A 075E CPC R21,R30
084B F2D4 BLT 0x0826
084C C02E RJMP 0x087B
(0090) }
(0091) else //如果字向右移动就逆序读字模
(0092) for (k=31; k>=0; k--)
084D E14F LDI R20,0x1F
084E E050 LDI R21,0
(0093) {
(0094) d1 = gb_16[j].mask[k];
084F E282 LDI R24,0x22
0850 9D8A MUL R24,R10
0851 0110 MOVW R2,R0
0852 E586 LDI R24,0x56
0853 E096 LDI R25,6
0854 0E28 ADD R2,R24
0855 1E39 ADC R3,R25
0856 01FA MOVW R30,R20
0857 0DE2 ADD R30,R2
0858 1DF3 ADC R31,R3
0859 90C4 LPM R12,0(Z)
(0095) k--;
085A 5041 SUBI R20,1
085B 4050 SBCI R21,0
(0096) d0 = gb_16[j].mask[k];
085C E282 LDI R24,0x22
085D 9D8A MUL R24,R10
085E 0110 MOVW R2,R0
085F E586 LDI R24,0x56
0860 E096 LDI R25,6
0861 0E28 ADD R2,R24
0862 1E39 ADC R3,R25
0863 01FA MOVW R30,R20
0864 0DE2 ADD R30,R2
0865 1DF3 ADC R31,R3
0866 90E4 LPM R14,0(Z)
(0097) move_to_buffer (d0,d1);
0867 2D2C MOV R18,R12
0868 2733 CLR R19
0869 2D0E MOV R16,R14
086A 2711 CLR R17
086B D090 RCALL _move_to_buffer
(0098) delay(1);
086C E001 LDI R16,1
086D E010 LDI R17,0
086E D0F1 RCALL _delay
086F 5041 SUBI R20,1
0870 4050 SBCI R21,0
0871 3040 CPI R20,0
0872 E0E0 LDI R30,0
0873 075E CPC R21,R30
0874 F6D4 BGE 0x084F
(0099) }
(0100) break;//找到了就退出循环
0875 C005 RJMP 0x087B
0876 94A3 INC R10
0877 E38E LDI R24,0x3E
0878 158A CP R24,R10
0879 F008 BCS 0x087B
087A CF86 RJMP 0x0801
(0101) }
(0102) }
(0103) /* 字库没有的字,则输出空白0x00 */
(0104) if (j>gb16_tabel_long)//
087B E38E LDI R24,0x3E
087C 158A CP R24,R10
087D F490 BCC 0x0890
(0105) for (k=0; k<16; k++)
087E 2744 CLR R20
087F 2755 CLR R21
(0106) {
(0107) d0 = 0x00;
0880 24EE CLR R14
(0108) d1 = 0x00;
0881 24CC CLR R12
(0109) move_to_buffer (d0,d1);
0882 2D2C MOV R18,R12
0883 2733 CLR R19
0884 2D0E MOV R16,R14
0885 2711 CLR R17
0886 D075 RCALL _move_to_buffer
(0110) delay(1);
0887 E001 LDI R16,1
0888 E010 LDI R17,0
0889 D0D6 RCALL _delay
088A 5F4F SUBI R20,0xFF
088B 4F5F SBCI R21,0xFF
088C 3140 CPI R20,0x10
088D E0E0 LDI R30,0
088E 075E CPC R21,R30
088F F384 BLT 0x0880
(0111) }
(0112) i+=2;
0890 5F6E SUBI R22,0xFE
(0113) }
0891 C05B RJMP 0x08ED
(0114) else //如果是字符
(0115) {
(0116) j = p[i]-32;
0892 2FE6 MOV R30,R22
0893 27FF CLR R31
0894 840A LDD R0,Y+10
0895 841B LDD R1,Y+11
0896 0DE0 ADD R30,R0
0897 1DF1 ADC R31,R1
0898 8180 LDD R24,Z+0
0899 5280 SUBI R24,0x20
089A 2EA8 MOV R10,R24
(0117) if (dir_f == left)
089B 91800148 LDS R24,_dir_f
089D 3081 CPI R24,1
089E F539 BNE 0x08C6
(0118) for (k=0; k<16; k++)
089F 2744 CLR R20
08A0 2755 CLR R21
(0119) {
(0120) d0 = ASC_MSK[(j*16)+k];
08A1 E180 LDI R24,0x10
08A2 9D8A MUL R24,R10
08A3 01F0 MOVW R30,R0
08A4 0FE4 ADD R30,R20
08A5 1FF5 ADC R31,R21
08A6 E584 LDI R24,0x54
08A7 E090 LDI R25,0
08A8 0FE8 ADD R30,R24
08A9 1FF9 ADC R31,R25
08AA 90E4 LPM R14,0(Z)
(0121) k++;
08AB 5F4F SUBI R20,0xFF
08AC 4F5F SBCI R21,0xFF
(0122) d1 = ASC_MSK[(j*16)+k];
08AD E180 LDI R24,0x10
08AE 9D8A MUL R24,R10
08AF 01F0 MOVW R30,R0
08B0 0FE4 ADD R30,R20
08B1 1FF5 ADC R31,R21
08B2 E584 LDI R24,0x54
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -