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

📄 adc_port.lst

📁 AVR单片机做的数字电压表
💻 LST
📖 第 1 页 / 共 4 页
字号:
__start:
__text_start:
    027B E5CF      LDI	R28,0x5F
    027C E0D4      LDI	R29,4
    027D BFCD      OUT	0x3D,R28
    027E BFDE      OUT	0x3E,R29
    027F 51C0      SUBI	R28,0x10
    0280 40D0      SBCI	R29,0
    0281 EA0A      LDI	R16,0xAA
    0282 8308      STD	Y+0,R16
    0283 2400      CLR	R0
    0284 ECE3      LDI	R30,0xC3
    0285 E0F0      LDI	R31,0
    0286 E010      LDI	R17,0
    0287 3CED      CPI	R30,0xCD
    0288 07F1      CPC	R31,R17
    0289 F011      BEQ	0x028C
    028A 9201      ST	R0,Z+
    028B CFFB      RJMP	0x0287
    028C 8300      STD	Z+0,R16
    028D E9E2      LDI	R30,0x92
    028E E0F4      LDI	R31,4
    028F E6A0      LDI	R26,0x60
    0290 E0B0      LDI	R27,0
    0291 E014      LDI	R17,4
    0292 3FE5      CPI	R30,0xF5
    0293 07F1      CPC	R31,R17
    0294 F021      BEQ	0x0299
    0295 95C8      LPM
    0296 9631      ADIW	R30,1
    0297 920D      ST	R0,X+
    0298 CFF9      RJMP	0x0292
    0299 940E0503  CALL	_main
_exit:
    029B CFFF      RJMP	_exit
_DelayKey:
  i                    --> R20
  ms                   --> R16
    029C 940E05E6  CALL	push_gset1
