📄 testadc.lst
字号:
__text_start:
__start:
29 E5CF LDI R28,0x5F
2A E0D4 LDI R29,4
2B BFCD OUT 0x3D,R28
2C BFDE OUT 0x3E,R29
2D 52C0 SUBI R28,0x20
2E 40D0 SBCI R29,0
2F EA0A LDI R16,0xAA
30 8308 STD Y+0,R16
31 2400 CLR R0
32 E6EB LDI R30,0x6B
33 E0F0 LDI R31,0
34 E010 LDI R17,0
35 37E1 CPI R30,0x71
36 07F1 CPC R31,R17
37 F011 BEQ 0x003A
38 9201 ST R0,Z+
39 CFFB RJMP 0x0035
3A 8300 STD Z+0,R16
3B E4E6 LDI R30,0x46
3C E0F0 LDI R31,0
3D E6A0 LDI R26,0x60
3E E0B0 LDI R27,0
3F E010 LDI R17,0
40 E000 LDI R16,0
41 BF0B OUT 0x3B,R16
42 35E1 CPI R30,0x51
43 07F1 CPC R31,R17
44 F021 BEQ 0x0049
45 95C8 LPM
46 9631 ADIW R30,1
47 920D ST R0,X+
48 CFF9 RJMP 0x0042
49 D1A3 RCALL _main
_exit:
4A CFFF RJMP _exit
FILE: D:\学习\AVRpro\Mega8程序\TestADC\LCDDrive.C
(0001) //*********************************************
(0002) //MCU:ATMEL AVR MEGA8 ,晶振频率:8MHz,频率越高,播放Mp3越流畅
(0003) //LCD:128*64
(0004) //LCD型号:FYD12864-0402B
(0005) //制作人:平顶山工学院计算机系,郭猛
(0006) //*********************************************
(0007) # include "iom8v.h"
(0008) # include "macros.h"
(0009) #include <math.h>
(0010) #include "FontModel.h"
(0011) #include "LCDFun.h"
(0012)
(0013) //LCD驱动用到的变量:
(0014) uchar LCD_COM; //LCD控制命令字
(0015) uchar LCD_DAT; //LCD数据
(0016) //绘图方式下的坐标:
(0017) uchar AC_X; //X坐标
(0018) uchar AC_Y; //Y坐标
(0019)
(0020) //延时1ms
(0021) void Delay_1ms(void)
(0022) {
(0023) unsigned int j;
(0024) for(j=1;j<(unsigned int)(XTAL*143-2);j++) NOP();
_Delay_1ms:
j --> R16
4B E001 LDI R16,1
4C E010 LDI R17,0
4D C003 RJMP 0x0051
4E 0000 NOP
4F 5F0F SUBI R16,0xFF
50 4F1F SBCI R17,0xFF
51 E786 LDI R24,0x76
52 E094 LDI R25,4
53 1708 CP R16,R24
54 0719 CPC R17,R25
55 F3C0 BCS 0x004E
56 9508 RET
_Delay:
i --> R10
j --> R20
n --> R12
57 D22F RCALL push_xgset303C
58 0168 MOVW R12,R16
(0025) }
(0026) /*******************************************延时子程序**********************************************/
(0027) ///////////////////n的取值最好不要超过500!!!
(0028) void Delay(unsigned int n)
(0029) {
(0030) uchar i,j;
(0031) for(i=0;i<(uchar)(n/100);i++)
59 24AA CLR R10
5A C007 RJMP 0x0062
(0032) for(j=0;j<100;j++) Delay_1ms(); //100mS
5B 2744 CLR R20
5C C002 RJMP 0x005F
5D DFED RCALL _Delay_1ms
5E 9543 INC R20
5F 3644 CPI R20,0x64
60 F3E0 BCS 0x005D
61 94A3 INC R10
62 E624 LDI R18,0x64
63 E030 LDI R19,0
64 0186 MOVW R16,R12
65 D1C9 RCALL div16u
66 16A0 CP R10,R16
67 F398 BCS 0x005B
68 C225 RJMP pop_xgset303C
(0033) }
(0034)
(0035) //*************************************LCD背光控制***************************************
(0036) void LCD_AK_Control(uchar OnOff) //On0FF=1,背光显示开;
(0037) {
(0038) if(OnOff) CLRPORT(LCD_AK); else SETPORT(LCD_AK);
_LCD_AK_Control:
OnOff --> R16
69 2300 TST R16
6A F011 BEQ 0x006D
6B 9893 CBI 0x12,3
6C C001 RJMP 0x006E
6D 9A93 SBI 0x12,3
6E 9508 RET
_SendToSID:
bitcode --> R20
i --> R10
dat --> R18
bitNum --> R16
6F 92AA ST R10,-Y
70 934A ST R20,-Y
(0039) }
(0040)
(0041) void SendToSID(unsigned char bitNum, unsigned char dat)//向串行数据线发送指定位数一个数据
(0042) {
(0043) unsigned char i,bitcode;
(0044) for(i=0;i<bitNum;i++)
71 24AA CLR R10
72 C00B RJMP 0x007E
(0045) {
(0046) bitcode=dat & 0x80;
73 2F42 MOV R20,R18
74 7840 ANDI R20,0x80
(0047) if(bitcode!=0) SETPORT(SID); else CLRPORT(SID); //SID = dat & 0x80;
75 F011 BEQ 0x0078
76 9A96 SBI 0x12,6
77 C001 RJMP 0x0079
78 9896 CBI 0x12,6
(0048) dat = dat << 1;
79 0F22 LSL R18
(0049) CLRPORT(SCLK); //SCLK = 0;
7A 9897 CBI 0x12,7
(0050) SETPORT(SCLK); //SCLK = 1;
7B 9A97 SBI 0x12,7
(0051) CLRPORT(SCLK); //SCLK = 0;
7C 9897 CBI 0x12,7
7D 94A3 INC R10
7E 16A0 CP R10,R16
7F F398 BCS 0x0073
80 9149 LD R20,Y+
81 90A9 LD R10,Y+
82 9508 RET
_Write_LCD_Com:
SynCode --> R20
83 934A ST R20,-Y
(0052) }
(0053) }
(0054)
(0055) //*************************************写入LCD控制字******************************
(0056) void Write_LCD_Com(void) //对LCD写入控制命令
(0057) {
(0058) // SynCode为同步码
(0059) unsigned char SynCode;
(0060) CLRPORT(CS); //CS=0;
84 9895 CBI 0x12,5
(0061) SETPORT(CS); //CS=1;
85 9A95 SBI 0x12,5
(0062)
(0063) SynCode = 0xFF; //同步码
86 EF4F LDI R20,0xFF
(0064) SendToSID(5,SynCode);
87 2F24 MOV R18,R20
88 E005 LDI R16,5
89 DFE5 RCALL _SendToSID
(0065)
(0066) SynCode = 0x00; //写入代码RW,RS,0,3位代码
8A 2744 CLR R20
(0067) SendToSID(3,SynCode);
8B 2F24 MOV R18,R20
8C E003 LDI R16,3
8D DFE1 RCALL _SendToSID
(0068)
(0069) SynCode = LCD_COM & 0xF0; //写入代码COM数据的高四位 要发送的数据格式是XXXX0000
8E 9140 006E LDS R20,LCD_COM
90 7F40 ANDI R20,0xF0
(0070) SendToSID(8,SynCode);
91 2F24 MOV R18,R20
92 E008 LDI R16,0x8
93 DFDB RCALL _SendToSID
(0071)
(0072) SynCode = LCD_COM & 0x0F; //写入代码COM数据的低四位 0000XXXX
94 9140 006E LDS R20,LCD_COM
96 704F ANDI R20,0xF
(0073) SynCode = SynCode<<4; //要发送的数据格式是XXXX0000
97 2F84 MOV R24,R20
98 708F ANDI R24,0xF
99 9582 SWAP R24
9A 2F48 MOV R20,R24
(0074) SendToSID(8,SynCode);
9B 2F28 MOV R18,R24
9C E008 LDI R16,0x8
9D DFD1 RCALL _SendToSID
(0075) Delay_1ms() ; //必要的延时
9E DFAC RCALL _Delay_1ms
9F 9149 LD R20,Y+
A0 9508 RET
_Write_LCD_Data:
bitcode --> R10
iSynCode --> R22
SynCode --> R20
A1 D1D7 RCALL push_xgsetF00C
(0076) }
(0077)
(0078) //*************************************写入LCD数据**********************************
(0079) void Write_LCD_Data(void) //对LCD写入8位数据
(0080) {
(0081) // iSynCode为同步码计数器,同步码为5位, SynCode为同步码
(0082) unsigned char iSynCode,SynCode;
(0083) uchar bitcode;
(0084) CLRPORT(CS); //CS=0;
A2 9895 CBI 0x12,5
(0085) SETPORT(CS); //CS=1;
A3 9A95 SBI 0x12,5
(0086)
(0087) SynCode = 0xFF; //同步码
A4 EF4F LDI R20,0xFF
(0088) SendToSID(5,SynCode);
A5 2F24 MOV R18,R20
A6 E005 LDI R16,5
A7 DFC7 RCALL _SendToSID
(0089) SynCode = 0x40; //写入代码RW,RS,0,3位代码
A8 E440 LDI R20,0x40
(0090) SendToSID(3,SynCode);
A9 2F24 MOV R18,R20
AA E003 LDI R16,3
AB DFC3 RCALL _SendToSID
(0091)
(0092) SynCode = LCD_DAT & 0xF0; //写入代码COM数据的高四位 要发送的数据格式是XXXX0000
AC 9140 006D LDS R20,LCD_DAT
AE 7F40 ANDI R20,0xF0
(0093) for(iSynCode=0;iSynCode<8;iSynCode++)
AF 2766 CLR R22
B0 C00D RJMP 0x00BE
(0094) {
(0095) bitcode = SynCode & 0x80;
B1 2F84 MOV R24,R20
B2 7880 ANDI R24,0x80
B3 2EA8 MOV R10,R24
(0096) if(bitcode!=0) SETPORT(SID); else CLRPORT(SID);//SID = bitcode;
B4 2388 TST R24
B5 F011 BEQ 0x00B8
B6 9A96 SBI 0x12,6
B7 C001 RJMP 0x00B9
B8 9896 CBI 0x12,6
(0097) SynCode = SynCode << 1;
B9 0F44 LSL R20
(0098) CLRPORT(SCLK); //SCLK = 0;
BA 9897 CBI 0x12,7
(0099) SETPORT(SCLK); //SCLK = 1;
BB 9A97 SBI 0x12,7
(0100) CLRPORT(SCLK); //SCLK = 0;
BC 9897 CBI 0x12,7
BD 9563 INC R22
BE 3068 CPI R22,0x8
BF F388 BCS 0x00B1
(0101)
(0102) }
(0103) SynCode = LCD_DAT & 0x0F; //写入代码COM数据的低四位 0000XXXX
C0 9140 006D LDS R20,LCD_DAT
C2 704F ANDI R20,0xF
(0104) SynCode = SynCode<<4; //要发送的数据格式是XXXX0000
C3 2F84 MOV R24,R20
C4 708F ANDI R24,0xF
C5 9582 SWAP R24
C6 2F48 MOV R20,R24
(0105) for(iSynCode=0;iSynCode<8;iSynCode++)
C7 2766 CLR R22
C8 C00D RJMP 0x00D6
(0106) {
(0107) bitcode = SynCode & 0x80;
C9 2F84 MOV R24,R20
CA 7880 ANDI R24,0x80
CB 2EA8 MOV R10,R24
(0108) if(bitcode!=0) SETPORT(SID); else CLRPORT(SID);//SID = bitcode;
CC 2388 TST R24
CD F011 BEQ 0x00D0
CE 9A96 SBI 0x12,6
CF C001 RJMP 0x00D1
D0 9896 CBI 0x12,6
(0109) SynCode = SynCode << 1;
D1 0F44 LSL R20
(0110) CLRPORT(SCLK); //SCLK = 0;
D2 9897 CBI 0x12,7
(0111) SETPORT(SCLK); //SCLK = 1;
D3 9A97 SBI 0x12,7
(0112) CLRPORT(SCLK); //SCLK = 0;
D4 9897 CBI 0x12,7
D5 9563 INC R22
D6 3068 CPI R22,0x8
D7 F388 BCS 0x00C9
(0113) }
(0114) Delay_1ms();
D8 DF72 RCALL _Delay_1ms
D9 C1A6 RJMP pop_xgsetF00C
(0115) }
(0116)
(0117) //*************************************LCD屏幕初始化**************************************
(0118) //LCD接口:
(0119) //CS <==>PD5;
(0120) //SID <==>PD6;
(0121) //SCLK <==>PD7;
(0122) //LCD_AK<==>PD3; //背光控制,=0时打开背光
(0123) void LCD_Ini(void) //初始化,并进入文本模式
(0124) {
(0125) //LCD端口初始化,将PD7~PD5端口设置为输出方式
(0126) DDRD|=0xE0;
_LCD_Ini:
DA B381 IN R24,0x11
DB 6E80 ORI R24,0xE0
DC BB81 OUT 0x11,R24
(0127) _NOP();
DD 0000 NOP
(0128)
(0129) LCD_COM =0x30;//功能设置为8BIT控制界面,基本指令集
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -