📄 adc_port.lst
字号:
__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 + -