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

📄 32x16hanzi.lst

📁 32X16LED汉字点阵显示屏(atmega16) - 单片机仿真
💻 LST
📖 第 1 页 / 共 2 页
字号:
__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 + -