📄 pro.lst
字号:
012D E328 LDI R18,0x38
012E 2700 CLR R16
012F DF99 RCALL _LCD12864_sendbyte
(0152) while(LCD12864_readBF());
0130 DFC2 RCALL _LCD12864_readBF
0131 2300 TST R16
0132 F7E9 BNE 0x0130
(0153) LCD12864_sendbyte(iCmd, LCDb_ON); //打开显示
0133 E02C LDI R18,0xC
0134 2700 CLR R16
0135 DF93 RCALL _LCD12864_sendbyte
(0154) while(LCD12864_readBF());
0136 DFBC RCALL _LCD12864_readBF
0137 2300 TST R16
0138 F7E9 BNE 0x0136
(0155) LCD12864_clear(); //清屏
0139 DFB2 RCALL _LCD12864_clear
(0156) while(LCD12864_readBF());
013A DFB8 RCALL _LCD12864_readBF
013B 2300 TST R16
013C F7E9 BNE 0x013A
(0157) LCD12864_sendbyte(iCmd, LCDb_ENTRY); // 输入模式设定
013D E026 LDI R18,6
013E 2700 CLR R16
013F DF89 RCALL _LCD12864_sendbyte
0140 9508 RET
_LCD12864_opGDRAM:
i --> R20
x --> R22
j --> R10
ptGDRAM --> R12
0141 940E0648 CALL push_gset4
0143 0168 MOVW R12,R16
(0158) }
(0159) /*******************************************
(0160) 函数名称: LCD12864_opGDRAM
(0161) 功 能: 向GDRAM写入数据,并显示(完成绘图功能)
(0162) 参 数: ptGDRAM--GDRAM数据指针
(0163) 返回值 : 无
(0164) /********************************************/
(0165) void LCD12864_opGDRAM(const uchar *ptGDRAM)
(0166) {
(0167) uchar i,j;
(0168) uint x=0;
0144 2766 CLR R22
0145 2777 CLR R23
(0169) while(LCD12864_readBF()); //读忙标志
0146 DFAC RCALL _LCD12864_readBF
0147 2300 TST R16
0148 F7E9 BNE 0x0146
(0170) LCD12864_sendbyte(iCmd,LCDb_EXTCMD1); //扩充指令集,并关闭绘图显示
0149 E324 LDI R18,0x34
014A 2700 CLR R16
014B DF7D RCALL _LCD12864_sendbyte
(0171) //写入并显示上半屏幕
(0172) for(i=0;i<32;i++) //行地址计数
014C 2744 CLR R20
014D C02D RJMP 0x017B
(0173) {
(0174) for(j=0;j<8;j++) //列地址计数
014E 24AA CLR R10
014F C027 RJMP 0x0177
(0175) {
(0176) LCD12864_sendbyte(iCmd,0x80|i);//输入行地址
0150 2F24 MOV R18,R20
0151 6820 ORI R18,0x80
0152 2700 CLR R16
0153 DF75 RCALL _LCD12864_sendbyte
(0177) Delayus(10);
0154 E00A LDI R16,0xA
0155 E010 LDI R17,0
0156 DF24 RCALL _Delayus
(0178) LCD12864_sendbyte(iCmd,0x80|j);//输入列地址
0157 2D2A MOV R18,R10
0158 6820 ORI R18,0x80
0159 2700 CLR R16
015A DF6E RCALL _LCD12864_sendbyte
(0179) Delayus(10);
015B E00A LDI R16,0xA
015C E010 LDI R17,0
015D DF1D RCALL _Delayus
(0180) LCD12864_sendbyte(iDat,ptGDRAM[x++]); //输入高位字节数据
015E 011B MOVW R2,R22
015F 5F6F SUBI R22,0xFF
0160 4F7F SBCI R23,0xFF
0161 01F1 MOVW R30,R2
0162 0DEC ADD R30,R12
0163 1DFD ADC R31,R13
0164 9124 LPM R18,0(Z)
0165 E001 LDI R16,1
0166 DF62 RCALL _LCD12864_sendbyte
(0181) Delayus(10);
0167 E00A LDI R16,0xA
0168 E010 LDI R17,0
0169 DF11 RCALL _Delayus
(0182) LCD12864_sendbyte(iDat,ptGDRAM[x++]); //输入低位字节数据
016A 011B MOVW R2,R22
016B 5F6F SUBI R22,0xFF
016C 4F7F SBCI R23,0xFF
016D 01F1 MOVW R30,R2
016E 0DEC ADD R30,R12
016F 1DFD ADC R31,R13
0170 9124 LPM R18,0(Z)
0171 E001 LDI R16,1
0172 DF56 RCALL _LCD12864_sendbyte
(0183) Delayus(10);
0173 E00A LDI R16,0xA
0174 E010 LDI R17,0
0175 DF05 RCALL _Delayus
0176 94A3 INC R10
0177 2D8A MOV R24,R10
0178 3088 CPI R24,0x8
0179 F2B0 BCS 0x0150
017A 9543 INC R20
017B 3240 CPI R20,0x20
017C F408 BCC 0x017E
017D CFD0 RJMP 0x014E
(0184) }
(0185) }
(0186) //写入并显示下半屏幕
(0187) for(i=0;i<32;i++)
017E 2744 CLR R20
017F C02E RJMP 0x01AE
(0188) {
(0189) for(j=8;j<16;j++)
0180 E088 LDI R24,0x8
0181 2EA8 MOV R10,R24
0182 C027 RJMP 0x01AA
(0190) {
(0191) LCD12864_sendbyte(iCmd,0x80|i);//输入行地址
0183 2F24 MOV R18,R20
0184 6820 ORI R18,0x80
0185 2700 CLR R16
0186 DF42 RCALL _LCD12864_sendbyte
(0192) Delayus(10);
0187 E00A LDI R16,0xA
0188 E010 LDI R17,0
0189 DEF1 RCALL _Delayus
(0193) LCD12864_sendbyte(iCmd,0x80|j);//输入列地址
018A 2D2A MOV R18,R10
018B 6820 ORI R18,0x80
018C 2700 CLR R16
018D DF3B RCALL _LCD12864_sendbyte
(0194) Delayus(10);
018E E00A LDI R16,0xA
018F E010 LDI R17,0
0190 DEEA RCALL _Delayus
(0195) LCD12864_sendbyte(iDat,ptGDRAM[x++]); //输入高位字节数据
0191 011B MOVW R2,R22
0192 5F6F SUBI R22,0xFF
0193 4F7F SBCI R23,0xFF
0194 01F1 MOVW R30,R2
0195 0DEC ADD R30,R12
0196 1DFD ADC R31,R13
0197 9124 LPM R18,0(Z)
0198 E001 LDI R16,1
0199 DF2F RCALL _LCD12864_sendbyte
(0196) Delayus(10);
019A E00A LDI R16,0xA
019B E010 LDI R17,0
019C DEDE RCALL _Delayus
(0197) LCD12864_sendbyte(iDat,ptGDRAM[x++]); //输入低位字节数据
019D 011B MOVW R2,R22
019E 5F6F SUBI R22,0xFF
019F 4F7F SBCI R23,0xFF
01A0 01F1 MOVW R30,R2
01A1 0DEC ADD R30,R12
01A2 1DFD ADC R31,R13
01A3 9124 LPM R18,0(Z)
01A4 E001 LDI R16,1
01A5 DF23 RCALL _LCD12864_sendbyte
(0198) Delayus(10);
01A6 E00A LDI R16,0xA
01A7 E010 LDI R17,0
01A8 DED2 RCALL _Delayus
01A9 94A3 INC R10
01AA 2D8A MOV R24,R10
01AB 3180 CPI R24,0x10
01AC F2B0 BCS 0x0183
01AD 9543 INC R20
01AE 3240 CPI R20,0x20
01AF F408 BCC 0x01B1
01B0 CFCF RJMP 0x0180
(0199) }
(0200) }
(0201) Delayus(10);
01B1 E00A LDI R16,0xA
01B2 E010 LDI R17,0
01B3 DEC7 RCALL _Delayus
(0202) LCD12864_sendbyte(iCmd,LCDb_EXTCMD2); //打开绘图显示
01B4 E326 LDI R18,0x36
01B5 2700 CLR R16
01B6 DF12 RCALL _LCD12864_sendbyte
(0203) LCD12864_sendbyte(iCmd,LCDb_BASCMD); //还原回基本指令集模式
01B7 E320 LDI R18,0x30
01B8 2700 CLR R16
01B9 DF0F RCALL _LCD12864_sendbyte
01BA 940E0643 CALL pop_gset4
01BC 9508 RET
FILE: E:\张秋伟\我的实验\数字频率计\pro.c
(0001) //包含所需头文件
(0002) #include <ioM16v.h>
(0003) #include <macros.h>
(0004) #include "12864.h"
(0005) #include "delay.h"
(0006) /*------宏定义------*/
(0007) #define uchar unsigned char
(0008) #define uint unsigned int
(0009)
(0010) uchar Second=0,Minute=0,Hour=0;
(0011) uchar Second_H,Second_L,Minute_H,Minute_L,Hour_H,Hour_L;
(0012) uchar time_buffer[8]={0,0,0,0,0,0,0,0};
(0013) unsigned char Timer1_Counter_H=0;
(0014) unsigned char Timer1_Counter_L=0;
(0015) unsigned long value=0;
(0016) long Freq=0,Freq_H16=0,Freq_L8=0,counter=0;
(0017) uchar T1_OV_Times=0; //T1溢出次数
(0018) uchar temp[8];
(0019)
(0020) void time(void)
(0021) {
(0022) Second++;
_time:
01BD 91800060 LDS R24,Second
01BF 5F8F SUBI R24,0xFF
01C0 93800060 STS Second,R24
(0023) if(Second >= 60)
01C2 338C CPI R24,0x3C
01C3 F098 BCS 0x01D7
(0024) {
(0025) Second=0;
01C4 2422 CLR R2
01C5 92200060 STS Second,R2
(0026) Minute++;
01C7 91800061 LDS R24,Minute
01C9 5F8F SUBI R24,0xFF
01CA 93800061 STS Minute,R24
(0027) if(Minute >=60)
01CC 338C CPI R24,0x3C
01CD F048 BCS 0x01D7
(0028) {
(0029) Hour++;
01CE 91800062 LDS R24,Hour
01D0 5F8F SUBI R24,0xFF
01D1 93800062 STS Hour,R24
(0030) if(Hour >=24)
01D3 3188 CPI R24,0x18
01D4 F010 BCS 0x01D7
(0031) Hour=0;
01D5 92200062 STS Hour,R2
(0032) }
(0033) }
01D7 9508 RET
(0034) }
(0035)
(0036) void display_time(void)
(0037) {
(0038) time_buffer[0]=Hour/10+0x30;
_display_time:
01D8 E01A LDI R17,0xA
01D9 91000062 LDS R16,Hour
01DB 940E05EA CALL div8u
01DD 2F80 MOV R24,R16
01DE 5D80 SUBI R24,0xD0
01DF 93800063 STS time_buffer,R24
(0039) time_buffer[1]=Hour%10+0x30;
01E1 E01A LDI R17,0xA
01E2 91000062 LDS R16,Hour
01E4 940E05E8 CALL mod8u
01E6 2F80 MOV R24,R16
01E7 5D80 SUBI R24,0xD0
01E8 93800064 STS time_buffer+1,R24
(0040) time_buffer[2]=':';
01EA E38A LDI R24,0x3A
01EB 93800065 STS time_buffer+2,R24
(0041) time_buffer[3]=Minute/10+0x30;
01ED E01A LDI R17,0xA
01EE 91000061 LDS R16,Minute
01F0 940E05EA CALL div8u
01F2 2F80 MOV R24,R16
01F3 5D80 SUBI R24,0xD0
01F4 93800066 STS time_buffer+3,R24
(0042) time_buffer[4]=Minute%10+0x30;
01F6 E01A LDI R17,0xA
01F7 91000061 LDS R16,Minute
01F9 940E05E8 CALL mod8u
01FB 2F80 MOV R24,R16
01FC 5D80 SUBI R24,0xD0
01FD 93800067 STS 0x67,R24
(0043) time_buffer[5]=':';
01FF E38A LDI R24,0x3A
0200 93800068 STS 0x68,R24
(0044) time_buffer[6]=Second/10+0x30;
0202 E01A LDI R17,0xA
0203 91000060 LDS R16,Second
0205 940E05EA CALL div8u
0207 2F80 MOV R24,R16
0208 5D80 SUBI R24,0xD0
0209 93800069 STS 0x69,R24
(0045) time_buffer[7]=Second%10+0X30;
020B E01A LDI R17,0xA
020C 91000060 LDS R16,Second
020E 940E05E8 CALL mod8u
0210 2F80 MOV R24,R16
0211 5D80 SUBI R24,0xD0
0212 9380006A STS 0x6A,R24
(0046)
(0047) LCD12864_gotoXY(2,2);
0214 E022 LDI R18,2
0215 E002 LDI R16,2
0216 940E0101 CALL _LCD12864_gotoXY
(0048) LCD12864_sendstr(time_buffer);
0218 E603 LDI R16,0x63
0219 E010 LDI R17,0
021A 940E00DC CALL _LCD12864_sendstr
021C 9508 RET
(0049) /*LCD12864_sendbyte(1,Hour_H);
(0050) LCD12864_sendbyte(1,Hour_L);
(0051) LCD12864_sendbyte(1,':');
(0052)
(0053) LCD12864_sendbyte(1,Minute_H);
(0054) LCD12864_sendbyte(1,Minute_L);
(0055) LCD12864_sendbyte(1,':');
(0056)
(0057) LCD12864_sendbyte(1,Second_H);
(0058) LCD12864_sendbyte(1,Second_L);*/
(0059) }
(0060) //端口初始化
(0061) void port_init(void)
(0062) {
(0063) PORTA = 0xFF;
_port_init:
021D EF8F LDI R24,0xFF
021E BB8B OUT 0x1B,R24
(0064) DDRA = 0xFF;
021F BB8A OUT 0x1A,R24
(0065) PORTB = 0xf3;
0220 EF83 LDI R24,0xF3
0221 BB88 OUT 0x18,R24
(0066) DDRB = 0xf1;
0222 EF81 LDI R24,0xF1
0223 BB87 OUT 0x17,R24
(0067) PORTC = 0x00;
0224 2422 CLR R2
0225 BA25 OUT 0x15,R2
(0068) DDRC = 0x00;
0226 BA24 OUT 0x14,R2
(0069) PORTD = 0x00;
0227 BA22 OUT 0x12,R2
(0070) DDRD = 0x00;
0228 BA21 OUT 0x11,R2
0229 9508 RET
(0071) }
(0072)
(0073) //定时器T0初始化
(0074) void timer0_init(void)
(0075) {
(0076) TCCR0 = 0x00;//停止定时器
_timer0_init:
022A 2422 CLR R2
022B BE23 OUT 0x33,R2
(0077) TCNT0 = 0x83;//初始值
022C E883 LDI R24,0x83
022D BF82 OUT 0x32,R24
(0078) OCR0 = 0x82;//匹配值
022E E882 LDI R24,0x82
022F BF8C OUT 0x3C,R24
(0079) TIMSK |= 0x02;//中断允许
0230 B789 IN R24,0x39
0231 6082 ORI R24,2
0232 BF89 OUT 0x39,R24
(0080) TCCR0 = 0x04;//启动定时器
0233 E084 LDI R24,4
0234 BF83 OUT 0x33,R24
0235 9508 RET
_timer0_comp_isr:
0236 922A ST R2,-Y
0237 938A ST R24,-Y
0238 939A ST R25,-Y
0239 B62F IN R2,0x3F
023A 922A ST R2,-Y
(0081) }
(0082)
(0083) uchar display_is_ok=0;
(0084) uchar count=0;
(0085) //T0比较中断服务程序
(0086) #pragma interrupt_handler timer0_comp_isr:20
(0087) void timer0_comp_isr(void)
(0088) {
(0089) //中断发生时刻在TCNT0=OCR0]
(0090) if(++count >=5)
023B 91800083 LDS R24,count
023D 5F8F SUBI R24,0xFF
023E 2E28 MOV R2,R24
023F 92200083 STS count,R2
0241 3085 CPI R24,5
0242 F030 BCS 0x0249
(0091) {
(0092) display_is_ok=1;
0243 E081 LDI R24,1
0244 93800082 STS display_is_ok,R24
(0093) count=0;
0246 2422 CLR R2
0247 92200083 STS count,R2
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -