📄 8563.lst
字号:
__start:
__text_start:
0050 E5CF LDI R28,0x5F
0051 E0D4 LDI R29,4
0052 BFCD OUT 0x3D,R28
0053 BFDE OUT 0x3E,R29
0054 51C0 SUBI R28,0x10
0055 40D0 SBCI R29,0
0056 EA0A LDI R16,0xAA
0057 8308 STD Y+0,R16
0058 2400 CLR R0
0059 EAEC LDI R30,0xAC
005A E0F0 LDI R31,0
005B E010 LDI R17,0
005C 3AEF CPI R30,0xAF
005D 07F1 CPC R31,R17
005E F011 BEQ 0x0061
005F 9201 ST R0,Z+
0060 CFFB RJMP 0x005C
0061 8300 STD Z+0,R16
0062 E5E4 LDI R30,0x54
0063 E0F0 LDI R31,0
0064 E6A0 LDI R26,0x60
0065 E0B0 LDI R27,0
0066 E010 LDI R17,0
0067 3AE0 CPI R30,0xA0
0068 07F1 CPC R31,R17
0069 F021 BEQ 0x006E
006A 95C8 LPM
006B 9631 ADIW R30,1
006C 920D ST R0,X+
006D CFF9 RJMP 0x0067
006E 940E0265 CALL _main
_exit:
0070 CFFF RJMP _exit
_delay:
i --> R20
n --> R16
0071 940E037C CALL push_gset1
FILE: H:\bbi项目源程序\8563时钟芯片\lcd.h
(0001) #define LCD_DATAL PORTA&=~BIT(1)
(0002) #define LCD_DATAH PORTA|=BIT(1)
(0003) #define LCD_CLKL PORTA&=~BIT(3)
(0004) #define LCD_CLKH PORTA|=BIT(3)
(0005) void delay(unsigned char n)
(0006) {
(0007) unsigned char i;
(0008) for(i=0;i<n;i++) //延时
0073 2744 CLR R20
0074 C002 RJMP 0x0077
(0009) {asm("nop");}
0075 0000 NOP
0076 9543 INC R20
0077 1740 CP R20,R16
0078 F3E0 BCS 0x0075
0079 940E037F CALL pop_gset1
007B 9508 RET
_lcd_out:
i --> R20
send_byte --> R22
007C 940E037A CALL push_gset2
007E 2F60 MOV R22,R16
(0010) }
(0011) //*************************************************************************
(0012)
(0013) //***************************************************************************
(0014) void lcd_out(unsigned char send_byte)
(0015) {
(0016) unsigned char i;
(0017) for (i=0;i<8;i++)
007F 2744 CLR R20
0080 C009 RJMP 0x008A
(0018) {
(0019) if((send_byte&0x80)==0)
0081 FD67 SBRC R22,7
0082 C002 RJMP 0x0085
(0020) {
(0021) LCD_DATAL;
0083 98D9 CBI 0x1B,1
(0022) }
0084 C001 RJMP 0x0086
(0023) else
(0024) {
(0025) LCD_DATAH;
0085 9AD9 SBI 0x1B,1
(0026) } //送数据
(0027) LCD_CLKL;
0086 98DB CBI 0x1B,3
(0028) LCD_CLKH;
0087 9ADB SBI 0x1B,3
(0029) send_byte=send_byte<<1;
0088 0F66 LSL R22
0089 9543 INC R20
008A 3048 CPI R20,0x8
008B F3A8 BCS 0x0081
(0030) }
(0031) delay(256);
008C E000 LDI R16,0
008D DFE3 RCALL _delay
008E 940E036E CALL pop_gset2
0090 9508 RET
_WR_dat:
s --> R20
dat --> R22
0091 940E037A CALL push_gset2
0093 2F60 MOV R22,R16
(0032) }
(0033) //***************************************************************************
(0034)
(0035) void WR_dat(unsigned char dat)
(0036) {
(0037) unsigned char s;
(0038) s=dat&0xf0;
0094 2F46 MOV R20,R22
0095 7F40 ANDI R20,0xF0
(0039) lcd_out(0xfa);
0096 EF0A LDI R16,0xFA
0097 DFE4 RCALL _lcd_out
(0040) lcd_out(s);
0098 2F04 MOV R16,R20
0099 DFE2 RCALL _lcd_out
(0041) s=dat&0x0f;
009A 2F46 MOV R20,R22
009B 704F ANDI R20,0xF
(0042) s<<=4;
009C 2F84 MOV R24,R20
009D 708F ANDI R24,0xF
009E 9582 SWAP R24
009F 2F48 MOV R20,R24
(0043) lcd_out(s);
00A0 2F08 MOV R16,R24
00A1 DFDA RCALL _lcd_out
00A2 940E036E CALL pop_gset2
00A4 9508 RET
_WR_control:
s --> R20
dat --> R22
00A5 940E037A CALL push_gset2
00A7 2F60 MOV R22,R16
(0044) }
(0045) //**************************************************************************
(0046) void WR_control(unsigned char dat)
(0047) {
(0048) unsigned char s;
(0049) s=dat&0xf0;
00A8 2F46 MOV R20,R22
00A9 7F40 ANDI R20,0xF0
(0050) lcd_out(0xf8);
00AA EF08 LDI R16,0xF8
00AB DFD0 RCALL _lcd_out
(0051) lcd_out(s);
00AC 2F04 MOV R16,R20
00AD DFCE RCALL _lcd_out
(0052) s=dat&0x0f;
00AE 2F46 MOV R20,R22
00AF 704F ANDI R20,0xF
(0053) s<<=4;
00B0 2F84 MOV R24,R20
00B1 708F ANDI R24,0xF
00B2 9582 SWAP R24
00B3 2F48 MOV R20,R24
(0054) lcd_out(s);
00B4 2F08 MOV R16,R24
00B5 DFC6 RCALL _lcd_out
00B6 940E036E CALL pop_gset2
00B8 9508 RET
(0055) }
(0056) //**************************************************************************
(0057) void lcd_control()
(0058) {
(0059) WR_control(0x30);
_lcd_control:
00B9 E300 LDI R16,0x30
00BA DFEA RCALL _WR_control
(0060) WR_control(0x0c);
00BB E00C LDI R16,0xC
00BC DFE8 RCALL _WR_control
00BD 9508 RET
_lcd_clear:
i --> R20
00BE 940E037C CALL push_gset1
(0061) }
(0062) /**************************************************************************/
(0063) void lcd_clear()
(0064) {
(0065) int i;
(0066) WR_control(0x01);
00C0 E001 LDI R16,1
00C1 DFE3 RCALL _WR_control
(0067) for(i=0;i<5000;i++) // 延时5ms
00C2 2744 CLR R20
00C3 2755 CLR R21
(0068) {
(0069) asm("nop");
00C4 0000 NOP
(0070) asm("nop");
00C5 0000 NOP
00C6 5F4F SUBI R20,0xFF
00C7 4F5F SBCI R21,0xFF
00C8 3848 CPI R20,0x88
00C9 E1E3 LDI R30,0x13
00CA 075E CPC R21,R30
00CB F3C4 BLT 0x00C4
00CC 940E037F CALL pop_gset1
00CE 9508 RET
_LCD_address:
address --> R20
y --> R22
x --> R20
00CF 940E037A CALL push_gset2
00D1 2F62 MOV R22,R18
00D2 2F40 MOV R20,R16
(0071)
(0072) }
(0073) }
(0074) /*******************************************************/
(0075) /****** 函数名称: LCD_set_xy() ******/
(0076) /****** 功 能: 设置LCD显示坐标 ******/
(0077) /****** 参 数: 显示字符串的位置,X:0-15,Y:0-1*****/
(0078) /****** 返回值 : 无 ******/
(0079) /*******************************************************/
(0080) void LCD_address( unsigned char x, unsigned char y )
(0081) {
(0082) unsigned char address;
(0083) switch(x)
00D3 2755 CLR R21
00D4 3040 CPI R20,0
00D5 0745 CPC R20,R21
00D6 F069 BEQ 0x00E4
00D7 3041 CPI R20,1
00D8 E0E0 LDI R30,0
00D9 075E CPC R21,R30
00DA F061 BEQ 0x00E7
00DB 3042 CPI R20,2
00DC E0E0 LDI R30,0
00DD 075E CPC R21,R30
00DE F059 BEQ 0x00EA
00DF 3043 CPI R20,3
00E0 E0E0 LDI R30,0
00E1 075E CPC R21,R30
00E2 F051 BEQ 0x00ED
00E3 C00C RJMP 0x00F0
(0084) {
(0085) case 0:
(0086) address = 0x80 + y; //计算显示地址
00E4 2F46 MOV R20,R22
00E5 5840 SUBI R20,0x80
(0087) break;
00E6 C00B RJMP 0x00F2
(0088) case 1:
(0089) address = 0x90 + y; //计算显示地址
00E7 2F46 MOV R20,R22
00E8 5740 SUBI R20,0x70
(0090) break;
00E9 C008 RJMP 0x00F2
(0091) case 2:
(0092) address = 0x88 + y; //计算显示地址
00EA 2F46 MOV R20,R22
00EB 5748 SUBI R20,0x78
(0093) break;
00EC C005 RJMP 0x00F2
(0094) case 3:
(0095) address = 0x98 + y; //计算显示地址
00ED 2F46 MOV R20,R22
00EE 5648 SUBI R20,0x68
(0096) break;
00EF C002 RJMP 0x00F2
(0097) default:address = 0x80 + y;
00F0 2F46 MOV R20,R22
00F1 5840 SUBI R20,0x80
(0098) }
(0099) WR_control( address); //写地址命令
00F2 2F04 MOV R16,R20
00F3 DFB1 RCALL _WR_control
00F4 940E036E CALL pop_gset2
00F6 9508 RET
_LCD_Write_string:
s --> R20
Y --> R10
X --> R22
00F7 940E0378 CALL push_gset3
00F9 2EA2 MOV R10,R18
00FA 2F60 MOV R22,R16
00FB 814E LDD R20,Y+6
00FC 815F LDD R21,Y+7
(0100) }
(0101) //**************************************************************************
(0102) /*******************************************************/
(0103) /****** 函数名称: LCD_write_string() ******/
(0104) /****** 功 能: 中英文字符串显示函数 ******/
(0105) /****** 参 数: *s--英文字符串指针 ******/
(0106) /****** X、Y--显示字符串的位置 ******/
(0107) /****** 返回值 : 无 ******/
(0108) /*******************************************************/
(0109) void LCD_Write_string(unsigned char X,unsigned char Y,unsigned char *s)
(0110) {
(0111)
(0112) LCD_address( X, Y ); //写显示地址
00FD 2D2A MOV R18,R10
00FE 2F06 MOV R16,R22
00FF DFCF RCALL _LCD_address
0100 C005 RJMP 0x0106
(0113) while (*s) //是否到字符串尾
(0114) {
(0115) WR_dat (*s ); //写显示数据
0101 01FA MOVW R30,R20
0102 8100 LDD R16,Z+0
0103 DF8D RCALL _WR_dat
(0116) s ++; //字符串地址加1
0104 5F4F SUBI R20,0xFF
0105 4F5F SBCI R21,0xFF
0106 01FA MOVW R30,R20
0107 8020 LDD R2,Z+0
0108 2022 TST R2
0109 F7B9 BNE 0x0101
010A 940E0371 CALL pop_gset3
010C 9508 RET
(0117) }
(0118) }
(0119)
(0120)
(0121) /******************************************************************************/
(0122) //函数功能:将BCD码转换为ASCII码函数
(0123) //输入数据:BCD
(0124) //输出:ASCII
(0125) //作者:韩红瑞
(0126) //修改时间:2006-08-31
(0127) /******************************************************************************/
(0128) unsigned char BCD_ASCII(unsigned char bcd)
(0129) {
(0130) bcd &= 0x0F;
_BCD_ASCII:
bcd --> R16
010D 700F ANDI R16,0xF
(0131) if(bcd > 9)
010E E089 LDI R24,0x9
010F 1780 CP R24,R16
0110 F410 BCC 0x0113
(0132) bcd +=('7'); // 将A~F转换为ASCII
0111 5C09 SUBI R16,0xC9
0112 C001 RJMP 0x0114
(0133) else
(0134) bcd += '0'; // 将0~9转换为ASCII 0~9
0113 5D00 SUBI R16,0xD0
(0135) return(bcd);
0114 9508 RET
_LCD_writeasc:
data --> Y+4
y --> R22
x --> R20
0115 940E037A CALL push_gset2
0117 2F62 MOV R22,R18
0118 2F40 MOV R20,R16
(0136) }
(0137)
(0138)
(0139) void LCD_writeasc(unsigned char x, unsigned char y, unsigned char data)
(0140) {
(0141) LCD_address(x,y);
0119 2F26 MOV R18,R22
011A 2F04 MOV R16,R20
011B DFB3 RCALL _LCD_address
(0142) WR_dat(data);
011C 810C LDD R16,Y+4
011D DF73 RCALL _WR_dat
011E 940E036E CALL pop_gset2
0120 9508 RET
(0143) }
(0144)
(0145) void Lcd_INT()
(0146) {
(0147) DDRA|=BIT(1);
_Lcd_INT:
0121 9AD1 SBI 0x1A,1
(0148) DDRA|=BIT(3);
0122 9AD3 SBI 0x1A,3
(0149) lcd_control();
0123 DF95 RCALL _lcd_control
0124 9508 RET
_lcd_writechar:
number --> Y+4
Y --> R22
X --> R20
0125 940E037A CALL push_gset2
0127 2F62 MOV R22,R18
0128 2F40 MOV R20,R16
(0150) }
(0151)
(0152) void lcd_writechar(unsigned char X,unsigned char Y,unsigned char number)
(0153) {
(0154) LCD_address(X,Y);
0129 2F26 MOV R18,R22
012A 2F04 MOV R16,R20
012B DFA3 RCALL _LCD_address
(0155) WR_dat(BCD_ASCII(number>>4));
012C 810C LDD R16,Y+4
012D 9502 SWAP R16
012E 700F ANDI R16,0xF
012F DFDD RCALL _BCD_ASCII
0130 DF60 RCALL _WR_dat
(0156) WR_dat(BCD_ASCII(number));
0131 810C LDD R16,Y+4
0132 DFDA RCALL _BCD_ASCII
0133 DF5D RCALL _WR_dat
0134 940E036E CALL pop_gset2
0136 9508 RET
_lcd_write2:
number --> Y+4
Y --> R22
X --> R20
0137 940E037A CALL push_gset2
0139 2F62 MOV R22,R18
013A 2F40 MOV R20,R16
(0157) }
(0158)
(0159) void lcd_write2(unsigned char X,unsigned char Y,unsigned char number)
(0160) {
(0161) LCD_address(X,Y);
013B 2F26 MOV R18,R22
013C 2F04 MOV R16,R20
013D DF91 RCALL _LCD_address
(0162) WR_dat(BCD_ASCII(number%100/10));
013E E614 LDI R17,0x64
013F 810C LDD R16,Y+4
0140 940E0356 CALL mod8u
0142 E01A LDI R17,0xA
0143 940E0358 CALL div8u
0145 DFC7 RCALL _BCD_ASCII
0146 DF4A RCALL _WR_dat
(0163) WR_dat(BCD_ASCII(number%10));
0147 E01A LDI R17,0xA
0148 810C LDD R16,Y+4
0149 940E0356 CALL mod8u
014B DFC1 RCALL _BCD_ASCII
014C DF44 RCALL _WR_dat
014D 940E036E CALL pop_gset2
014F 9508 RET
FILE: H:\bbi项目源程序\8563时钟芯片\delay.h
(0001) //#define F_CPU 12000000
(0002) #define F_CPU 11059200
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -