📄 yj12864.lst
字号:
__start:
__text_start:
0306 E5CF LDI R28,0x5F
0307 E0D4 LDI R29,4
0308 BFCD OUT 0x3D,R28
0309 BFDE OUT 0x3E,R29
030A 51C0 SUBI R28,0x10
030B 40D0 SBCI R29,0
030C EA0A LDI R16,0xAA
030D 8308 STD Y+0,R16
030E 2400 CLR R0
030F EEE6 LDI R30,0xE6
0310 E0F1 LDI R31,1
0311 E011 LDI R17,1
0312 3EE6 CPI R30,0xE6
0313 07F1 CPC R31,R17
0314 F011 BEQ 0x0317
0315 9201 ST R0,Z+
0316 CFFB RJMP 0x0312
0317 8300 STD Z+0,R16
0318 E8E5 LDI R30,0x85
0319 E0F4 LDI R31,4
031A E6A0 LDI R26,0x60
031B E0B0 LDI R27,0
031C E016 LDI R17,6
031D 30EB CPI R30,0xB
031E 07F1 CPC R31,R17
031F F021 BEQ 0x0324
0320 95C8 LPM
0321 9631 ADIW R30,1
0322 920D ST R0,X+
0323 CFF9 RJMP 0x031D
0324 940E0A59 CALL _main
_exit:
0326 CFFF RJMP _exit
_Delayus:
i --> R20
US --> R22
0327 940E0A7E CALL push_gset2
0329 01B8 MOVW R22,R16
FILE: C:\DOCUME~1\Administrator\桌面\12864液晶菜单显示时钟不过不能调2\AVR_PQ1A.h
(0001) /*******************************************
(0002) 文件:AVR_PQ1A.H
(0003) 功能:定义一些AVR_PQ1A开发板上应用程序用到的常量
(0004) /******************************************/
(0005)
(0006) #include <iom16v.h> //包含型号头文件
(0007) #include <macros.h> //包含"位"操作头文件
(0008)
(0009) /******************数据类型宏定义******************/
(0010) #define uchar unsigned char
(0011) #define uint unsigned int
(0012)
(0013) /******************数码管和LED常量******************/
(0014) #define LEDLK PA2 //LED锁存器控制端
(0015) #define SEGLK PA3 //数码管段选锁存器控制端
(0016) #define BITLK PA4 //数码管位选锁存器控制端
(0017)
(0018) #define TRUE 1
(0019) #define FALSE 0
(0020) #define ALLLED 0XFF
(0021) /*******************************************
(0022) 函数名称: Delayus
(0023) 功 能: 延时指定微秒(8M晶振)
(0024) 参 数: US--延时的微秒数(大约,不是很精确,MS越大越准确)
(0025) 返回值 : 无
(0026) /********************************************/
(0027) void Delayus(uint US)
(0028) {
(0029) uint i;
(0030) US=US*5/4; //5/4是在8MHz晶振下,通过软件仿真反复实验得到的数值
032A E005 LDI R16,5
032B E010 LDI R17,0
032C 019B MOVW R18,R22
032D 940E0A5F CALL empy16s
032F 01B8 MOVW R22,R16
0330 9576 LSR R23
0331 9567 ROR R22
0332 9576 LSR R23
0333 9567 ROR R22
(0031) for( i=0;i<US;i++);
0334 2744 CLR R20
0335 2755 CLR R21
0336 C002 RJMP 0x0339
0337 5F4F SUBI R20,0xFF
0338 4F5F SBCI R21,0xFF
0339 1746 CP R20,R22
033A 0757 CPC R21,R23
033B F3D8 BCS 0x0337
033C 940E0A6F CALL pop_gset2
033E 9508 RET
_Delayms:
i --> R20
j --> R22
MS --> R16
033F 940E0A7E CALL push_gset2
(0032) }
(0033) /*******************************************
(0034) 函数名称: Delayms
(0035) 功 能: 延时指定毫秒(8M晶振)
(0036) 参 数: MS--延时的毫秒数
(0037) 返回值 : 无
(0038) /********************************************/
(0039) void Delayms(uint MS)
(0040) {
(0041) uint i,j;
(0042) for( i=0;i<MS;i++)
0341 2744 CLR R20
0342 2755 CLR R21
0343 C00B RJMP 0x034F
(0043) for(j=0;j<1141;j++); //1141是在8MHz晶振下,通过软件仿真反复实验得到的数值
0344 2766 CLR R22
0345 2777 CLR R23
0346 C002 RJMP 0x0349
0347 5F6F SUBI R22,0xFF
0348 4F7F SBCI R23,0xFF
0349 3765 CPI R22,0x75
034A E0E4 LDI R30,4
034B 077E CPC R23,R30
034C F3D0 BCS 0x0347
034D 5F4F SUBI R20,0xFF
034E 4F5F SBCI R21,0xFF
034F 1740 CP R20,R16
0350 0751 CPC R21,R17
0351 F390 BCS 0x0344
0352 940E0A6F CALL pop_gset2
0354 9508 RET
(0044) }
(0045) /*******************************************
(0046) 函数名称: Board_init
(0047) 功 能: 初始化实验板,关闭全部功能
(0048) 参 数: 无
(0049) 返回值 : 无
(0050) /********************************************/
(0051) void Board_init(void)
(0052) {
(0053) DDRA=0xFF; //将四个IO口全部配置为输出
_Board_init:
0355 EF8F LDI R24,0xFF
0356 BB8A OUT 0x1A,R24
(0054) DDRB=0xFF;
0357 BB87 OUT 0x17,R24
(0055) DDRC=0xFF;
0358 BB84 OUT 0x14,R24
(0056) DDRD=0xFF;
0359 BB81 OUT 0x11,R24
(0057)
(0058) SPCR=0x00; //还原SPI口,使其为正常端口
035A 2422 CLR R2
035B B82D OUT 0x0D,R2
(0059)
(0060) PORTA|=BIT(PA6);//(BEEP)关闭蜂鸣器
035C 9ADE SBI 0x1B,6
(0061) PORTC&=~BIT(PC6); //(RELAY)初始化继电器为常闭连接状态
035D 98AE CBI 0x15,6
(0062) PORTA&=~BIT(PA1); //关闭SPI总线DA
035E 98D9 CBI 0x1B,1
(0063) PORTB=0xFF; //关闭LED
035F BB88 OUT 0x18,R24
(0064) PORTA|=BIT(LEDLK); //锁存数据,使LED熄灭
0360 9ADA SBI 0x1B,2
(0065) Delayus(5);
0361 E005 LDI R16,5
0362 E010 LDI R17,0
0363 DFC3 RCALL _Delayus
(0066) PORTA&=~BIT(LEDLK);
0364 98DA CBI 0x1B,2
(0067)
(0068) PORTB=0x00; //输出段选
0365 2422 CLR R2
0366 BA28 OUT 0x18,R2
(0069) PORTA|=BIT(SEGLK);
0367 9ADB SBI 0x1B,3
(0070) Delayus(50);
0368 E302 LDI R16,0x32
0369 E010 LDI R17,0
036A DFBC RCALL _Delayus
(0071) PORTA&=~BIT(SEGLK);
036B 98DB CBI 0x1B,3
(0072)
(0073) PORTB=0xFF; //输出位选
036C EF8F LDI R24,0xFF
036D BB88 OUT 0x18,R24
(0074) PORTA|=BIT(BITLK);
036E 9ADC SBI 0x1B,4
(0075) Delayus(50);
036F E302 LDI R16,0x32
0370 E010 LDI R17,0
0371 DFB5 RCALL _Delayus
(0076) PORTA&=~BIT(BITLK);
0372 98DC CBI 0x1B,4
(0077)
(0078) PORTD=0xFF;
0373 EF8F LDI R24,0xFF
0374 BB82 OUT 0x12,R24
(0079) PORTA|=BIT(PA7);
0375 9ADF SBI 0x1B,7
(0080) Delayus(50);
0376 E302 LDI R16,0x32
0377 E010 LDI R17,0
0378 DFAE RCALL _Delayus
(0081) PORTA&=~BIT(PA7);
0379 98DF CBI 0x1B,7
037A 9508 RET
FILE: C:\DOCUME~1\Administrator\桌面\12864液晶菜单显示时钟不过不能调2\MKEY.C
(0001) /*******************************************
(0002) 文件:MKEY.C
(0003) 环境:编译为ICC AVR6.25A,仿真为AVR Studio4.10
(0004) 硬件:ATMEGA16芯片
(0005) 日期:2006年12月10日
(0006) 功能:驱动开发板上的矩阵键盘,按不同的键,则数码管显示键码0~F
(0007) 备注:参考《AVR系列单片机C语言编程与应用实例》(清华大学出版社)
(0008) /******************************************/
(0009) #include <iom16v.h> //包含型号头文件
(0010) #include <macros.h> //包含"位"操作头文件
(0011) #include <stdio.h> //标准输入输出头文件
(0012)
(0013) /*******************************************
(0014) 函数名称: Key_press
(0015) 功 能: 检测是否有键按下
(0016) 参 数: 无
(0017) 返回值 : pressed--有键按下时为TRUE,否则为FALSE
(0018) /********************************************/
(0019) uchar Mkey_press(void)
(0020) {
(0021) uchar pressed;
(0022) KEY_DDR=OUT; //定义数据端口为输出
_Mkey_press:
pressed --> R16
037B EF8F LDI R24,0xFF
037C BB81 OUT 0x11,R24
(0023) KEY_PORTO=0xF0; //输出数据(输出检测码)
037D EF80 LDI R24,0xF0
037E BB82 OUT 0x12,R24
(0024) KEY_DDR=IN; //定义数据端口为输入
037F BB81 OUT 0x11,R24
(0025) if((KEY_PORTI)!=0xF0) //检测是否有键按下
0380 B380 IN R24,0x10
0381 3F80 CPI R24,0xF0
0382 F011 BEQ 0x0385
(0026) pressed=TRUE; //有键按下则返回TRUE
0383 E001 LDI R16,1
0384 C001 RJMP 0x0386
(0027) else
(0028) pressed=FALSE; //无键按下则返回FALSE
0385 2700 CLR R16
(0029) KEY_DDR=OUT; //数据端口还原为输出
0386 EF8F LDI R24,0xFF
0387 BB81 OUT 0x11,R24
(0030) return pressed;
0388 9508 RET
_Mkey_scan:
keycode --> R20
i --> R10
0389 940E0A7C CALL push_gset3
(0031) }
(0032) /*******************************************
(0033) 函数名称: Key_scan
(0034) 功 能: 扫描所按的键并返回键值
(0035) 参 数: 无
(0036) 返回值 : keycode--被按下键值
(0037) /********************************************/
(0038) uchar Mkey_scan(void)
(0039) {
(0040) uchar i=0x7F,keycode=0xFF; //i为扫描码,
038B E78F LDI R24,0x7F
038C 2EA8 MOV R10,R24
038D EF4F LDI R20,0xFF
(0041) Delayms(15); //延时消抖
038E E00F LDI R16,0xF
038F E010 LDI R17,0
0390 DFAE RCALL _Delayms
(0042) if(Mkey_press()==TRUE) //如果有键按下
0391 DFE9 RCALL _Mkey_press
0392 3001 CPI R16,1
0393 F009 BEQ 0x0395
0394 C092 RJMP 0x0427
(0043) {
(0044) do
(0045) {
(0046) i=(i<<1|i>>7); //进行行扫描
0395 2C2A MOV R2,R10
0396 9426 LSR R2
0397 9426 LSR R2
0398 9426 LSR R2
0399 9426 LSR R2
039A 9426 LSR R2
039B 9426 LSR R2
039C 9426 LSR R2
039D 2C3A MOV R3,R10
039E 0C33 LSL R3
039F 2832 OR R3,R2
03A0 2CA3 MOV R10,R3
(0047) KEY_DDR=0x0F; //定义数据端口低四位为输出,高四位为输入
03A1 E08F LDI R24,0xF
03A2 BB81 OUT 0x11,R24
(0048) KEY_PORTO=i; //输出扫描码
03A3 BA32 OUT 0x12,R3
(0049) Delayms(1); //防止读入出错,加入延时
03A4 E001 LDI R16,1
03A5 E010 LDI R17,0
03A6 DF98 RCALL _Delayms
(0050) keycode=KEY_PORTI; //读入原始键码
03A7 B340 IN R20,0x10
(0051) }while((keycode&0xF0)==0xF0); //是否检测到被按下按键(扫描到就跳出循环,否则继续扫描)
03A8 2F84 MOV R24,R20
03A9 7F80 ANDI R24,0xF0
03AA 3F80 CPI R24,0xF0
03AB F349 BEQ 0x0395
(0052) do
(0053) {
(0054) }while(Mkey_press()==TRUE); //等待按键释放(为了防止按一次,执行多次的现象)
03AC DFCE RCALL _Mkey_press
03AD 3001 CPI R16,1
03AE F3E9 BEQ 0x03AC
(0055) Delayms(15); //延时消抖
03AF E00F LDI R16,0xF
03B0 E010 LDI R17,0
03B1 DF8D RCALL _Delayms
(0056) switch(keycode) //将原始键码翻译成0~F
03B2 2F64 MOV R22,R20
03B3 2777 CLR R23
03B4 3B67 CPI R22,0xB7
03B5 E0E0 LDI R30,0
03B6 077E CPC R23,R30
03B7 F409 BNE 0x03B9
03B8 C06B RJMP 0x0424
03B9 3B6B CPI R22,0xBB
03BA E0E0 LDI R30,0
03BB 077E CPC R23,R30
03BC F409 BNE 0x03BE
03BD C05E RJMP 0x041C
03BE 3B6D CPI R22,0xBD
03BF E0E0 LDI R30,0
03C0 077E CPC R23,R30
03C1 F409 BNE 0x03C3
03C2 C051 RJMP 0x0414
03C3 3B6E CPI R22,0xBE
03C4 E0E0 LDI R30,0
03C5 077E CPC R23,R30
03C6 F409 BNE 0x03C8
03C7 C044 RJMP 0x040C
03C8 EB8E LDI R24,0xBE
03C9 E090 LDI R25,0
03CA 1786 CP R24,R22
03CB 0797 CPC R25,R23
03CC F0A4 BLT 0x03E1
03CD 3767 CPI R22,0x77
03CE E0E0 LDI R30,0
03CF 077E CPC R23,R30
03D0 F409 BNE 0x03D2
03D1 C054 RJMP 0x0426
03D2 376B CPI R22,0x7B
03D3 E0E0 LDI R30,0
03D4 077E CPC R23,R30
03D5 F409 BNE 0x03D7
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -