⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 avrstudy.lst

📁 AVR学习开发 板
💻 LST
📖 第 1 页 / 共 5 页
字号:
__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 + -