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

📄 lcd_gbk.lst

📁 ATmega64单片机
💻 LST
📖 第 1 页 / 共 2 页
字号:
   1               		.file	"LCD_GBK.c"
   2               	__SREG__ = 0x3f
   3               	__SP_H__ = 0x3e
   4               	__SP_L__ = 0x3d
   5               	__tmp_reg__ = 0
   6               	__zero_reg__ = 1
   7               		.global __do_copy_data
   8               		.global __do_clear_bss
  10               		.text
  11               	.Ltext0:
  91               	.global	Unicode_to_GBK
  93               	Unicode_to_GBK:
   1:LCD\LCD_GBK.c **** /*****************************************************/
   2:LCD\LCD_GBK.c **** /*            File name : LCD_GBK.c                                              */
   3:LCD\LCD_GBK.c **** /* Description : code for displaying a GBK characters,                 */
   4:LCD\LCD_GBK.c **** /* Platform     : AVRStudio4.13 + WinAVR20070525  for AVR     */
   5:LCD\LCD_GBK.c **** /* Author       : Michael Zhang - 章其波                            */
   6:LCD\LCD_GBK.c **** /* Email         : sudazqb@163.com                                          */
   7:LCD\LCD_GBK.c **** /* MSN          : zhangqibo_1985@hotmail.com                          */
   8:LCD\LCD_GBK.c **** /* Date          : 2007-1-2                                                    */
   9:LCD\LCD_GBK.c **** /* NOT FOR COMMERCIAL USE,     ALL RIGHT RESERVED!         */
  10:LCD\LCD_GBK.c **** /*****************************************************/
  11:LCD\LCD_GBK.c **** /* Change Log:                                                                      */
  12:LCD\LCD_GBK.c **** /*                   20071109: add a faster display function for 3310 */
  13:LCD\LCD_GBK.c **** /*                   20070102: original version                                 */
  14:LCD\LCD_GBK.c **** /*****************************************************/
  15:LCD\LCD_GBK.c **** 
  16:LCD\LCD_GBK.c **** 
  17:LCD\LCD_GBK.c **** #include"LCD_GBK.h"
  18:LCD\LCD_GBK.c **** 
  19:LCD\LCD_GBK.c **** unsigned long GBK12,GBK16,GBK2UNI,UNI2GBK;//用于存放四个文件的起始扇区
  20:LCD\LCD_GBK.c **** extern unsigned long FirstDataSector;//第一个数据扇区
  21:LCD\LCD_GBK.c **** extern unsigned int SectorsPerClust;//每簇扇区数
  22:LCD\LCD_GBK.c **** extern unsigned int  BytesPerSector;//每扇区字节数
  23:LCD\LCD_GBK.c **** 
  24:LCD\LCD_GBK.c **** unsigned char GBK_Buffer[32];//单个汉字点阵数据缓冲
  25:LCD\LCD_GBK.c **** 
  26:LCD\LCD_GBK.c **** unsigned char GBK_Ini()//gbk初始化
  27:LCD\LCD_GBK.c **** {
  28:LCD\LCD_GBK.c **** 	GBK12 = FAT_Open("\\st12.sys");//打开文件,得到簇号
  29:LCD\LCD_GBK.c **** 	if(GBK12 == 1)return 1;
  30:LCD\LCD_GBK.c **** 	GBK16 = FAT_Open("\\st16.sys");
  31:LCD\LCD_GBK.c **** 	if(GBK16 == 1)return 1;
  32:LCD\LCD_GBK.c **** 	GBK2UNI = FAT_Open("\\gbk2uni.sys");
  33:LCD\LCD_GBK.c **** 	if(GBK2UNI == 1)return 1;
  34:LCD\LCD_GBK.c **** 	UNI2GBK = FAT_Open("\\uni2gbk.sys");
  35:LCD\LCD_GBK.c **** 	if(UNI2GBK == 1)return 1;
  36:LCD\LCD_GBK.c **** 
  37:LCD\LCD_GBK.c **** 	//将簇号转成扇区号
  38:LCD\LCD_GBK.c **** 	GBK12 = (unsigned long)FirstDataSector+(unsigned long)(GBK12 - 2)*(unsigned long)SectorsPerClust;/
  39:LCD\LCD_GBK.c **** 	GBK16 = (unsigned long)FirstDataSector+(unsigned long)(GBK16 - 2)*(unsigned long)SectorsPerClust;/
  40:LCD\LCD_GBK.c **** 	GBK2UNI = (unsigned long)FirstDataSector+(unsigned long)(GBK2UNI - 2)*(unsigned long)SectorsPerClu
  41:LCD\LCD_GBK.c **** 	UNI2GBK = (unsigned long)FirstDataSector+(unsigned long)(UNI2GBK - 2)*(unsigned long)SectorsPerClu
  42:LCD\LCD_GBK.c **** 
  43:LCD\LCD_GBK.c **** 	return 0;
  44:LCD\LCD_GBK.c **** }
  45:LCD\LCD_GBK.c **** 
  46:LCD\LCD_GBK.c **** unsigned char Unicode_to_GBK(unsigned char *ch)
  47:LCD\LCD_GBK.c **** {
  94               		push r12
  95               		push r13
  96               		push r14
  97               		push r15
  98 0000 AF92      		push r16
  99 0002 BF92      		push r17
 100 0004 CF92      		push r28
 101 0006 DF92      		push r29
 102 0008 EF92      		in r28,__SP_L__
 103 000a FF92      		in r29,__SP_H__
 104 000c 0F93      		subi r28,lo8(512)
 105 000e 1F93      		sbci r29,hi8(512)
 106 0010 CF93      		in __tmp_reg__,__SREG__
 107 0012 DF93      		cli
 108 0014 CDB7      		out __SP_H__,r29
 109 0016 DEB7      		out __SREG__,__tmp_reg__
 110 0018 C050      		out __SP_L__,r28
 111 001a D240      	/* prologue end (size=19) */
 112 001c 0FB6      		movw r12,r24
 114 0020 DEBF      	.LM1:
 115 0022 0FBE      		movw r26,r24
 116 0024 CDBF      		ld r16,X+
 117               		ld r17,X
  48:LCD\LCD_GBK.c **** 	unsigned int temp;
  49:LCD\LCD_GBK.c **** 	unsigned int sector_offset;//扇区偏移
  50:LCD\LCD_GBK.c **** 	unsigned int byte_offset;//字节偏移
  51:LCD\LCD_GBK.c **** 	unsigned char buffer[512];
  52:LCD\LCD_GBK.c **** 	temp = *((unsigned int*)ch);//由于FAT中文件民unicode码是 地字节在前,所以要按uint型读
 119               	968))
 120               		sbci r17,hi8(-(-19968))
 122 002a 0D91      	.LM3:
 123 002c 1C91      		lsl r16
  53:LCD\LCD_GBK.c **** 	temp -= 0x4e00;//减去基础数据
 124               	r17
 126 002e 0050      	.LM4:
 127 0030 1E44      		lds r10,BytesPerSector
  54:LCD\LCD_GBK.c **** 	temp *= 2;//每个汉字两个字节
 128               	 r11,(BytesPerSector)+1
 130 0032 000F      	.LM5:
 131 0034 111F      		movw r24,r16
  55:LCD\LCD_GBK.c **** 	sector_offset = temp/BytesPerSector;//计算出扇区偏移,确定存在哪个扇区
 132               	w r22,r10
 133               		call __udivmodhi4
 134 0036 A090 0000 		ldi r24,lo8(0)
 135 003a B090 0000 		ldi r25,hi8(0)
  56:LCD\LCD_GBK.c **** 	byte_offset = temp%BytesPerSector;//存在哪个字节
  57:LCD\LCD_GBK.c **** 	if(FAT_ReadSector(UNI2GBK + sector_offset,buffer))return 1;//读那个扇区
 136               	 r18,UNI2GBK
 137               		lds r19,(UNI2GBK)+1
 138 003e C801      		lds r20,(UNI2GBK)+2
 139 0040 B501      		lds r21,(UNI2GBK)+3
 140 0042 0E94 0000 		add r22,r18
 141 0046 80E0      		adc r23,r19
 142 0048 90E0      		adc r24,r20
 143 004a 2091 0000 		adc r25,r21
 144 004e 3091 0000 		lds r30,FAT_ReadSector
 145 0052 4091 0000 		lds r31,(FAT_ReadSector)+1
 146 0056 5091 0000 		movw r14,r28
 147 005a 620F      		sec
 148 005c 731F      		adc r14,__zero_reg__
 149 005e 841F      		adc r15,__zero_reg__
 150 0060 951F      		movw r20,r14
 151 0062 E091 0000 		icall
 152 0066 F091 0000 		tst r24
 153 006a 7E01      		breq .L2
 155 006e E11C      	.LM6:
 156 0070 F11C      		ldi r24,lo8(1)
 157 0072 A701      		ldi r25,hi8(1)
 158 0074 0995      		rjmp .L4
 159 0076 8823      	.L2:
 161               	.LM7:
 162               		movw r24,r16
 163 007a 81E0      		movw r22,r10
 164 007c 90E0      		call __udivmodhi4
 165 007e 00C0      		movw r30,r24
 167               	.LM8:
 168               		add r14,r24
 169 0080 C801      		adc r15,r25
 170 0082 B501      		movw r26,r14
 171 0084 0E94 0000 		ld r24,X
 172 0088 FC01      		movw r26,r12
  58:LCD\LCD_GBK.c **** 	*ch = buffer[byte_offset];//将数据读出
 173               	
 174               	.LM9:
 175 008a E80E      		add r30,r28
 176 008c F91E      		adc r31,r29
 177 008e D701      		ldd r24,Z+2
 178 0090 8C91      		movw r30,r12
 179 0092 D601      		std Z+1,r24
 180 0094 8C93      		ldi r24,lo8(0)
  59:LCD\LCD_GBK.c **** 	*(ch+1) = buffer[byte_offset+1];
 181               	5,hi8(0)
 182               	.L4:
 183 0096 EC0F      	/* epilogue: frame size=512 */
 184 0098 FD1F      		subi r28,lo8(-512)
 185 009a 8281      		sbci r29,hi8(-512)
 186 009c F601      		in __tmp_reg__,__SREG__
 187 009e 8183      		cli
 188 00a0 80E0      		out __SP_H__,r29
 189 00a2 90E0      		out __SREG__,__tmp_reg__
 190               		out __SP_L__,r28
 191               		pop r29
 192 00a4 C050      		pop r28
 193 00a6 DE4F      		pop r17
 194 00a8 0FB6      		pop r16
 195 00aa F894      		pop r15
 196 00ac DEBF      		pop r14
 197 00ae 0FBE      		pop r13
 198 00b0 CDBF      		pop r12
 199 00b2 DF91      		pop r11
 200 00b4 CF91      		pop r10
 201 00b6 1F91      		ret
 202 00b8 0F91      	/* epilogue end (size=18) */
 203 00ba FF90      	/* function Unicode_to_GBK size 100 (63) */
 208 00c4 AF90      	.Lscope1:
 211               	.global	GBK_to_Unicode
 213               	GBK_to_Unicode:
 215               	.LM10:
 216               	.LFBB2:
 217               	/* prologue: frame size=0 */
 218               	/* prologue end (size=0) */
 220               	.LM11:
 221               		ldi r24,lo8(0)
  60:LCD\LCD_GBK.c **** 	return 0;
  61:LCD\LCD_GBK.c **** }
  62:LCD\LCD_GBK.c **** 
  63:LCD\LCD_GBK.c **** unsigned char GBK_to_Unicode(unsigned char *ch)
  64:LCD\LCD_GBK.c **** {
 222               	 */
 223               		ret
 224               	/* epilogue end (size=1) */
 225               	/* function GBK_to_Unicode size 3 (2) */
  65:LCD\LCD_GBK.c **** 	return 0;
  66:LCD\LCD_GBK.c **** }
 227               	pe2:
 230 00ca 90E0      	.global	Read_One_GBK12
 232 00cc 0895      	Read_One_GBK12:
 234               	.LM12:
 235               	.LFBB3:
 236               	/* prologue: frame size=512 */
 237               		push r4
 238               		push r5
 239               		push r6
 240               		push r7
 241               		push r8
  67:LCD\LCD_GBK.c **** 
  68:LCD\LCD_GBK.c **** unsigned char Read_One_GBK12(unsigned char *ch)
  69:LCD\LCD_GBK.c **** {
 242               	r10
 243               		push r11
 244               		push r12
 245               		push r13
 246 00ce 4F92      		push r14
 247 00d0 5F92      		push r15
 248 00d2 6F92      		push r16
 249 00d4 7F92      		push r17
 250 00d6 8F92      		push r28
 251 00d8 9F92      		push r29
 252 00da AF92      		in r28,__SP_L__
 253 00dc BF92      		in r29,__SP_H__
 254 00de CF92      		subi r28,lo8(512)
 255 00e0 DF92      		sbci r29,hi8(512)
 256 00e2 EF92      		in __tmp_reg__,__SREG__
 257 00e4 FF92      		cli
 258 00e6 0F93      		out __SP_H__,r29
 259 00e8 1F93      		out __SREG__,__tmp_reg__
 260 00ea CF93      		out __SP_L__,r28
 261 00ec DF93      	/* prologue end (size=25) */
 262 00ee CDB7      		movw r30,r24
 264 00f2 C050      	.LM13:
 265 00f4 D240      		ld r24,Z
 266 00f6 0FB6      		mov r22,r24
 267 00f8 F894      		ldi r23,lo8(0)
 268 00fa DEBF      		ldi r24,lo8(0)
 269 00fc 0FBE      		ldi r25,hi8(0)
 271               	.LM14:
 272 0100 FC01      		ldd r17,Z+1
  70:LCD\LCD_GBK.c **** 	unsigned long temp1;
  71:LCD\LCD_GBK.c **** 	unsigned char temp2;
  72:LCD\LCD_GBK.c **** 	unsigned int  sector_offset;
  73:LCD\LCD_GBK.c **** 	unsigned int  byte_offset;
  74:LCD\LCD_GBK.c **** 	unsigned char buffer[512];
  75:LCD\LCD_GBK.c **** 	temp1=*ch;
 273               	M15:
 274               		cpi r22,lo8(129)
 275 0102 8081      		cpc r23,__zero_reg__
 276 0104 682F      		cpc r24,__zero_reg__
 277 0106 70E0      		cpc r25,__zero_reg__
 278 0108 80E0      		brsh .+2
 279 010a 90E0      		rjmp .L9
  76:LCD\LCD_GBK.c **** 	temp2=*(ch+1);
 280               		68,0,77,.LM16-.LFBB3
 281               	.LM16:
 282 010c 1181      		cpi r17,lo8(64)
  77:LCD\LCD_GBK.c **** 	if(temp1<0x81||temp2<0x40)return 1;
 283               	sh .+2
 284               		rjmp .L9
 286 0110 7105      	.LM17:
 287 0112 8105      		subi r22,lo8(-(-129))
 288 0114 9105      		sbci r23,hi8(-(-129))
 289 0116 00F4      		sbci r24,hlo8(-(-129))
 290 0118 00C0      		sbci r25,hhi8(-(-129))
 292               	.LM18:
 293 011a 1034      		ldi r18,lo8(192)
 294 011c 00F4      		ldi r19,hi8(192)
 295 011e 00C0      		ldi r20,hlo8(192)
  78:LCD\LCD_GBK.c **** 	temp1-=0x81;
 296               	(192)
 297               		call __mulsi3
 299 0122 7040      	.LM19:
 300 0124 8040      		subi r17,lo8(-(-64))
 301 0126 9040      		add r22,r17
  79:LCD\LCD_GBK.c **** 	temp2-=0x40;
  80:LCD\LCD_GBK.c **** 	temp1*=192;//xx7f and xxff are included
 302               	23,__zero_reg__
 303               		adc r24,__zero_reg__
 304 0128 20EC      		adc r25,__zero_reg__
 306 012c 40E0      	.LM20:
 307 012e 50E0      		ldi r18,lo8(24)
 308 0130 0E94 0000 		ldi r19,hi8(24)
  81:LCD\LCD_GBK.c **** 	temp1+=temp2;
 309               	0,hlo8(24)
 310               		ldi r21,hhi8(24)
 311 0134 1054      		call __mulsi3
 312 0136 610F      		movw r10,r22
 313 0138 711D      		movw r12,r24
 315 013c 911D      	.LM21:
  82:LCD\LCD_GBK.c **** 	temp1*=24;
 316               	4,BytesPerSector
 317               		lds r25,(BytesPerSector)+1
 318 013e 28E1      		movw r14,r24
 319 0140 30E0      		ldi r16,lo8(0)
 320 0142 40E0      		ldi r17,hi8(0)
 322 0146 0E94 0000 	.LM22:
 323 014a 5B01      		movw r24,r12

⌨️ 快捷键说明

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