FILE: E:\单片机\本人实验\重新实验\adc_vcc\lcd.h
(0001) 
(0002) /************************************************************
(0003)   串行连接操作程序
(0004)    对外函数列表:
(0005)      void LCD_Init( void ); //初始化
(0006)      void LCD_PutStr(unsigned char row,unsigned char col,unsigned char *puts); //写入文本
(0007)      void LCD_PutBMP(unsigned char *puts); //写入半屏图片
(0008) 	 void Disp_Img(unsigned const char *img)  //写整屏图片
(0009)      void LCD_ClearTXT( void ); //清除文本
(0010)      void LCD_ClearBMP( void ); //清除图片
(0011) ***********************************************************/
(0012) #define uchar unsigned char
(0013) #define uint  unsigned int
(0014) #define LCDNOP() NOP();NOP()
(0015) 
(0016) //以下配置IO管脚
(0017) //========================================================*/
(0018) #define OUTLCDSCLK() DDRD |= (1<<6) //设置输出
(0019) #define SETLCDSCLK() PORTD |= (1<<6) //拉高
(0020) #define CLRLCDSCLK() PORTD &=~(1<<6) //拉低
(0021) #define SEL_CS()  DDRD |=BIT(3);PORTD |=BIT(3) //片选拉高
(0022) #define CLR_CS()  DDRD |=BIT(3);PORTD &= ~BIT(3) //片选拉低
(0023) #define OUTLCDSID() DDRD |= (1<<4) //设置输出
(0024) #define INLCDSID() DDRD &= ~(1 << 4); PORTD |= (1 << 4) //设置输入
(0025) #define SETLCDSID() PORTD |= (1 << 4) //拉高
(0026) #define CLRLCDSID() PORTD &= ~(1 << 4) //拉低
(0027) #define GETLCDSID() ((PIND & BIT(4)) >> 4) //读IO值
(0028) 
(0029) const unsigned char AC_TABLE[]={
(0030) 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,        //第一行汉字位置
(0031) 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,        //第二行汉字位置
(0032) 0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,        //第三行汉字位置
(0033) 0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f,        //第四行汉字位置
(0034) };
(0035) unsigned char  str20[]="欢迎光临sonsan!!";
(0036) unsigned char  str10[]="黄河远上白云间,一片孤城万仞山。羌笛何须怨杨柳,春风不度玉门关。";
(0037) 
(0038) 
(0039) //维捷登测试架专用延时函数
(0040) void DelayKey(uint ms)
(0041) {                            
    029E C009      RJMP	0x02A8
(0042)     uint i; 
(0043)     while(ms--)    
(0044)    { 
(0045)      for(i=1;i<(uint)(1*143-2);i++) //1为1MHZ
    029F E041      LDI	R20,1
    02A0 E050      LDI	R21,0
    02A1 C002      RJMP	0x02A4
    02A2 5F4F      SUBI	R20,0xFF
    02A3 4F5F      SBCI	R21,0xFF
    02A4 384D      CPI	R20,0x8D
    02A5 E0E0      LDI	R30,0
    02A6 075E      CPC	R21,R30
    02A7 F3D0      BCS	0x02A2
    02A8 0118      MOVW	R2,R16
    02A9 5001      SUBI	R16,1
    02AA 4010      SBCI	R17,0
    02AB 2022      TST	R2
    02AC F791      BNE	0x029F
    02AD 2033      TST	R3
    02AE F781      BNE	0x029F
    02AF 940E05E9  CALL	pop_gset1
    02B1 9508      RET
_LCD_WriteByte:
  i                    --> R20
  Dbyte                --> R16
    02B2 940E05E6  CALL	push_gset1
(0046)          ; 
(0047)    } 
(0048)  }
(0049) 
(0050) //串口发送一个字节
(0051) void LCD_WriteByte(unsigned char Dbyte)
(0052) {
(0053)     unsigned char i;
(0054)     OUTLCDSCLK();
    02B4 9A8E      SBI	0x11,6
(0055)     OUTLCDSID();
    02B5 9A8C      SBI	0x11,4
(0056) 
(0057)         for(i=0;i<8;i++)
    02B6 2744      CLR	R20
    02B7 C00D      RJMP	0x02C5
(0058)         {
(0059)         CLRLCDSCLK();
    02B8 9896      CBI	0x12,6
(0060) 
(0061)                 Dbyte=Dbyte<<1;        //左移一位
    02B9 0F00      LSL	R16
(0062)         if (SREG & 1)
    02BA B62F      IN	R2,0x3F
    02BB FE20      SBRS	R2,0
    02BC C002      RJMP	0x02BF
(0063)             SETLCDSID();
    02BD 9A94      SBI	0x12,4
    02BE C001      RJMP	0x02C0
(0064)         else
(0065)             CLRLCDSID();
    02BF 9894      CBI	0x12,4
(0066) 
(0067)         SETLCDSCLK();
    02C0 9A96      SBI	0x12,6
(0068)                 LCDNOP();
    02C1 0000      NOP
    02C2 0000      NOP
(0069)         CLRLCDSCLK();
    02C3 9896      CBI	0x12,6
    02C4 9543      INC	R20
    02C5 3048      CPI	R20,0x8
    02C6 F388      BCS	0x02B8
(0070)         }
(0071)     return;
    02C7 940E05E9  CALL	pop_gset1
    02C9 9508      RET
_LCD_ReadByte:
  temp2                --> R16
  temp1                --> R18
  i                    --> R20
    02CA 940E05E6  CALL	push_gset1
(0072) }
(0073) 
(0074) //串口接收一个字节
(0075) //仅在读取数据的时候用到
(0076) //而读出的数据是一次只能读出4bit的
(0077) unsigned char LCD_ReadByte(void)
(0078) {
(0079)         unsigned char i,temp1,temp2;
(0080)         temp1=temp2=0;
    02CC 2700      CLR	R16
    02CD 2722      CLR	R18
(0081)     OUTLCDSCLK();
    02CE 9A8E      SBI	0x11,6
(0082)     INLCDSID();
    02CF 988C      CBI	0x11,4
    02D0 9A94      SBI	0x12,4
(0083) 
(0084)         for(i=0;i<8;i++)
    02D1 2744      CLR	R20
    02D2 C00F      RJMP	0x02E2
(0085)         {
(0086)                 temp1=temp1<<1;
    02D3 0F22      LSL	R18
(0087) 
(0088)         CLRLCDSCLK();
    02D4 9896      CBI	0x12,6
(0089)         LCDNOP();
    02D5 0000      NOP
    02D6 0000      NOP
(0090)                 SETLCDSCLK();
    02D7 9A96      SBI	0x12,6
(0091)         LCDNOP();
    02D8 0000      NOP
    02D9 0000      NOP
(0092)                 CLRLCDSCLK();
    02DA 9896      CBI	0x12,6
(0093) 
(0094)                 if(GETLCDSID()) temp1++;
    02DB B380      IN	R24,0x10
    02DC 7180      ANDI	R24,0x10
    02DD 9582      SWAP	R24
    02DE 708F      ANDI	R24,0xF
    02DF F009      BEQ	0x02E1
    02E0 9523      INC	R18
    02E1 9543      INC	R20
    02E2 3048      CPI	R20,0x8
    02E3 F378      BCS	0x02D3
(0095)         }
(0096)         for(i=0;i<8;i++)
    02E4 2744      CLR	R20
    02E5 C00F      RJMP	0x02F5
(0097)         {
(0098)                 temp2=temp2<<1;
    02E6 0F00      LSL	R16
(0099) 
(0100)                 CLRLCDSCLK();
    02E7 9896      CBI	0x12,6
(0101)         LCDNOP();
    02E8 0000      NOP
    02E9 0000      NOP
(0102)                 SETLCDSCLK();
    02EA 9A96      SBI	0x12,6
(0103)         LCDNOP();
    02EB 0000      NOP
    02EC 0000      NOP
(0104)                 CLRLCDSCLK();
    02ED 9896      CBI	0x12,6
(0105) 
(0106)                 if(GETLCDSID()) temp2++;
    02EE B380      IN	R24,0x10
    02EF 7180      ANDI	R24,0x10
    02F0 9582      SWAP	R24
    02F1 708F      ANDI	R24,0xF
    02F2 F009      BEQ	0x02F4
    02F3 9503      INC	R16
    02F4 9543      INC	R20
    02F5 3048      CPI	R20,0x8
    02F6 F378      BCS	0x02E6
(0107)         }
(0108)         return ((0xf0&temp1)+(0x0f&temp2));
    02F7 2F80      MOV	R24,R16
    02F8 708F      ANDI	R24,0xF
    02F9 2F02      MOV	R16,R18
    02FA 7F00      ANDI	R16,0xF0
    02FB 0F08      ADD	R16,R24
    02FC 940E05E9  CALL	pop_gset1
    02FE 9508      RET
(0109) }
(0110) 
(0111) void LCD_CheckBusy( void )
(0112) {
(0113)         LCDNOP();
_LCD_CheckBusy:
    02FF 0000      NOP
    0300 0000      NOP
(0114)     return;
    0301 C005      RJMP	0x0307
(0115) 
(0116)     do   LCD_WriteByte(0xfc);        //11111,RW(1),RS(0),0
    0302 EF0C      LDI	R16,0xFC
    0303 DFAE      RCALL	_LCD_WriteByte
(0117)         while(0x80&LCD_ReadByte());        //BF(.7)=1 Busy
    0304 DFC5      RCALL	_LCD_ReadByte
    0305 FD07      SBRC	R16,7
    0306 CFFB      RJMP	0x0302
    0307 9508      RET
_LCD_WriteCmd:
  Cbyte                --> R20
    0308 940E05E6  CALL	push_gset1
    030A 2F40      MOV	R20,R16
(0118) }
(0119) 
(0120) void LCD_WriteCmd( unsigned char Cbyte )
(0121) {
(0122)         SEL_CS();
    030B 9A8B      SBI	0x11,3
    030C 9A93      SBI	0x12,3
(0123)         LCD_CheckBusy();
    030D DFF1      RCALL	_LCD_CheckBusy
(0124)         LCD_WriteByte(0xf8);                 //11111,RW(0),RS(0),0
    030E EF08      LDI	R16,0xF8
    030F DFA2      RCALL	_LCD_WriteByte
(0125)         LCD_WriteByte(0xf0&Cbyte);        //高四位
    0310 2F04      MOV	R16,R20
    0311 7F00      ANDI	R16,0xF0
    0312 DF9F      RCALL	_LCD_WriteByte
(0126) 		DelayKey(5);
    0313 E005      LDI	R16,5
    0314 E010      LDI	R17,0
    0315 DF86      RCALL	_DelayKey
(0127)         LCD_WriteByte(0xf0&Cbyte<<4);//低四位(先执行<<)
    0316 2F04      MOV	R16,R20
    0317 700F      ANDI	R16,0xF
    0318 9502      SWAP	R16
    0319 7F00      ANDI	R16,0xF0
    031A DF97      RCALL	_LCD_WriteByte
(0128) 		DelayKey(5);
    031B E005      LDI	R16,5
    031C E010      LDI	R17,0
    031D DF7E      RCALL	_DelayKey
(0129)         CLR_CS();
    031E 9A8B      SBI	0x11,3
    031F 9893      CBI	0x12,3
    0320 940E05E9  CALL	pop_gset1
    0322 9508      RET
_LCD_WriteData:
  Dbyte                --> R20
    0323 940E05E6  CALL	push_gset1
    0325 2F40      MOV	R20,R16
(0130) }
(0131) 
(0132) void LCD_WriteData( unsigned char Dbyte )
(0133) {
(0134)         SEL_CS();
    0326 9A8B      SBI	0x11,3
    0327 9A93      SBI	0x12,3
(0135)         LCD_CheckBusy();
    0328 DFD6      RCALL	_LCD_CheckBusy
(0136)         LCD_WriteByte(0xfa);                 //11111,RW(0),RS(1),0
    0329 EF0A      LDI	R16,0xFA
    032A DF87      RCALL	_LCD_WriteByte
(0137)         LCD_WriteByte(0xf0&Dbyte);        //高四位
    032B 2F04      MOV	R16,R20
    032C 7F00      ANDI	R16,0xF0
    032D DF84      RCALL	_LCD_WriteByte
(0138) 		DelayKey(5);
    032E E005      LDI	R16,5
    032F E010      LDI	R17,0
    0330 DF6B      RCALL	_DelayKey
(0139)         LCD_WriteByte(0xf0&Dbyte<<4);//低四位(先执行<<)
    0331 2F04      MOV	R16,R20
    0332 700F      ANDI	R16,0xF
    0333 9502      SWAP	R16
    0334 7F00      ANDI	R16,0xF0
    0335 DF7C      RCALL	_LCD_WriteByte
(0140) 		DelayKey(5);
    0336 E005      LDI	R16,5
    0337 E010      LDI	R17,0
    0338 DF63      RCALL	_DelayKey
(0141)          CLR_CS();
    0339 9A8B      SBI	0x11,3
    033A 9893      CBI	0x12,3
    033B 940E05E9  CALL	pop_gset1
    033D 9508      RET
(0142) }
(0143) 
(0144) unsigned char LCD_ReadData( void )
(0145) {
(0146)         LCD_CheckBusy();
_LCD_ReadData:
    033E DFC0      RCALL	_LCD_CheckBusy
(0147)         LCD_WriteByte(0xfe);                 //11111,RW(1),RS(1),0
    033F EF0E      LDI	R16,0xFE
    0340 DF71      RCALL	_LCD_WriteByte
(0148)         return LCD_ReadByte();
    0341 DF88      RCALL	_LCD_ReadByte
    0342 9508      RET
(0149) }
(0150) 
(0151) void LCD_Init( void )
(0152) {     
(0153)         DelayKey(2);
_LCD_Init:
    0343 E002      LDI	R16,2
    0344 E010      LDI	R17,0
    0345 DF56      RCALL	_DelayKey
(0154)         LCD_WriteCmd(0x30);        //8BitMCU,基本指令集合
    0346 E300      LDI	R16,0x30
    0347 DFC0      RCALL	_LCD_WriteCmd
(0155) 		DelayKey(2);
    0348 E002      LDI	R16,2
    0349 E010      LDI	R17,0
    034A DF51      RCALL	_DelayKey
(0156) 		LCD_WriteCmd(0x30);        //8BitMCU
    034B E300      LDI	R16,0x30
    034C DFBB      RCALL	_LCD_WriteCmd
(0157) 		DelayKey(5);
    034D E005      LDI	R16,5
    034E E010      LDI	R17,0
    034F DF4C      RCALL	_DelayKey
(0158) 		LCD_WriteCmd(0x0C);        //显示ON,游标OFF,游标位反白OFF
    0350 E00C      LDI	R16,0xC
    0351 DFB6      RCALL	_LCD_WriteCmd
(0159) 		DelayKey(5);
    0352 E005      LDI	R16,5
    0353 E010      LDI	R17,0
    0354 DF47      RCALL	_DelayKey
(0160)         LCD_WriteCmd(0x01);        //清屏,AC归0
    0355 E001      LDI	R16,1
    0356 DFB1      RCALL	_LCD_WriteCmd
(0161) 		DelayKey(5);
    0357 E005      LDI	R16,5
    0358 E010      LDI	R17,0
    0359 DF42      RCALL	_DelayKey
(0162)         LCD_WriteCmd(0x02);        // AC归0,不改变DDRAM内容
    035A E002      LDI	R16,2
    035B DFAC      RCALL	_LCD_WriteCmd
(0163) 		DelayKey(5);
    035C E005      LDI	R16,5
    035D E010      LDI	R17,0
    035E DF3D      RCALL	_DelayKey
(0164)          LCD_WriteCmd(0x06);        //写入时,游标右移动 
    035F E006      LDI	R16,6
    0360 DFA7      RCALL	_LCD_WriteCmd
(0165) 		 DelayKey(2);
    0361 E002      LDI	R16,2
    0362 E010      LDI	R17,0
    0363 DF38      RCALL	_DelayKey
    0364 9508      RET
_LCD_ClearTXT:
  i                    --> R20
    0365 940E05E6  CALL	push_gset1
(0166)         //LCD_WriteCmd(0x80);
(0167) }
(0168) 
(0169) //文本区清RAM函数
(0170) void LCD_ClearTXT( void )
(0171) {
(0172)         unsigned char i;
(0173)         LCD_WriteCmd(0x30);        //8BitMCU,基本指令集合
    0367 E300      LDI	R16,0x30
    0368 DF9F      RCALL	_LCD_WriteCmd
(0174) 		DelayKey(5);
    0369 E005      LDI	R16,5
    036A E010      LDI	R17,0
    036B DF30      RCALL	_DelayKey
(0175)         LCD_WriteCmd(0x80);        //AC归起始位
    036C E800      LDI	R16,0x80
    036D DF9A      RCALL	_LCD_WriteCmd
(0176) 		DelayKey(5);
    036E E005      LDI	R16,5
    036F E010      LDI	R17,0
    0370 DF2B      RCALL	_DelayKey
(0177)         for(i=0;i<64;i++)
    0371 2744      CLR	R20
    0372 C003      RJMP	0x0376
(0178)         LCD_WriteData(0x20);
    0373 E200      LDI	R16,0x20
    0374 DFAE      RCALL	_LCD_WriteData
    0375 9543      INC	R20
    0376 3440      CPI	R20,0x40
    0377 F3D8      BCS	0x0373
    0378 940E05E9  CALL	pop_gset1
    037A 9508      RET
_LCD_ClearBMP:
  i                    --> R20
  j                    --> R22
    037B 940E05E4  CALL	push_gset2
(0179) }
(0180) 
(0181) //图形区和文本区显示在两个不同的RAM区
(0182) //图形区清RAM函数
(0183) void LCD_ClearBMP( void )
(0184) {
(0185)         unsigned char i,j;
(0186)         LCD_WriteCmd(0x34);        //8Bit扩充指令集,即使是36H也要写两次
    037D E304      LDI	R16,0x34
    037E DF89      RCALL	_LCD_WriteCmd
(0187)         LCD_WriteCmd(0x36);        //绘图ON,基本指令集里面36H不能开绘图
    037F E306      LDI	R16,0x36
    0380 DF87      RCALL	_LCD_WriteCmd
(0188)         for(i=0;i<32;i++)                 //12864实际为256x32
    0381 2744      CLR	R20
    0382 C00D      RJMP	0x0390

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -