📄 h2test.lst
字号:
(0023) 功能:清除lcd指定页内显示的所有数据
(0024)
(0025) 7.Bmp8x8()
(0026) 功能:显示8个点乘8个点的图像
(0027)
(0028) 9.Bmp8x16()
(0029) 功能:显示8个点乘16个点的图像
(0030)
(0031)
(0032) 10.Bmp8x16_Rev()_
(0033) 功能:反白显示8个点乘16个点的图像
(0034)
(0035) 11.Draw_NtoArab()
(0036) 功能:将数值显示为阿拉伯数字
(0037)
(0038) 12.Draw_NtoArab_rev()
(0039) 功能:反白显示
(0040)
(0041) ***********************************************************/
(0042) #include <iom16v.h>
(0043) #include <macros.h>
(0044) #include "main.h"
(0045) #include "lcd.h"
(0046)
(0047) void Send_Byte(unsigned char bdata)
(0048) {
(0049) set_CS; //模拟时序信号
_Send_Byte:
bdata --> R16
04D9 9AA9 SBI 0x15,1
(0050) set_CS;
04DA 9AA9 SBI 0x15,1
(0051) set_RS;
04DB 9AAF SBI 0x15,7
(0052) set_WR;
04DC 9A95 SBI 0x12,5
(0053) _nop; //开始发送数据
04DD 0000 NOP
(0054) PORTA = bdata; //将显示数据放在端口A
04DE BB0B OUT 0x1B,R16
(0055) set_RS;
04DF 9AAF SBI 0x15,7
(0056) clr_CS;
04E0 98A9 CBI 0x15,1
(0057) clr_WR;
04E1 9895 CBI 0x12,5
(0058) _nop;
04E2 0000 NOP
(0059) clr_WR;
04E3 9895 CBI 0x12,5
(0060) _nop;
04E4 0000 NOP
(0061) set_WR;
04E5 9A95 SBI 0x12,5
(0062) _nop;
04E6 0000 NOP
(0063) set_CS;
04E7 9AA9 SBI 0x15,1
(0064) set_RS;
04E8 9AAF SBI 0x15,7
04E9 9508 RET
(0065) }
(0066)
(0067)
(0068) void Send_Command(unsigned char cdata)
(0069) {
(0070) set_CS;
_Send_Command:
cdata --> R16
04EA 9AA9 SBI 0x15,1
(0071) set_RS;
04EB 9AAF SBI 0x15,7
(0072) set_WR;
04EC 9A95 SBI 0x12,5
(0073) _nop; //开始发送命令
04ED 0000 NOP
(0074) PORTA = cdata; //将命令字放在端口A
04EE BB0B OUT 0x1B,R16
(0075) clr_RS;
04EF 98AF CBI 0x15,7
(0076) clr_CS;
04F0 98A9 CBI 0x15,1
(0077) _nop;
04F1 0000 NOP
(0078) clr_WR;
04F2 9895 CBI 0x12,5
(0079) _nop;
04F3 0000 NOP
(0080) set_WR;
04F4 9A95 SBI 0x12,5
(0081) _nop;
04F5 0000 NOP
(0082) set_CS;
04F6 9AA9 SBI 0x15,1
(0083) set_RS;
04F7 9AAF SBI 0x15,7
04F8 9508 RET
_Gen_Column_MSB:
temp --> R20
column --> R16
04F9 940E0ECA CALL push_gset1
(0084) }
(0085)
(0086)
(0087)
(0088) unsigned char Gen_Column_MSB(unsigned char column)
(0089) {
(0090) unsigned char temp; //用于保存列数的高4bit命令字
(0091) temp = column+0x04 ;
04FB 2F40 MOV R20,R16
04FC 5F4C SUBI R20,0xFC
(0092) temp = temp >>4; //右移4位,得到高4位的列数据
04FD 2F84 MOV R24,R20
04FE 9582 SWAP R24
04FF 708F ANDI R24,0xF
0500 2F48 MOV R20,R24
(0093) temp |=0x10; //00010000,将列地址的DB4置1
0501 6140 ORI R20,0x10
(0094) return temp;
0502 2F04 MOV R16,R20
0503 940E0ECD CALL pop_gset1
0505 9508 RET
_Gen_Column_LSB:
temp --> R20
column --> R16
0506 940E0ECA CALL push_gset1
(0095) }
(0096)
(0097)
(0098)
(0099)
(0100) unsigned char Gen_Column_LSB(unsigned char column)
(0101) {
(0102) unsigned char temp = column;
0508 2F40 MOV R20,R16
(0103) temp = column+0x04 ;
0509 5F4C SUBI R20,0xFC
(0104) temp &= 0x0f; //取出column的低四位
050A 704F ANDI R20,0xF
(0105) return temp;
050B 2F04 MOV R16,R20
050C 940E0ECD CALL pop_gset1
050E 9508 RET
_Gen_Page:
temp --> R20
page --> R16
050F 940E0ECA CALL push_gset1
(0106) }
(0107)
(0108)
(0109)
(0110)
(0111) unsigned char Gen_Page(unsigned char page)
(0112) {
(0113) unsigned char temp;
(0114) temp = page & 0x0f;
0511 2F40 MOV R20,R16
0512 704F ANDI R20,0xF
(0115) temp |= 0xb0; //得到显示数据页的控制字
0513 6B40 ORI R20,0xB0
(0116) return temp;
0514 2F04 MOV R16,R20
0515 940E0ECD CALL pop_gset1
0517 9508 RET
(0117) }
(0118)
(0119)
(0120)
(0121)
(0122) void Initial_LCD(void)
(0123) {
(0124) Send_Command(0xe2); //初始化内部功能(RESET),初始化初始显示线,列地址,页地址和普通
_Initial_LCD:
0518 EE02 LDI R16,0xE2
0519 DFD0 RCALL _Send_Command
(0125) //输出地址状态到初始状态,但是不能影响显示数据RAM的内容
(0126) wait; //等待2个时钟周期
051A 0000 NOP
051B 0000 NOP
(0127) Send_Command(0xaf); //Display on
051C EA0F LDI R16,0xAF
051D DFCC RCALL _Send_Command
(0128) Send_Command(0x23); //internal voltage regulator resistor ratio,(4.5)0x23
051E E203 LDI R16,0x23
051F DFCA RCALL _Send_Command
(0129) Send_Command(0x2f); //内部供电VC=VR=VF:111,使内部VC,VR,VF的电压控制电路工作
0520 E20F LDI R16,0x2F
0521 DFC8 RCALL _Send_Command
(0130) Send_Command(0x40); //初始化显示线在line address 0
0522 E400 LDI R16,0x40
0523 DFC6 RCALL _Send_Command
(0131) Send_Command(0x81); //设置参考电压模式对比度共64级
0524 E801 LDI R16,0x81
0525 DFC4 RCALL _Send_Command
(0132) Send_Command(0xa1);
0526 EA01 LDI R16,0xA1
0527 DFC2 RCALL _Send_Command
(0133) Send_Command(0xa1);
0528 EA01 LDI R16,0xA1
0529 DFC0 RCALL _Send_Command
(0134) Send_Command(0xa3); //选择LCD偏置电压比率以驱动LCD,bias=1
052A EA03 LDI R16,0xA3
052B DFBE RCALL _Send_Command
(0135) Send_Command(0xa4); //全亮显示,EON=0,normal display(不管显示RAM中有何数据)
052C EA04 LDI R16,0xA4
052D DFBC RCALL _Send_Command
(0136) Send_Command(0xb0); //设置页地址为0
052E EB00 LDI R16,0xB0
052F DFBA RCALL _Send_Command
(0137) Send_Command(0x0c); //选择COM(行地址)输出扫描方向,决定LCD驱动器的输出状态。SHL=0,normal direction(COM0-COM63)
0530 E00C LDI R16,0xC
0531 DFB8 RCALL _Send_Command
(0138) Send_Command(0xad); //设置STATIC INDICATOR STATUS(SM=1,STATIC INDICATOR ON)
0532 EA0D LDI R16,0xAD
0533 DFB6 RCALL _Send_Command
(0139) Send_Command(0x03); //STATUS OF STATIC INDICATOR OUTPUT ALWAYS ON
0534 E003 LDI R16,3
0535 DFB4 RCALL _Send_Command
0536 9508 RET
_Clear_DDRAM:
c_column_lsb --> R20
c_column_msb --> R20
start_page --> R22
j --> R20
i --> R12
c_page_end --> R10
c_page_start --> R12
0537 940E0EC4 CALL push_gset4
0539 2EA2 MOV R10,R18
053A 2EC0 MOV R12,R16
(0140) }
(0141)
(0142)
(0143)
(0144) void Clear_DDRAM(unsigned char c_page_start,unsigned char c_page_end)
(0145) {
(0146) unsigned char i,j;
(0147) unsigned char start_page; //用于存放清除的起始页数
(0148) unsigned char c_column_msb=0x10,c_column_lsb=0x04; //清除的起始列为第4列
053B E140 LDI R20,0x10
053C E044 LDI R20,4
(0149)
(0150) start_page = Gen_Page(c_page_start); //取得清除的起始页地址
053D 2D0C MOV R16,R12
053E DFD0 RCALL _Gen_Page
053F 2F60 MOV R22,R16
(0151) for(j=c_page_start;j<=c_page_end;j++)
0540 2D4C MOV R20,R12
0541 C010 RJMP 0x0552
(0152) {
(0153) Send_Command(0x10); //从第4列开始清除LCD显示的数据
0542 E100 LDI R16,0x10
0543 DFA6 RCALL _Send_Command
(0154) Send_Command(0x04);
0544 E004 LDI R16,4
0545 DFA4 RCALL _Send_Command
(0155) Send_Command(start_page); //清除位置在第start_page页
0546 2F06 MOV R16,R22
0547 DFA2 RCALL _Send_Command
(0156) for(i=0;i<=127;i++)
0548 24CC CLR R12
0549 C003 RJMP 0x054D
(0157) {
(0158) Send_Byte(WHITE); //清除页内所有列显示的数据
054A 2700 CLR R16
054B DF8D RCALL _Send_Byte
054C 94C3 INC R12
054D E78F LDI R24,0x7F
054E 158C CP R24,R12
054F F7D0 BCC 0x054A
(0159) }
(0160) start_page++; //清除下一页数据
0550 9563 INC R22
0551 9543 INC R20
0552 16A4 CP R10,R20
0553 F770 BCC 0x0542
0554 940E0EBC CALL pop_gset4
0556 9508 RET
_Bmp8x8:
i --> R20
pdata --> R22
column --> R20
page --> R10
0557 940E0EC6 CALL push_gset3
0559 2F42 MOV R20,R18
055A 2EA0 MOV R10,R16
055B 816E LDD R22,Y+6
055C 817F LDD R23,Y+7
(0161) }
(0162) }
(0163)
(0164) //////////////////////////////////////////////////////////////////////////
(0165) //绘制一个8*8大小的位图
(0166) //////////////////////////////////////////////////////////////////////////
(0167) void Bmp8x8(unsigned char page,unsigned char column,const unsigned char
(0168) *pdata)
(0169) {
(0170) unsigned char i;
(0171)
(0172) Send_Command(Gen_Page(page)); //送页地址
055D 2D0A MOV R16,R10
055E DFB0 RCALL _Gen_Page
055F DF8A RCALL _Send_Command
(0173) Send_Command(Gen_Column_LSB(column)); //送低4位地址
0560 2F04 MOV R16,R20
0561 DFA4 RCALL _Gen_Column_LSB
0562 DF87 RCALL _Send_Command
(0174) Send_Command(Gen_Column_MSB(column)); //送高4位地址
0563 2F04 MOV R16,R20
0564 DF94 RCALL _Gen_Column_MSB
0565 DF84 RCALL _Send_Command
(0175) for(i=0;i<=7;i++) //水平宽度为8列
0566 2744 CLR R20
0567 C006 RJMP 0x056E
(0176) {
(0177) Send_Byte(*pdata);
0568 01FB MOVW R30,R22
0569 9104 LPM R16,0(Z)
056A DF6E RCALL _Send_Byte
(0178) pdata++;
056B 5F6F SUBI R22,0xFF
056C 4F7F SBCI R23,0xFF
056D 9543 INC R20
056E E087 LDI R24,7
056F 1784 CP R24,R20
0570 F7B8 BCC 0x0568
0571 940E0EB9 CALL pop_gset3
0573 9508 RET
_Bmp8x16:
j --> R20
i --> R14
pdata --> R10
column --> R12
page --> R22
0574 940E0EC2 CALL push_gset5
0576 2EC2 MOV R12,R18
0577 2F60 MOV R22,R16
0578 84AA LDD R10,Y+10
0579 84BB LDD R11,Y+11
(0179) }
(0180) }
(0181) //////////////////////////////////////////////////////////////////////////
(0182) //绘制一个8*16大小的位图
(0183) //////////////////////////////////////////////////////////////////////////
(0184) void Bmp8x16(unsigned char page,unsigned char column,const unsigned char
(0185) *pdata)
(0186) {
(0187) unsigned char i;
(0188) unsigned char j;
(0189)
(0190) for(j=0;j<=1;j++)
057A 2744 CLR R20
057B C017 RJMP 0x0593
(0191) {
(0192) Send_Command(Gen_Page(page));
057C 2F06 MOV R16,R22
057D DF91 RCALL _Gen_Page
057E DF6B RCALL _Send_Command
(0193) Send_Command(Gen_Column_LSB(column));
057F 2D0C MOV R16,R12
0580 DF85 RCALL _Gen_Column_LSB
0581 DF68 RCALL _Send_Command
(0194) Send_Command(Gen_Column_MSB(column));
0582 2D0C MOV R16,R12
0583 DF75 RCALL _Gen_Column_MSB
0584 DF65 RCALL _Send_Command
(0195) for(i=0;i<=7;i++)
0585 24EE CLR R14
0586 C007 RJMP 0x058E
(0196) {
(0197) Send_Byte(*pdata);
0587 01F5 MOVW R30,R10
0588 9104 LPM R16,0(Z)
0589 DF4F RCALL _Send_Byte
(0198) pdata++;
058A 01C5 MOVW R24,R10
058B 9601 ADIW R24,1
058C 015C MOVW R10,R24
058D 94E3 INC R14
058E E087 LDI R24,7
058F 158E CP R24,R14
0590 F7B0 BCC 0x0587
(0199) }
(0200) page++;
0591 9563 INC R22
0592 9543 INC R20
0593 E081 LDI R24,1
0594 1784 CP R24,R20
0595 F730 BCC 0x057C
0596 940E0EBF CALL pop_gset5
0598 9508 RET
_Bmp8x16_rev:
j --> R20
i --> R14
pdata --> R10
column --> R12
page --> R22
0599 940E0EC2 CALL push_gset5
059B 2EC2 MOV R12,R18
059C 2F60 MOV R22,R16
059D 84AA LDD R10,Y+10
059E 84BB LDD R11,Y+11
(0201) }
(0202) }
(0203)
(0204) //////////////////////////////////////////////////////////////////////////
(0205) //绘制一个反白显示8*16大小的位图
(0206) //////////////////////////////////////////////////////////////////////////
(0207) void Bmp8x16_rev(unsigned char page,unsigned char column,const unsigned char
(0208) *pdata)
(0209) {
(0210) unsigned char i;
(0211) unsigned char j;
(0212)
(0213) for(j=0;j<=1;j++)
059F 2744 CLR R20
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -