📄 ds12887.lst
字号:
0213 01B8 MOVW R22,R16
(0140) }
(0141)
(0142) /****************************** LCD汉字显示函数(8*16)****************************************/
(0143)
(0144) void displayL(uchar*array,uchar x,uchar y) //array是点阵字模指针,x是指屏竖方向的坐标,y是指屏横方向上的坐标
(0145) {
(0146) uchar i;
(0147) lcdcommand(0,0xb8+x); //设置显示本字符的初始地址
0214 2F24 MOV R18,R20
0215 5428 SUBI R18,0x48
0216 2700 CLR R16
0217 DF1F RCALL _lcdcommand
(0148) lcdcommand(0,0x40+y);
0218 812C LDD R18,Y+4
0219 5C20 SUBI R18,0xC0
021A 2700 CLR R16
021B DF1B RCALL _lcdcommand
(0149) for(i=0;i<16;i++) //每半个字代码为16元素的数组
021C 2744 CLR R20
021D C008 RJMP 0x0226
(0150) {
(0151) lcddatas(0,*(array+i));
021E 2FE4 MOV R30,R20
021F 27FF CLR R31
0220 0FE6 ADD R30,R22
0221 1FF7 ADC R31,R23
0222 8120 LDD R18,Z+0
0223 2700 CLR R16
0224 DF24 RCALL _lcddatas
0225 9543 INC R20
0226 3140 CPI R20,0x10
0227 F3B0 BCS 0x021E
0228 940E047E CALL pop_gset2
022A 9508 RET
_displayR:
i --> R20
y --> Y+4
x --> R20
array --> R22
022B 940E048D CALL push_gset2
022D 2F42 MOV R20,R18
022E 01B8 MOVW R22,R16
(0152)
(0153) }
(0154)
(0155) }
(0156)
(0157)
(0158) void displayR(uchar*array,uchar x,uchar y) //array是点阵字模指针,x是指屏竖方向的坐标,y是指屏横方向上的坐标
(0159) {
(0160) uchar i;
(0161)
(0162) lcdcommand(1,0xb8+x);
022F 2F24 MOV R18,R20
0230 5428 SUBI R18,0x48
0231 E001 LDI R16,1
0232 DF04 RCALL _lcdcommand
(0163) lcdcommand(1,0x40+y);
0233 812C LDD R18,Y+4
0234 5C20 SUBI R18,0xC0
0235 E001 LDI R16,1
0236 DF00 RCALL _lcdcommand
(0164)
(0165) for(i=0;i<16;i++) //每半个字代码为16元素的数组
0237 2744 CLR R20
0238 C008 RJMP 0x0241
(0166) {
(0167) lcddatas(1,*(array+i));
0239 2FE4 MOV R30,R20
023A 27FF CLR R31
023B 0FE6 ADD R30,R22
023C 1FF7 ADC R31,R23
023D 8120 LDD R18,Z+0
023E E001 LDI R16,1
023F DF09 RCALL _lcddatas
0240 9543 INC R20
0241 3140 CPI R20,0x10
0242 F3B0 BCS 0x0239
0243 940E047E CALL pop_gset2
0245 9508 RET
_display_chinese:
heng --> R10
zong --> R22
array2 --> R20
array1 --> R12
0246 940E0489 CALL push_gset4
0248 01A9 MOVW R20,R18
0249 0168 MOVW R12,R16
024A 9721 SBIW R28,1
024B 8569 LDD R22,Y+9
024C 84AB LDD R10,Y+11
(0168) }
(0169)
(0170) }
(0171)
(0172) void display_chinese(uchar*array1,uchar*array2,uchar zong,uchar heng)
(0173) {
(0174) if((heng>=0)&&(heng<=3)) //左半屏显示
024D 2D8A MOV R24,R10
024E 3080 CPI R24,0
024F F0A0 BCS 0x0264
0250 E083 LDI R24,3
0251 158A CP R24,R10
0252 F088 BCS 0x0264
(0175) {
(0176) displayL(array1,zong*2,heng*16); displayL(array2,zong*2+1,heng*16);
0253 E180 LDI R24,0x10
0254 9D8A MUL R24,R10
0255 8208 STD Y+0,R0
0256 E082 LDI R24,2
0257 9F86 MUL R24,R22
0258 2D20 MOV R18,R0
0259 0186 MOVW R16,R12
025A DFB5 RCALL _displayL
025B E180 LDI R24,0x10
025C 9D8A MUL R24,R10
025D 8208 STD Y+0,R0
025E E082 LDI R24,2
025F 9F86 MUL R24,R22
0260 2D20 MOV R18,R0
0261 5F2F SUBI R18,0xFF
0262 018A MOVW R16,R20
0263 DFAC RCALL _displayL
(0177) }
(0178) if((heng>=4)&&(heng<=7)) //右半屏显示
0264 2D8A MOV R24,R10
0265 3084 CPI R24,4
0266 F0C0 BCS 0x027F
0267 E087 LDI R24,7
0268 158A CP R24,R10
0269 F0A8 BCS 0x027F
(0179) {
(0180) displayR(array1,zong*2,(heng-4)*16); displayR(array2,zong*2+1,(heng-4)*16);
026A E180 LDI R24,0x10
026B 9D8A MUL R24,R10
026C 2D80 MOV R24,R0
026D 5480 SUBI R24,0x40
026E 8388 STD Y+0,R24
026F E082 LDI R24,2
0270 9F86 MUL R24,R22
0271 2D20 MOV R18,R0
0272 0186 MOVW R16,R12
0273 DFB7 RCALL _displayR
0274 E180 LDI R24,0x10
0275 9D8A MUL R24,R10
0276 2D80 MOV R24,R0
0277 5480 SUBI R24,0x40
0278 8388 STD Y+0,R24
0279 E082 LDI R24,2
027A 9F86 MUL R24,R22
027B 2D20 MOV R18,R0
027C 5F2F SUBI R18,0xFF
027D 018A MOVW R16,R20
027E DFAC RCALL _displayR
(0181) }
027F 9621 ADIW R28,1
0280 940E0484 CALL pop_gset4
0282 9508 RET
FILE: C:\DOCUME~1\Administrator\桌面\USING07-07\Mega128\12c887\DS12C887.C
(0001)
(0002) #include <iom128v.h>
(0003) #include <macros.h>
(0004) #include"DS12C887.H"
(0005) #include"char.h"
(0006) #include"lcd.h"
(0007) #include"chinese.h"
(0008)
(0009) #define uchar unsigned char
(0010) uchar second,second10,second01,minute,minute10,minute01,hour,hour10,hour01;
(0011) uchar weekday,weekday10,weekday01,monthday,monthday10,monthday01,month,month10,month01,year,year10,year01;
(0012) //**********************************延时函数**************************************/
(0013)
(0014) void delayds12887(uchar i)
(0015) {
(0016) while(--i)
_delayds12887:
i --> R16
0283 2F80 MOV R24,R16
0284 5081 SUBI R24,1
0285 2F08 MOV R16,R24
0286 2388 TST R24
0287 F7D9 BNE 0x0283
0288 9508 RET
(0017) {;}
(0018) }
(0019)
(0020) //*****************************写DS12887时间寄存器函数****************************/
(0021)
(0022) void Write_Regtime(uchar Second,uchar Minute,uchar Hour,uchar Weekday,uchar Monthday,uchar Month,uchar Year)
(0023) {
(0024) SECOND=Second; //写秒初值
_Write_Regtime:
Year --> Y+8
Month --> Y+6
Monthday --> Y+4
Weekday --> Y+2
Hour --> Y+0
Minute --> R18
Second --> R16
0289 9300A000 STS 0xA000,R16
(0025) MINUTE=Minute; //写分初值
028B 9320A002 STS 0xA002,R18
(0026) HOUR=Hour; //写小时初值
028D 8008 LDD R0,Y+0
028E 9200A004 STS 0xA004,R0
(0027) WEEKDAY=Weekday; //写星期天数初值
0290 800A LDD R0,Y+2
0291 9200A006 STS 0xA006,R0
(0028) MONTHDAY=Monthday; //写月天数初值
0293 800C LDD R0,Y+4
0294 9200A007 STS 0xA007,R0
(0029) MONTH=Month; //写月初值
0296 800E LDD R0,Y+6
0297 9200A008 STS 0xA008,R0
(0030) YEAR=Year; //写年初值
0299 8408 LDD R0,Y+8
029A 9200A009 STS 0xA009,R0
029C 9508 RET
(0031) }
(0032)
(0033)
(0034) //*************************写DS12887特殊寄存器A,B,C,D函数**********************/
(0035)
(0036) void Write_Regspecial(uchar regA,uchar regB,uchar regC,uchar regD)
(0037) {
(0038) REG_A=regA;
_Write_Regspecial:
regD --> Y+2
regC --> Y+0
regB --> R18
regA --> R16
029D 9300A00A STS 0xA00A,R16
(0039) REG_B=regB;
029F 9320A00B STS 0xA00B,R18
(0040) REG_C=regC;
02A1 8008 LDD R0,Y+0
02A2 9200A00C STS 0xA00C,R0
(0041) REG_C=regD;
02A4 800A LDD R0,Y+2
02A5 9200A00C STS 0xA00C,R0
02A7 9508 RET
(0042) }
(0043)
(0044) //******************************读DS12887时间寄存器函数*****************************/
(0045)
(0046) Read_RegSec(void)
(0047) {
(0048) return SECOND;
_Read_RegSec:
02A8 9100A000 LDS R16,0xA000
02AA 2711 CLR R17
02AB 9508 RET
(0049) }
(0050)
(0051) Read_RegMin(void)
(0052) {
(0053) return MINUTE;
_Read_RegMin:
02AC 9100A002 LDS R16,0xA002
02AE 2711 CLR R17
02AF 9508 RET
(0054) }
(0055)
(0056) Read_RegHour(void)
(0057) {
(0058) return HOUR;
_Read_RegHour:
02B0 9100A004 LDS R16,0xA004
02B2 2711 CLR R17
02B3 9508 RET
(0059) }
(0060)
(0061) Read_RegWeekday(void)
(0062) {
(0063) return WEEKDAY;
_Read_RegWeekday:
02B4 9100A006 LDS R16,0xA006
02B6 2711 CLR R17
02B7 9508 RET
(0064) }
(0065)
(0066) Read_RegMonthday(void)
(0067) {
(0068) return MONTHDAY;
_Read_RegMonthday:
02B8 9100A007 LDS R16,0xA007
02BA 2711 CLR R17
02BB 9508 RET
(0069) }
(0070)
(0071) Read_RegMonth(void)
(0072) {
(0073) return MONTH;
_Read_RegMonth:
02BC 9100A008 LDS R16,0xA008
02BE 2711 CLR R17
02BF 9508 RET
(0074) }
(0075)
(0076) Read_RegYear(void)
(0077) {
(0078) return YEAR;
_Read_RegYear:
02C0 9100A009 LDS R16,0xA009
02C2 2711 CLR R17
02C3 9508 RET
_juddisplay:
x --> R22
y --> R20
number --> R10
02C4 940E048B CALL push_gset3
02C6 2F42 MOV R20,R18
02C7 2EA0 MOV R10,R16
02C8 9723 SBIW R28,3
02C9 8569 LDD R22,Y+9
(0079) }
(0080)
(0081) /*********************************显示处理函数************************************/
(0082)
(0083) void juddisplay(uchar number,uchar y,uchar x) //(要显示的字符,X位置,Y位置)
(0084) {
(0085) switch(number) //判断数字是几,并显示在指定位置上
02CA 24BB CLR R11
02CB 20AA TST R10
02CC F419 BNE 0x02D0
02CD 20BB TST R11
02CE F409 BNE 0x02D0
02CF C02F RJMP 0x02FF
02D0 01C5 MOVW R24,R10
02D1 3081 CPI R24,1
02D2 E0E0 LDI R30,0
02D3 079E CPC R25,R30
02D4 F409 BNE 0x02D6
02D5 C032 RJMP 0x0308
02D6 3082 CPI R24,2
02D7 E0E0 LDI R30,0
02D8 079E CPC R25,R30
02D9 F409 BNE 0x02DB
02DA C036 RJMP 0x0311
02DB 3083 CPI R24,3
02DC E0E0 LDI R30,0
02DD 079E CPC R25,R30
02DE F409 BNE 0x02E0
02DF C03A RJMP 0x031A
02E0 3084 CPI R24,4
02E1 E0E0 LDI R30,0
02E2 079E CPC R25,R30
02E3 F409 BNE 0x02E5
02E4 C03E RJMP 0x0323
02E5 3085 CPI R24,5
02E6 E0E0 LDI R30,0
02E7 079E CPC R25,R30
02E8 F409 BNE 0x02EA
02E9 C042 RJMP 0x032C
02EA 3086 CPI R24,6
02EB E0E0 LDI R30,0
02EC 079E CPC R25,R30
02ED F409 BNE 0x02EF
02EE C046 RJMP 0x0335
02EF 3087 CPI R24,7
02F0 E0E0 LDI R30,0
02F1 079E CPC R25,R30
02F2 F409 BNE 0x02F4
02F3 C04A RJMP 0x033E
02F4 3088 CPI R24,0x8
02F5 E0E0 LDI R30,0
02F6 079E CPC R25,R30
02F7 F409 BNE 0x02F9
02F8 C04E RJMP 0x0347
02F9 3089 CPI R24,0x9
02FA E0E0 LDI R30,0
02FB 079E CPC R25,R30
02FC F409 BNE 0x02FE
02FD C052 RJMP 0x0350
02FE C059 RJMP 0x0358
(0086) {
(0087) case 0x00:display_char(n01,n02,y,x);break;
02FF 836A STD Y+2,R22
0300 8348 STD Y+0,R20
0301 E028 LDI R18,0x8
0302 E031 LDI R19,1
0303 E000 LDI R16,0
0304 E011 LDI R17,1
0305 940E01DB CALL _display_char
0307 C050 RJMP 0x0358
(0088) case 0x01:display_char(n11,n12,y,x);break;
0308 836A STD Y+2,R22
0309 8348 STD Y+0,R20
030A E128 LDI R18,0x18
030B E031 LDI R19,1
030C E100 LDI R16,0x10
030D E011 LDI R17,1
030E 940E01DB CALL _display_char
0310 C047 RJMP 0x0358
(0089) case 0x02:display_char(n21,n22,y,x);break;
0311 836A STD Y+2,R22
0312 8348 STD Y+0,R20
0313 E228 LDI R18,0x28
0314 E031 LDI R19,1
0315 E200 LDI R16,0x20
0316 E011 LDI R17,1
0317 940E01DB CALL _display_char
0319 C03E RJMP 0x0358
(0090) case 0x03:display_char(n31,n32,y,x);break;
031A 836A STD Y+2,R22
031B 8348 STD Y+0,R20
031C E328 LDI R18,0x38
031D E031 LDI R19,1
031E E300 LDI R16,0x30
031F E011 LDI R17,1
0320 940E01DB CALL _display_char
0322 C035 RJMP 0x0358
(0091) case 0x04:display_char(n41,n42,y,x);break;
0323 836A STD Y+2,R22
0324 8348 STD Y+0,R20
0325 E428 LDI R18,0x48
0326 E031 LDI R19,1
0327 E400 LDI R16,0x40
0328 E011 LDI R17,1
0329 940E01DB CALL _display_char
032B C02C RJMP 0x0358
(0092) case 0x05:display_char(n51,n52,y,x);break;
032C 836A STD Y+2,R22
032D 8348 STD Y+0,R20
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -