📄 disp.lst
字号:
__start:
__text_start:
052E EFCF LDI R28,0xFF
052F E1D0 LDI R29,0x10
0530 BFCD OUT 0x3D,R28
0531 BFDE OUT 0x3E,R29
0532 51C0 SUBI R28,0x10
0533 40D0 SBCI R29,0
0534 EA0A LDI R16,0xAA
0535 8308 STD Y+0,R16
0536 2400 CLR R0
0537 E0E0 LDI R30,0
0538 E0F1 LDI R31,1
0539 E011 LDI R17,1
053A 30E0 CPI R30,0
053B 07F1 CPC R31,R17
053C F011 BEQ 0x053F
053D 9201 ST R0,Z+
053E CFFB RJMP 0x053A
053F 8300 STD Z+0,R16
0540 E5EC LDI R30,0x5C
0541 E0FA LDI R31,0xA
0542 E0A0 LDI R26,0
0543 E0B1 LDI R27,1
0544 E01A LDI R17,0xA
0545 35EC CPI R30,0x5C
0546 07F1 CPC R31,R17
0547 F021 BEQ 0x054C
0548 95C8 LPM
0549 9631 ADIW R30,1
054A 920D ST R0,X+
054B CFF9 RJMP 0x0545
054C 940E077D CALL _main
_exit:
054E CFFF RJMP _exit
FILE: D:\DISP\HD61202.c
(0001)
(0002)
(0003) //关于12864的程序(ATMage64/HD61202)
(0004)
(0005)
(0006) //主程序:
(0007)
(0008) /************************************************************
(0009) LCD采用HD61202,192x64
(0010) 控制单片机ATMage64 8MHz
(0011) ************************************************************/
(0012)
(0013) #include <iom64v.h>
(0014) #include <macros.h>
(0015) //#include <delay.h>
(0016) #include <stdio.h>
(0017) #include <D:\DISP\Hz.h>
(0018)
(0019) #define BIT(x) (1 << (x))
(0020)
(0021)
(0022) /*LCD引脚定义 PA0-7对应LCD DB0-DB7*/
(0023) #define CS1 0
(0024) #define CS2 1
(0025) #define CS3 2
(0026) #define E 3
(0027) #define RW 4
(0028) #define RS 5
(0029) #define LCD_LIGHT 6
(0030)
(0031) //===================
(0032) void LCD_NOP(void)
(0033) {
(0034) unsigned char i;
(0035) for(i=0;i<50;i++);
_LCD_NOP:
i --> R16
054F 2700 CLR R16
0550 C001 RJMP 0x0552
0551 9503 INC R16
0552 3302 CPI R16,0x32
0553 F3E8 BCS 0x0551
0554 9508 RET
_Delay:
j --> R20
i --> R22
x --> R16
0555 940E07CC CALL push_gset2
(0036) }
(0037)
(0038) //===================
(0039) void Delay(int x)
(0040) {
(0041) int i,j;
(0042) for(j=0;j<x;j++)
0557 2744 CLR R20
0558 2755 CLR R21
0559 C00A RJMP 0x0564
(0043) {
(0044) for(i=0;i<250;i++);
055A 2766 CLR R22
055B 2777 CLR R23
055C 5F6F SUBI R22,0xFF
055D 4F7F SBCI R23,0xFF
055E 3F6A CPI R22,0xFA
055F E0E0 LDI R30,0
0560 077E CPC R23,R30
0561 F3D4 BLT 0x055C
0562 5F4F SUBI R20,0xFF
0563 4F5F SBCI R21,0xFF
0564 1740 CP R20,R16
0565 0751 CPC R21,R17
0566 F39C BLT 0x055A
0567 940E07C0 CALL pop_gset2
0569 9508 RET
_LCD_Write_ComL:
x --> R20
056A 940E07CE CALL push_gset1
056C 2F40 MOV R20,R16
(0045) }
(0046) }
(0047)
(0048) //===================
(0049) //LCD左半屏写命令字
(0050) //===================
(0051) void LCD_Write_ComL(unsigned char x)
(0052) {
(0053) PORTC&=~BIT(CS1);
056D 98A8 CBI 0x15,0
(0054) PORTC|=BIT(CS2);
056E 9AA9 SBI 0x15,1
(0055) LCD_NOP();
056F DFDF RCALL _LCD_NOP
(0056) PORTC&=~BIT(RS);
0570 98AD CBI 0x15,5
(0057) PORTC|=BIT(E);
0571 9AAB SBI 0x15,3
(0058) LCD_NOP();
0572 DFDC RCALL _LCD_NOP
(0059) PORTC&=~BIT(RW);
0573 98AC CBI 0x15,4
(0060) PORTA=x;
0574 BB4B OUT 0x1B,R20
(0061) PORTC|=BIT(E);
0575 9AAB SBI 0x15,3
(0062) PORTC&=~BIT(E);
0576 98AB CBI 0x15,3
(0063) PORTC|=BIT(CS1);
0577 9AA8 SBI 0x15,0
(0064) PORTC|=BIT(CS2);
0578 9AA9 SBI 0x15,1
0579 940E07D1 CALL pop_gset1
057B 9508 RET
_LCD_Write_DatL:
x --> R20
057C 940E07CE CALL push_gset1
057E 2F40 MOV R20,R16
(0065) }
(0066)
(0067) //===================
(0068) //LCD左半屏写数据
(0069) //===================
(0070) void LCD_Write_DatL(unsigned char x)
(0071) {
(0072) PORTC&=~BIT(CS1);
057F 98A8 CBI 0x15,0
(0073) PORTC|=BIT(CS2);
0580 9AA9 SBI 0x15,1
(0074) LCD_NOP();
0581 DFCD RCALL _LCD_NOP
(0075) PORTC&=~BIT(RS);
0582 98AD CBI 0x15,5
(0076) PORTC|=BIT(E);
0583 9AAB SBI 0x15,3
(0077) LCD_NOP();
0584 DFCA RCALL _LCD_NOP
(0078) PORTC|=BIT(RS);
0585 9AAD SBI 0x15,5
(0079) PORTC&=~BIT(RW);
0586 98AC CBI 0x15,4
(0080) PORTA=x;
0587 BB4B OUT 0x1B,R20
(0081) PORTC|=BIT(E);
0588 9AAB SBI 0x15,3
(0082) PORTC&=~BIT(E);
0589 98AB CBI 0x15,3
(0083) PORTC|=BIT(CS1);
058A 9AA8 SBI 0x15,0
(0084) PORTC|=BIT(CS2);
058B 9AA9 SBI 0x15,1
058C 940E07D1 CALL pop_gset1
058E 9508 RET
_LCD_Write_ComR:
x --> R20
058F 940E07CE CALL push_gset1
0591 2F40 MOV R20,R16
(0085) }
(0086)
(0087) //===================
(0088) //LCD右半屏写命令字
(0089) //===================
(0090) void LCD_Write_ComR(unsigned char x)
(0091) {
(0092) PORTC|=BIT(CS1);
0592 9AA8 SBI 0x15,0
(0093) PORTC&=~BIT(CS2);
0593 98A9 CBI 0x15,1
(0094) LCD_NOP();
0594 DFBA RCALL _LCD_NOP
(0095) PORTC&=~BIT(RS);
0595 98AD CBI 0x15,5
(0096) PORTC|=BIT(E);
0596 9AAB SBI 0x15,3
(0097) LCD_NOP();
0597 DFB7 RCALL _LCD_NOP
(0098) PORTC&=~BIT(RW);
0598 98AC CBI 0x15,4
(0099) PORTA=x;
0599 BB4B OUT 0x1B,R20
(0100) PORTC|=BIT(E);
059A 9AAB SBI 0x15,3
(0101) PORTC&=~BIT(E);
059B 98AB CBI 0x15,3
(0102) PORTC|=BIT(CS1);
059C 9AA8 SBI 0x15,0
(0103) PORTC|=BIT(CS2);
059D 9AA9 SBI 0x15,1
059E 940E07D1 CALL pop_gset1
05A0 9508 RET
_LCD_Write_DatR:
x --> R20
05A1 940E07CE CALL push_gset1
05A3 2F40 MOV R20,R16
(0104) }
(0105)
(0106) //===================
(0107) //LCD右半屏写数据
(0108) //===================
(0109) void LCD_Write_DatR(unsigned char x)
(0110) {
(0111) PORTC|=BIT(CS1);
05A4 9AA8 SBI 0x15,0
(0112) PORTC&=~BIT(CS2);
05A5 98A9 CBI 0x15,1
(0113) LCD_NOP();
05A6 DFA8 RCALL _LCD_NOP
(0114) PORTC&=~BIT(RS);
05A7 98AD CBI 0x15,5
(0115) PORTC|=BIT(E);
05A8 9AAB SBI 0x15,3
(0116) LCD_NOP();
05A9 DFA5 RCALL _LCD_NOP
(0117) PORTC|=BIT(RS);
05AA 9AAD SBI 0x15,5
(0118) PORTC&=~BIT(RW);
05AB 98AC CBI 0x15,4
(0119) PORTA=x;
05AC BB4B OUT 0x1B,R20
(0120) PORTC|=BIT(E);
05AD 9AAB SBI 0x15,3
(0121) PORTC&=~BIT(E);
05AE 98AB CBI 0x15,3
(0122) PORTC|=BIT(CS1);
05AF 9AA8 SBI 0x15,0
(0123) PORTC|=BIT(CS2);
05B0 9AA9 SBI 0x15,1
05B1 940E07D1 CALL pop_gset1
05B3 9508 RET
(0124) }
(0125)
(0126) //LCD初始化
(0127) void LCD_Init(void)
(0128) {
(0129) LCD_Write_ComL(0x3e); LCD_Write_ComR(0x3e); //关闭显示器
_LCD_Init:
05B4 E30E LDI R16,0x3E
05B5 DFB4 RCALL _LCD_Write_ComL
05B6 E30E LDI R16,0x3E
05B7 DFD7 RCALL _LCD_Write_ComR
(0130) LCD_Write_ComL(0x3f); LCD_Write_ComR(0x3f); //打开显示器
05B8 E30F LDI R16,0x3F
05B9 DFB0 RCALL _LCD_Write_ComL
05BA E30F LDI R16,0x3F
05BB DFD3 RCALL _LCD_Write_ComR
(0131) LCD_Write_ComL(0xc0); LCD_Write_ComR(0xc0); //设置左右半屏起始行,从0行开始
05BC EC00 LDI R16,0xC0
05BD DFAC RCALL _LCD_Write_ComL
05BE EC00 LDI R16,0xC0
05BF DFCF RCALL _LCD_Write_ComR
05C0 9508 RET
_LCD_Clr:
j --> R20
i --> R22
05C1 940E07CC CALL push_gset2
(0132) }
(0133)
(0134)
(0135) //LCD清屏
(0136) void LCD_Clr(void)
(0137) {
(0138) unsigned char i,j;
(0139)
(0140) for(j=0;j<8;j++)
05C3 2744 CLR R20
05C4 C014 RJMP 0x05D9
(0141) {
(0142) LCD_Write_ComL(0xb8|j); //左半屏页设置指令
05C5 2F04 MOV R16,R20
05C6 6B08 ORI R16,0xB8
05C7 DFA2 RCALL _LCD_Write_ComL
(0143) LCD_Write_ComL(0x40); //左半屏列地址设置指令
05C8 E400 LDI R16,0x40
05C9 DFA0 RCALL _LCD_Write_ComL
(0144) LCD_Write_ComR(0xb8|j); //右半屏页设置指令
05CA 2F04 MOV R16,R20
05CB 6B08 ORI R16,0xB8
05CC DFC2 RCALL _LCD_Write_ComR
(0145) LCD_Write_ComR(0x40); //右半屏列地址设置指令
05CD E400 LDI R16,0x40
05CE DFC0 RCALL _LCD_Write_ComR
(0146) for(i=0; i<64; i++)
05CF 2766 CLR R22
05D0 C005 RJMP 0x05D6
(0147) {
(0148) LCD_Write_DatL(0x00); //左半屏写0;
05D1 2700 CLR R16
05D2 DFA9 RCALL _LCD_Write_DatL
(0149) LCD_Write_DatR(0x00); //右半屏写0;
05D3 2700 CLR R16
05D4 DFCC RCALL _LCD_Write_DatR
05D5 9563 INC R22
05D6 3460 CPI R22,0x40
05D7 F3C8 BCS 0x05D1
05D8 9543 INC R20
05D9 3048 CPI R20,0x8
05DA F350 BCS 0x05C5
05DB 940E07C0 CALL pop_gset2
05DD 9508 RET
_LCD_WrCHr8x16:
chr_m --> R20
i --> R22
chrx --> Y+8
y --> R10
x --> R12
05DE 940E07C8 CALL push_gset4
05E0 2EA2 MOV R10,R18
05E1 2EC0 MOV R12,R16
(0150) }
(0151) }
(0152) }
(0153)
(0154) //====================================================================
(0155) //功能: 显示8x16字符,位置按8x8一个点来定
(0156) // x:行坐标(x=(0--8)) y:列坐标(y=0--15) chrx:显示字符
(0157) //====================================================================
(0158) void LCD_WrCHr8x16(unsigned char x,unsigned char y,unsigned char chrx)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -