📄 avrstudy.lst
字号:
__text_start:
__start:
016F E5CF LDI R28,0x5F
0170 E0D4 LDI R29,4
0171 BFCD OUT 0x3D,R28
0172 BFDE OUT 0x3E,R29
0173 51C0 SUBI R28,0x10
0174 40D0 SBCI R29,0
0175 EA0A LDI R16,0xAA
0176 8308 STD Y+0,R16
0177 2400 CLR R0
0178 ECE9 LDI R30,0xC9
0179 E0F2 LDI R31,2
017A E012 LDI R17,2
017B 3CE9 CPI R30,0xC9
017C 07F1 CPC R31,R17
017D F011 BEQ 0x0180
017E 9201 ST R0,Z+
017F CFFB RJMP 0x017B
0180 8300 STD Z+0,R16
0181 E7E5 LDI R30,0x75
0182 E0F0 LDI R31,0
0183 E6A0 LDI R26,0x60
0184 E0B0 LDI R27,0
0185 E012 LDI R17,2
0186 3DEE CPI R30,0xDE
0187 07F1 CPC R31,R17
0188 F021 BEQ 0x018D
0189 95C8 LPM
018A 9631 ADIW R30,1
018B 920D ST R0,X+
018C CFF9 RJMP 0x0186
018D D74F RCALL _main
_exit:
018E CFFF RJMP _exit
_SendByte:
i --> R20
Dbyte --> R16
018F D981 RCALL push_gset1
FILE: E:\AVR学习专区\AVR学习板\st7920iccavrmega8.c
(0001) /****************************************************************************************
(0002) LCM(DM12864M-带字库,ST7920控制芯片)mega8控制显示程序
(0003)
(0004) 程序功能:该程序是用AVR来控制对DM12864M
(0005) 读写信号等的操作.
(0006) 硬件连接:采用串行方式显示,分配PB6=SID,PB7=SCK,PB1=LCD_ON
(0007) 三个I/O口分别作为LCM数据,时钟信号,背光开关
(0008) 的控制。
(0009) CS和/RESET直接接VCC;PSB直接接GND
(0010) 作者:张国旗
(0011) 2008年12月29号
(0012) ****************************************************************************************/
(0013) #define LCDDDR DDRB
(0014) #define LCDDDR_IN LCDDDR&=~BIT(PB6);
(0015) #define LCDDDR_OUT LCDDDR|=BIT(PB1)|BIT(PB6)|BIT(PB7);
(0016) /*===============================================================*/
(0017) #define LCDCTL PORTB
(0018) #define SID_ON LCDCTL |= BIT(PB6) //数据
(0019) #define SID_OFF LCDCTL &= ~BIT(PB6)
(0020) #define SCK_ON LCDCTL |= BIT(PB7) //时钟
(0021) #define SCK_OFF LCDCTL &= ~BIT(PB7)
(0022) #define LCD_ON LCDCTL |= BIT(PB1) //开启背光
(0023) #define LCD_OFF LCDCTL &= ~BIT(PB1)
(0024) //#define uchar unsigned char
(0025) /***********************函数体部分*********************************/
(0026) unsigned char AC_TABLE[]={
(0027) 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,
(0028) 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,
(0029) 0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,
(0030) 0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f,
(0031) };
(0032) //=========发送一个字节程序=========
(0033) void SendByte(unsigned char Dbyte)
(0034) {
(0035) unsigned char i;
(0036) for(i=0;i<8;i++)
0190 2744 CLR R20
0191 C009 RJMP 0x019B
(0037) {
(0038) if(Dbyte&0x80)SID_ON;
0192 FF07 SBRS R16,7
0193 C002 RJMP 0x0196
0194 9AC6 SBI 0x18,6
0195 C001 RJMP 0x0197
(0039) else SID_OFF;
0196 98C6 CBI 0x18,6
(0040) SCK_ON;
0197 9AC7 SBI 0x18,7
(0041) SCK_OFF;
0198 98C7 CBI 0x18,7
(0042) Dbyte=Dbyte<<1;
0199 0F00 LSL R16
019A 9543 INC R20
019B 3048 CPI R20,0x8
019C F3A8 BCS 0x0192
019D D976 RCALL pop_gset1
019E 9508 RET
_ReceiveByte:
temp2 --> R16
temp1 --> R18
i --> R20
019F D971 RCALL push_gset1
(0043) }
(0044) }
(0045) //接收一个字节程序((0xf0&temp1)+(0x0f&temp2))
(0046) unsigned char ReceiveByte(void)
(0047) {
(0048) unsigned char i,temp1,temp2;
(0049) temp1=temp2=0;
01A0 2700 CLR R16
01A1 2722 CLR R18
(0050) for(i=0;i<8;i++)
01A2 2744 CLR R20
01A3 C00B RJMP 0x01AF
(0051) {
(0052) LCDDDR_IN;
01A4 98BE CBI 0x17,6
(0053) temp1=temp1<<1;
01A5 0F22 LSL R18
(0054) if ((PINB&0x40)!=0)temp1++; //与端口设置有关,主要修改端口时修改此位
01A6 9BB6 SBIS 0x16,6
01A7 C001 RJMP 0x01A9
01A8 9523 INC R18
(0055) LCDDDR_OUT;
01A9 B387 IN R24,0x17
01AA 6C82 ORI R24,0xC2
01AB BB87 OUT 0x17,R24
(0056) SCK_ON;
01AC 9AC7 SBI 0x18,7
(0057) SCK_OFF;
01AD 98C7 CBI 0x18,7
01AE 9543 INC R20
01AF 3048 CPI R20,0x8
01B0 F398 BCS 0x01A4
(0058) }
(0059) for(i=0;i<8;i++)
01B1 2744 CLR R20
01B2 C00B RJMP 0x01BE
(0060) {
(0061) LCDDDR_IN;
01B3 98BE CBI 0x17,6
(0062) temp2=temp2<<1;
01B4 0F00 LSL R16
(0063) if ((PINB&0x40)!=0)temp2++; //与端口设置有关,主要修改端口时修改此位
01B5 9BB6 SBIS 0x16,6
01B6 C001 RJMP 0x01B8
01B7 9503 INC R16
(0064) LCDDDR_OUT;
01B8 B387 IN R24,0x17
01B9 6C82 ORI R24,0xC2
01BA BB87 OUT 0x17,R24
(0065) SCK_ON;
01BB 9AC7 SBI 0x18,7
(0066) SCK_OFF;
01BC 98C7 CBI 0x18,7
01BD 9543 INC R20
01BE 3048 CPI R20,0x8
01BF F398 BCS 0x01B3
(0067) }
(0068) return ((0xf0&temp1)+(0x0f&temp2));
01C0 2F80 MOV R24,R16
01C1 708F ANDI R24,0xF
01C2 2F02 MOV R16,R18
01C3 7F00 ANDI R16,0xF0
01C4 0F08 ADD R16,R24
01C5 D94E RCALL pop_gset1
01C6 9508 RET
(0069) }
(0070) //液晶忙检查CheckBusy
(0071) void CheckBusy( void )
(0072) {
(0073) do SendByte(0xfc); //11111,RW(1),RS(0),0
_CheckBusy:
01C7 EF0C LDI R16,0xFC
01C8 DFC6 RCALL _SendByte
(0074) while(0x80&ReceiveByte());
01C9 DFD5 RCALL _ReceiveByte
01CA FD07 SBRC R16,7
01CB CFFB RJMP _CheckBusy
01CC 9508 RET
_WriteCommand:
Cbyte --> R20
01CD D943 RCALL push_gset1
01CE 2F40 MOV R20,R16
(0075) }
(0076) //========写命令========
(0077) void WriteCommand( unsigned char Cbyte )
(0078) {
(0079) CheckBusy();
01CF DFF7 RCALL _CheckBusy
(0080) SendByte(0xf8); //11111,RW(0),RS(0),0
01D0 EF08 LDI R16,0xF8
01D1 DFBD RCALL _SendByte
(0081) SendByte(0xf0&Cbyte);
01D2 2F04 MOV R16,R20
01D3 7F00 ANDI R16,0xF0
01D4 DFBA RCALL _SendByte
(0082) SendByte(0xf0&Cbyte<<4);
01D5 2F04 MOV R16,R20
01D6 700F ANDI R16,0xF
01D7 9502 SWAP R16
01D8 7F00 ANDI R16,0xF0
01D9 DFB5 RCALL _SendByte
01DA D939 RCALL pop_gset1
01DB 9508 RET
_WriteData:
Dbyte --> R20
01DC D934 RCALL push_gset1
01DD 2F40 MOV R20,R16
(0083) }
(0084) //========写数据========
(0085) void WriteData( unsigned char Dbyte )
(0086) {
(0087) CheckBusy();
01DE DFE8 RCALL _CheckBusy
(0088) SendByte(0xfa); //11111,RW(0),RS(1),0
01DF EF0A LDI R16,0xFA
01E0 DFAE RCALL _SendByte
(0089) SendByte(0xf0&Dbyte);
01E1 2F04 MOV R16,R20
01E2 7F00 ANDI R16,0xF0
01E3 DFAB RCALL _SendByte
(0090) SendByte(0xf0&Dbyte<<4);
01E4 2F04 MOV R16,R20
01E5 700F ANDI R16,0xF
01E6 9502 SWAP R16
01E7 7F00 ANDI R16,0xF0
01E8 DFA6 RCALL _SendByte
01E9 D92A RCALL pop_gset1
01EA 9508 RET
(0091) }
(0092) //========读数据========
(0093) unsigned char ReadData( void )
(0094) {
(0095) CheckBusy();
_ReadData:
01EB DFDB RCALL _CheckBusy
(0096) SendByte(0xfe); //11111,RW(1),RS(1),0
01EC EF0E LDI R16,0xFE
01ED DFA1 RCALL _SendByte
(0097) return ReceiveByte();
01EE DFB0 RCALL _ReceiveByte
01EF 9508 RET
_Delay:
usn --> R20
us --> R22
MS --> R16
01F0 D91E RCALL push_gset2
(0098) }
(0099) //===延时程序 ,12M/ms==
(0100) void Delay(unsigned int MS)
(0101) {
01F1 C00C RJMP 0x01FE
(0102) unsigned char us,usn;
(0103) while(MS!=0) //for 12M
(0104) {
(0105) usn = 2;
01F2 E042 LDI R20,2
01F3 C006 RJMP 0x01FA
(0106) while(usn!=0)
(0107) {
(0108) us=0xf5;
01F4 EF65 LDI R22,0xF5
01F5 C001 RJMP 0x01F7
(0109) while (us!=0){us--;};
01F6 956A DEC R22
01F7 2366 TST R22
01F8 F7E9 BNE 0x01F6
(0110) usn--;
01F9 954A DEC R20
01FA 2344 TST R20
01FB F7C1 BNE 0x01F4
(0111) }
(0112) MS--;
01FC 5001 SUBI R16,1
01FD 4010 SBCI R17,0
01FE 3000 CPI R16,0
01FF 0701 CPC R16,R17
0200 F789 BNE 0x01F2
0201 D8FF RCALL pop_gset2
0202 9508 RET
(0113) }
(0114) }
(0115) //=====液晶初始化======
(0116) void LcmInit( void )
(0117) {
(0118) WriteCommand(0x30); //基本指令,选择8位CPU控制方式,关图显
_LcmInit:
0203 E300 LDI R16,0x30
0204 DFC8 RCALL _WriteCommand
(0119) WriteCommand(0x03); //复位地址计数器
0205 E003 LDI R16,3
0206 DFC6 RCALL _WriteCommand
(0120) WriteCommand(0x0C); //开整体显示
0207 E00C LDI R16,0xC
0208 DFC4 RCALL _WriteCommand
(0121) WriteCommand(0x01); //清除屏显的数据
0209 E001 LDI R16,1
020A DFC2 RCALL _WriteCommand
(0122) WriteCommand(0x06); //设置地址计数器递增
020B E006 LDI R16,6
020C DFC0 RCALL _WriteCommand
020D 9508 RET
(0123) }
(0124) //=======清文字========
(0125) void LcmClearTXT( void )
(0126) {
(0127) LcmInit();
_LcmClearTXT:
020E DFF4 RCALL _LcmInit
020F 9508 RET
_LcmClearBMP:
i --> R20
j --> R22
0210 D8FE RCALL push_gset2
(0128) }
(0129) //=======清图片========
(0130) void LcmClearBMP( void )
(0131) {
(0132) unsigned char i,j;
(0133) WriteCommand(0x34); //关图显
0211 E304 LDI R16,0x34
0212 DFBA RCALL _WriteCommand
(0134) for(i=0;i<32;i++)
0213 2744 CLR R20
0214 C00D RJMP 0x0222
(0135) {
(0136) WriteCommand(0x80|i); //写入列地址
0215 2F04 MOV R16,R20
0216 6800 ORI R16,0x80
0217 DFB5 RCALL _WriteCommand
(0137) WriteCommand(0x80); //写入行地址
0218 E800 LDI R16,0x80
0219 DFB3 RCALL _WriteCommand
(0138) for(j=0;j<32;j++)
021A 2766 CLR R22
021B C003 RJMP 0x021F
(0139) WriteData(0);
021C 2700 CLR R16
021D DFBE RCALL _WriteData
021E 9563 INC R22
021F 3260 CPI R22,0x20
0220 F3D8 BCS 0x021C
0221 9543 INC R20
0222 3240 CPI R20,0x20
0223 F388 BCS 0x0215
0224 D8DC RCALL pop_gset2
0225 9508 RET
_PutStr:
puts --> R20
col --> R22
row --> R10
0226 D8E6 RCALL push_gset3
0227 2F62 MOV R22,R18
0228 2EA0 MOV R10,R16
0229 814E LDD R20,Y+6
022A 815F LDD R21,Y+7
(0140) }
(0141) //WriteCommand(0x36);//开图显
(0142) }
(0143) //==写入一段文字,写完一屏,清屏,从头在写新的一屏=======
(0144) void PutStr(unsigned char row,unsigned char col,unsigned char *puts)
(0145) {
(0146) WriteCommand(0x30); //基本指令,选择8位CPU控制方式,关图显
022B E300 LDI R16,0x30
022C DFA0 RCALL _WriteCommand
(0147) WriteCommand(AC_TABLE[8*row+col]);
022D E088 LDI R24,0x8
022E 9D8A MUL R24,R10
022F 01F0 MOVW R30,R0
0230 2E26 MOV R2,R22
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -