📄 cac.lst
字号:
__text_start:
__start:
0060 EFCF LDI R28,0xFF
0061 E0DF LDI R29,0xF
0062 BFCD OUT 0x3D,R28
0063 BFDE OUT 0x3E,R29
0064 51C0 SUBI R28,0x10
0065 40D0 SBCI R29,0
0066 EA0A LDI R16,0xAA
0067 8308 STD Y+0,R16
0068 2400 CLR R0
0069 E7EF LDI R30,0x7F
006A E0F0 LDI R31,0
006B E010 LDI R17,0
006C 37EF CPI R30,0x7F
006D 07F1 CPC R31,R17
006E F011 BEQ 0x0071
006F 9201 ST R0,Z+
0070 CFFB RJMP 0x006C
0071 8300 STD Z+0,R16
0072 EAE0 LDI R30,0xA0
0073 E0F0 LDI R31,0
0074 E6A0 LDI R26,0x60
0075 E0B0 LDI R27,0
0076 E010 LDI R17,0
0077 3BEF CPI R30,0xBF
0078 07F1 CPC R31,R17
0079 F021 BEQ 0x007E
007A 95C8 LPM
007B 9631 ADIW R30,1
007C 920D ST R0,X+
007D CFF9 RJMP 0x0077
007E 940E0204 CALL _main
_exit:
0080 CFFF RJMP _exit
FILE: E:\单片机\PROJECT\高精度三维太阳自动跟踪器\程序\传感器控制\lcm12864.h
(0001) //ICC-AVR application builder
(0002) // Target : ATMEGA16
(0003) // Crystal: 1Mhz
(0004) // YM12864R (ST7920) 驱动
(0005) // 地址: 第一行: 0x80-0x87
(0006) // 第二行: 0x90-0x97
(0007) // 第三行: 0x88-0x8f
(0008) // 第四行: 0x98-0x9f
(0009) // cacliu 2007.10.6
(0010) //程序调用指令:
(0011) //Send_CMD();
(0012) //Send_DATA();
(0013) //LCM_init();
(0014) //LCD_CLR();
(0015) //DisHZ(unsigned int LCD_COMMAND,unsigned int x, unsigned char *HZS);
(0016) //DisBMP(const unsigned char *img);
(0017) //****************************************
(0018)
(0019)
(0020) #define uint unsigned int
(0021)
(0022) #define Set_CLK PORTB |= (1 <<4) //PORTB|=0x10
(0023) #define Clr_CLK PORTB &= ~(1 <<4) //PORTB&=~0x10
(0024) #define Set_DAT PORTB |= (1 << 6) //PORTB|=0x40
(0025) #define Clr_DAT PORTB &= ~(1 << 6) //PORTB&=~0x40
(0026) #define Set_CS PORTB |= (1 << 5) //PORTB|=0x20
(0027) #define Clr_CS PORTB &= ~(1 << 5) //PORTB&=~0x20
(0028) #define DATOUT DDRB|=0x80
(0029) #define DATIN DDRB&=~0x80
(0030) #define DAT_High PINB&0x80
(0031) //****************************************
(0032) void delayus(char us)
(0033) {
(0034) for (;us!=0;us--)
_delayus:
us --> R16
0081 C002 RJMP 0x0084
(0035) {WDR();}
0082 95A8 WDR
0083 950A DEC R16
0084 2300 TST R16
0085 F7E1 BNE 0x0082
0086 9508 RET
_delayms:
i --> R20
ms --> R16
0087 940E02D4 CALL push_gset1
(0036) }
(0037) //****************************************
(0038) void delayms(uint ms)
(0039) {
(0040) uint i;
(0041)
(0042) for (;ms!=0;ms--)
0089 C00C RJMP 0x0096
(0043) {for (i=461;i!=0;i--)
008A EC4D LDI R20,0xCD
008B E051 LDI R21,1
008C C004 RJMP 0x0091
(0044) {WDR();WDR();}
008D 95A8 WDR
008E 95A8 WDR
008F 5041 SUBI R20,1
0090 4050 SBCI R21,0
0091 3040 CPI R20,0
0092 0745 CPC R20,R21
0093 F7C9 BNE 0x008D
0094 5001 SUBI R16,1
0095 4010 SBCI R17,0
0096 3000 CPI R16,0
0097 0701 CPC R16,R17
0098 F789 BNE 0x008A
0099 940E02D7 CALL pop_gset1
009B 9508 RET
_data_trans:
i --> R20
data --> R16
009C 940E02D4 CALL push_gset1
(0045) }
(0046)
(0047) }
(0048)
(0049) //---------------------------------------------------------
(0050) void data_trans(char data)
(0051) {
(0052) char i;
(0053)
(0054) for (i=8;i!=0;i--)
009E E048 LDI R20,0x8
009F C009 RJMP 0x00A9
(0055) {if (data&0x80)Set_DAT;
00A0 FF07 SBRS R16,7
00A1 C002 RJMP 0x00A4
00A2 9AC6 SBI 0x18,6
00A3 C001 RJMP 0x00A5
(0056) else Clr_DAT;
00A4 98C6 CBI 0x18,6
(0057) Clr_CLK;
00A5 98C4 CBI 0x18,4
(0058) data<<=1;
00A6 0F00 LSL R16
(0059) Set_CLK;
00A7 9AC4 SBI 0x18,4
00A8 954A DEC R20
00A9 2344 TST R20
00AA F7A9 BNE 0x00A0
00AB 940E02D7 CALL pop_gset1
00AD 9508 RET
_Send_CMD:
temp --> R20
com --> R22
00AE 940E02D2 CALL push_gset2
00B0 2F60 MOV R22,R16
(0060) }
(0061) }
(0062) //---------------------------------------------------------
(0063) void Send_CMD(char com)
(0064) {
(0065) char temp;
(0066)
(0067) Set_CS;
00B1 9AC5 SBI 0x18,5
(0068) temp=0xF8;
00B2 EF48 LDI R20,0xF8
(0069) data_trans(temp);
00B3 2F04 MOV R16,R20
00B4 DFE7 RCALL _data_trans
(0070) temp=com&0xF0;
00B5 2F46 MOV R20,R22
00B6 7F40 ANDI R20,0xF0
(0071) data_trans(temp);
00B7 2F04 MOV R16,R20
00B8 DFE3 RCALL _data_trans
(0072) temp=com&0x0F;temp<<=4;
00B9 2F46 MOV R20,R22
00BA 704F ANDI R20,0xF
00BB 2F84 MOV R24,R20
00BC 708F ANDI R24,0xF
00BD 9582 SWAP R24
00BE 2F48 MOV R20,R24
(0073) data_trans(temp);
00BF 2F08 MOV R16,R24
00C0 DFDB RCALL _data_trans
(0074) Clr_CS;
00C1 98C5 CBI 0x18,5
(0075) delayus(70);
00C2 E406 LDI R16,0x46
00C3 DFBD RCALL _delayus
00C4 940E02C0 CALL pop_gset2
00C6 9508 RET
_LCD_Set_DDRAM:
addr --> R20
00C7 940E02D4 CALL push_gset1
00C9 2F40 MOV R20,R16
(0076) }
(0077) //---------------------------------------
(0078) void LCD_Set_DDRAM(char addr)
(0079) {Send_CMD(addr);}
00CA 2F04 MOV R16,R20
00CB DFE2 RCALL _Send_CMD
00CC 940E02D7 CALL pop_gset1
00CE 9508 RET
(0080)
(0081) void LCD_HOME(void)
(0082) {Send_CMD(0x02);}
_LCD_HOME:
00CF E002 LDI R16,2
00D0 DFDD RCALL _Send_CMD
00D1 9508 RET
(0083)
(0084) void LCD_CLR(void)
(0085) {Send_CMD(0x01);delayms(2);}
_LCD_CLR:
00D2 E001 LDI R16,1
00D3 DFDA RCALL _Send_CMD
00D4 E002 LDI R16,2
00D5 E010 LDI R17,0
00D6 DFB0 RCALL _delayms
00D7 9508 RET
_Send_DATA:
temp --> R20
data --> R22
00D8 940E02D2 CALL push_gset2
00DA 2F60 MOV R22,R16
(0086) //----------------------------------------------------------
(0087) void Send_DATA(char data)
(0088) {
(0089) char temp;
(0090) Set_CS;
00DB 9AC5 SBI 0x18,5
(0091) temp=0xFA;
00DC EF4A LDI R20,0xFA
(0092) data_trans(temp);
00DD 2F04 MOV R16,R20
00DE DFBD RCALL _data_trans
(0093) temp=data&0xF0;
00DF 2F46 MOV R20,R22
00E0 7F40 ANDI R20,0xF0
(0094) data_trans(temp);
00E1 2F04 MOV R16,R20
00E2 DFB9 RCALL _data_trans
(0095) temp=data&0x0F;temp<<=4;
00E3 2F46 MOV R20,R22
00E4 704F ANDI R20,0xF
00E5 2F84 MOV R24,R20
00E6 708F ANDI R24,0xF
00E7 9582 SWAP R24
00E8 2F48 MOV R20,R24
(0096) data_trans(temp);
00E9 2F08 MOV R16,R24
00EA DFB1 RCALL _data_trans
(0097) Clr_CS;
00EB 98C5 CBI 0x18,5
(0098) delayus(40);
00EC E208 LDI R16,0x28
00ED DF93 RCALL _delayus
00EE 940E02C0 CALL pop_gset2
00F0 9508 RET
_LCD_set_xy:
address --> R20
y --> R10
x --> R22
00F1 940E02D0 CALL push_gset3
00F3 2EA2 MOV R10,R18
00F4 2F60 MOV R22,R16
(0099) }
(0100)
(0101) //--------------设置XY-----------------//
(0102)
(0103) void LCD_set_xy( unsigned char x, unsigned char y ) //写地址函数
(0104) {
(0105) unsigned char address;
(0106) if (y == 0) address = 0x80 + x;
00F5 20AA TST R10
00F6 F419 BNE 0x00FA
00F7 2F46 MOV R20,R22
00F8 5840 SUBI R20,0x80
00F9 C00E RJMP 0x0108
(0107) else if(y == 1) address = 0x90 + x;
00FA 2D8A MOV R24,R10
00FB 3081 CPI R24,1
00FC F419 BNE 0x0100
00FD 2F46 MOV R20,R22
00FE 5740 SUBI R20,0x70
00FF C008 RJMP 0x0108
(0108) else if(y == 2) address = 0x88 + x;
0100 2D8A MOV R24,R10
0101 3082 CPI R24,2
0102 F419 BNE 0x0106
0103 2F46 MOV R20,R22
0104 5748 SUBI R20,0x78
0105 C002 RJMP 0x0108
(0109) else address = 0x98 + x;
0106 2F46 MOV R20,R22
0107 5648 SUBI R20,0x68
(0110) Send_CMD(address);
0108 2F04 MOV R16,R20
0109 DFA4 RCALL _Send_CMD
010A 940E02C3 CALL pop_gset3
010C 9508 RET
(0111) }
(0112) //************************************************************
(0113) //----------------------------------------
(0114) //************************************************************
(0115) void LCM_init(void)
(0116) {
(0117) delayms(50);
_LCM_init:
010D E302 LDI R16,0x32
010E E010 LDI R17,0
010F DF77 RCALL _delayms
(0118) Send_CMD(0x20);//Function Set命令必须发送两次
0110 E200 LDI R16,0x20
0111 DF9C RCALL _Send_CMD
(0119) Send_CMD(0x20);
0112 E200 LDI R16,0x20
0113 DF9A RCALL _Send_CMD
(0120) Send_CMD(0x0C);//整体显示ON,游标OFF,
0114 E00C LDI R16,0xC
0115 DF98 RCALL _Send_CMD
(0121) LCD_CLR(); //CLR
0116 DFBB RCALL _LCD_CLR
(0122) Send_CMD(0x06);//AC++
0117 E006 LDI R16,6
0118 DF95 RCALL _Send_CMD
0119 9508 RET
_DisHZ:
i --> R20
HZS --> R22
x --> R10
LCD_COMMAND --> R20
011A 940E02D0 CALL push_gset3
011C 0159 MOVW R10,R18
011D 01A8 MOVW R20,R16
011E 816E LDD R22,Y+6
011F 817F LDD R23,Y+7
(0123) }
(0124) //************************************************************
(0125) //自定义全角字符,最多4个,保存在CGRAM中
(0126) char const font_wd[]= //℃
(0127) {0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x0A,0xF0,0x05,0x88,0x03,0x00,0x02,0x00,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -