📄 rtc.lst
字号:
0116 CF7C RJMP _Delayms
_LCD1602_readBF:
busy --> R20
0117 940E06E8 CALL push_gset1
(0091) /*******************************************
(0092) 函数名称: LCD1602_readBF
(0093) 功 能: 1602液晶清屏
(0094) 参 数: 无
(0095) 返回值 : busy--为1时忙,为0时可以接收指令
(0096) /********************************************/
(0097) uchar LCD1602_readBF(void)
(0098) {
(0099) uchar busy;
(0100) busy=LCD1602_readbyte(iCmd); //读回BF标志和地址
0119 2700 CLR R16
011A DFBB RCALL _LCD1602_readbyte
011B 2F40 MOV R20,R16
(0101) if(busy&0x80) //忙
011C FF07 SBRS R16,7
011D C002 RJMP 0x0120
(0102) busy=1;
011E E041 LDI R20,1
011F C001 RJMP 0x0121
(0103) else //不忙,可以写入
(0104) busy=0;
0120 2744 CLR R20
(0105) return busy;
0121 2F04 MOV R16,R20
0122 940E06EB CALL pop_gset1
0124 9508 RET
_LCD1602_gotoXY:
Col --> R20
Row --> R22
0125 940E06FF CALL push_gset2
0127 2F42 MOV R20,R18
0128 2F60 MOV R22,R16
(0106) }
(0107) /*******************************************
(0108) 函数名称: LCD1602_gotoXY
(0109) 功 能: 移动到指定位置
(0110) 参 数: Row--指定的行
(0111) Col--指定的列
(0112) 返回值 : 无
(0113) /********************************************/
(0114) void LCD1602_gotoXY(uchar Row, uchar Col)
(0115) {
(0116) switch (Row) //选择行
0129 2777 CLR R23
012A 3062 CPI R22,2
012B E0E0 LDI R30,0
012C 077E CPC R23,R30
012D F009 BEQ 0x012F
012E C005 RJMP 0x0134
(0117) {
(0118) case 2:
(0119) LCD1602_sendbyte(iCmd, LCDa_L2 + Col); break; //写入第2行的指定列
012F 2F24 MOV R18,R20
0130 5420 SUBI R18,0x40
0131 2700 CLR R16
0132 DFBB RCALL _LCD1602_sendbyte
0133 C004 RJMP 0x0138
(0120) default:
(0121) LCD1602_sendbyte(iCmd, LCDa_L1 + Col); break; //写入第1行的指定列
0134 2F24 MOV R18,R20
0135 5820 SUBI R18,0x80
0136 2700 CLR R16
0137 DFB6 RCALL _LCD1602_sendbyte
(0122) }
(0123) }
0138 940E0707 CALL pop_gset2
013A 9508 RET
(0124) /*******************************************
(0125) 函数名称: LCD1602_initial
(0126) 功 能: 1602液晶初始化
(0127) 参 数: 无
(0128) 返回值 : 无
(0129) /********************************************/
(0130) void LCD1602_initial(void)
(0131) {
(0132) Delayms(100); // 等待内部复位
_LCD1602_initial:
013B E604 LDI R16,0x64
013C E010 LDI R17,0
013D DF55 RCALL _Delayms
(0133) LCD1602_portini(); //端口初始化
013E DF90 RCALL _LCD1602_portini
(0134)
(0135) LCD1602_sendbyte(iCmd, LCDa_FUNCTION); // 功能、模式设定
013F E328 LDI R18,0x38
0140 2700 CLR R16
0141 DFAC RCALL _LCD1602_sendbyte
(0136) while(LCD1602_readBF());
0142 DFD4 RCALL _LCD1602_readBF
0143 2300 TST R16
0144 F7E9 BNE 0x0142
(0137) LCD1602_sendbyte(iCmd, LCDa_ON); //打开显示
0145 E02C LDI R18,0xC
0146 2700 CLR R16
0147 DFA6 RCALL _LCD1602_sendbyte
(0138) while(LCD1602_readBF());
0148 DFCE RCALL _LCD1602_readBF
0149 2300 TST R16
014A F7E9 BNE 0x0148
(0139) LCD1602_clear(); //清屏
014B DFC5 RCALL _LCD1602_clear
(0140) while(LCD1602_readBF());
014C DFCA RCALL _LCD1602_readBF
014D 2300 TST R16
014E F7E9 BNE 0x014C
(0141) LCD1602_sendbyte(iCmd, LCDa_ENTRY); // 输入模式设定
014F E026 LDI R18,6
0150 2700 CLR R16
(0142) } 0151 CF9C RJMP _LCD1602_sendbyte
FILE: C:\icc\examples.avr\AVR_PQ1A_DEMO\17_RTC\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
0152 EF8F LDI R24,0xFF
0153 BB81 OUT P11,R24
(0023) KEY_PORTO=0xF0; //输出数据(输出检测码)
0154 EF80 LDI R24,0xF0
0155 BB82 OUT P12,R24
(0024) KEY_DDR=IN; //定义数据端口为输入
0156 BB81 OUT P11,R24
(0025) if((KEY_PORTI)!=0xF0) //检测是否有键按下
0157 B380 IN R24,P10
0158 3F80 CPI R24,0xF0
0159 F011 BEQ 0x015C
(0026) pressed=TRUE; //有键按下则返回TRUE
015A E001 LDI R16,1
015B C001 RJMP 0x015D
(0027) else
(0028) pressed=FALSE; //无键按下则返回FALSE
015C 2700 CLR R16
(0029) KEY_DDR=OUT; //数据端口还原为输出
015D EF8F LDI R24,0xFF
015E BB81 OUT P11,R24
(0030) return pressed;
015F 9508 RET
_Mkey_scan:
keycode --> R20
i --> R10
0160 940E0703 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为扫描码,
0162 E78F LDI R24,0x7F
0163 2EA8 MOV R10,R24
0164 EF4F LDI R20,0xFF
(0041) Delayms(15); //延时消抖
0165 E00F LDI R16,0xF
0166 E010 LDI R17,0
0167 DF2B RCALL _Delayms
(0042) if(Mkey_press()==TRUE) //如果有键按下
0168 DFE9 RCALL _Mkey_press
0169 3001 CPI R16,1
016A F009 BEQ 0x016C
016B C092 RJMP 0x01FE
(0043) {
(0044) do
(0045) {
(0046) i=(i<<1|i>>7); //进行行扫描
016C 2C2A MOV R2,R10
016D 9426 LSR R2
016E 9426 LSR R2
016F 9426 LSR R2
0170 9426 LSR R2
0171 9426 LSR R2
0172 9426 LSR R2
0173 9426 LSR R2
0174 2C3A MOV R3,R10
0175 0C33 LSL R3
0176 2832 OR R3,R2
0177 2CA3 MOV R10,R3
(0047) KEY_DDR=0x0F; //定义数据端口低四位为输出,高四位为输入
0178 E08F LDI R24,0xF
0179 BB81 OUT P11,R24
(0048) KEY_PORTO=i; //输出扫描码
017A BA32 OUT P12,R3
(0049) Delayms(1); //防止读入出错,加入延时
017B E001 LDI R16,1
017C E010 LDI R17,0
017D DF15 RCALL _Delayms
(0050) keycode=KEY_PORTI; //读入原始键码
017E B340 IN R20,P10
(0051) }while((keycode&0xF0)==0xF0); //是否检测到被按下按键(扫描到就跳出循环,否则继续扫描)
017F 2F84 MOV R24,R20
0180 7F80 ANDI R24,0xF0
0181 3F80 CPI R24,0xF0
0182 F349 BEQ 0x016C
(0052) do
(0053) {
(0054) }while(Mkey_press()==TRUE); //等待按键释放(为了防止按一次,执行多次的现象)
0183 DFCE RCALL _Mkey_press
0184 3001 CPI R16,1
0185 F3E9 BEQ 0x0183
(0055) Delayms(15); //延时消抖
0186 E00F LDI R16,0xF
0187 E010 LDI R17,0
0188 DF0A RCALL _Delayms
(0056) switch(keycode) //将原始键码翻译成0~F
0189 2F64 MOV R22,R20
018A 2777 CLR R23
018B 3B67 CPI R22,0xB7
018C E0E0 LDI R30,0
018D 077E CPC R23,R30
018E F409 BNE 0x0190
018F C06B RJMP 0x01FB
0190 3B6B CPI R22,0xBB
0191 E0E0 LDI R30,0
0192 077E CPC R23,R30
0193 F409 BNE 0x0195
0194 C05E RJMP 0x01F3
0195 3B6D CPI R22,0xBD
0196 E0E0 LDI R30,0
0197 077E CPC R23,R30
0198 F409 BNE 0x019A
0199 C051 RJMP 0x01EB
019A 3B6E CPI R22,0xBE
019B E0E0 LDI R30,0
019C 077E CPC R23,R30
019D F409 BNE 0x019F
019E C044 RJMP 0x01E3
019F EB8E LDI R24,0xBE
01A0 E090 LDI R25,0
01A1 1786 CP R24,R22
01A2 0797 CPC R25,R23
01A3 F0A4 BLT 0x01B8
01A4 3767 CPI R22,0x77
01A5 E0E0 LDI R30,0
01A6 077E CPC R23,R30
01A7 F409 BNE 0x01A9
01A8 C054 RJMP 0x01FD
01A9 376B CPI R22,0x7B
01AA E0E0 LDI R30,0
01AB 077E CPC R23,R30
01AC F409 BNE 0x01AE
01AD C047 RJMP 0x01F5
01AE 376D CPI R22,0x7D
01AF E0E0 LDI R30,0
01B0 077E CPC R23,R30
01B1 F409 BNE 0x01B3
01B2 C03A RJMP 0x01ED
01B3 376E CPI R22,0x7E
01B4 E0E0 LDI R30,0
01B5 077E CPC R23,R30
01B6 F171 BEQ 0x01E5
01B7 C046 RJMP 0x01FE
01B8 3D67 CPI R22,0xD7
01B9 E0E0 LDI R30,0
01BA 077E CPC R23,R30
01BB F409 BNE 0x01BD
01BC C03C RJMP 0x01F9
01BD 3D6B CPI R22,0xDB
01BE E0E0 LDI R30,0
01BF 077E CPC R23,R30
01C0 F181 BEQ 0x01F1
01C1 3D6D CPI R22,0xDD
01C2 E0E0 LDI R30,0
01C3 077E CPC R23,R30
01C4 F121 BEQ 0x01E9
01C5 3D6E CPI R22,0xDE
01C6 E0E0 LDI R30,0
01C7 077E CPC R23,R30
01C8 F0C1 BEQ 0x01E1
01C9 3D67 CPI R22,0xD7
01CA E0E0 LDI R30,0
01CB 077E CPC R23,R30
01CC F40C BGE 0x01CE
01CD C030 RJMP 0x01FE
01CE 3E67 CPI R22,0xE7
01CF E0E0 LDI R30,0
01D0 077E CPC R23,R30
01D1 F129 BEQ 0x01F7
01D2 3E6B CPI R22,0xEB
01D3 E0E0 LDI R30,0
01D4 077E CPC R23,R30
01D5 F0C9 BEQ 0x01EF
01D6 3E6D CPI R22,0xED
01D7 E0E0 LDI R30,0
01D8 077E CPC R23,R30
01D9 F069 BEQ 0x01E7
01DA 3E6E CPI R22,0xEE
01DB E0E0 LDI R30,0
01DC 077E CPC R23,R30
01DD F009 BEQ 0x01DF
01DE C01F RJMP 0x01FE
(0057) {
(0058) case 0xEE:
(0059) keycode=0x0;
01DF 2744 CLR R20
(0060) break;
01E0 C01D RJMP 0x01FE
(0061) case 0xDE:
(0062) keycode=0x1;
01E1 E041 LDI R20,1
(0063) break;
01E2 C01B RJMP 0x01FE
(0064) case 0xBE:
(0065) keycode=0x2;
01E3 E042 LDI R20,2
(0066) break;
01E4 C019 RJMP 0x01FE
(0067) case 0x7E:
(0068) keycode=0x3;
01E5 E043 LDI R20,3
(0069) break;
01E6 C017 RJMP 0x01FE
(0070) case 0xED:
(0071) keycode=0x4;
01E7 E044 LDI R20,4
(0072) break;
01E8 C015 RJMP 0x01FE
(0073) case 0xDD:
(0074) keycode=0x5;
01E9 E045 LDI R20,5
(0075) break;
01EA C013 RJMP 0x01FE
(0076) case 0xBD:
(0077) keycode=0x6;
01EB E046 LDI R20,6
(0078) break;
01EC C011 RJMP 0x01FE
(0079) case 0x7D:
(0080) keycode=0x7;
01ED E047 LDI R20,7
(0081) break;
01EE C00F RJMP 0x01FE
(0082) case 0xEB:
(0083) keycode=0x8;
01EF E048 LDI R20,0x8
(0084) break;
01F0 C00D RJMP 0x01FE
(0085) case 0xDB:
(0086) keycode=0x9;
01F1 E049 LDI R20,0x9
(0087) break;
01F2 C00B RJMP 0x01FE
(0088) case 0xBB:
(0089) keycode=0xA;
01F3 E04A LDI R20,0xA
(0090) break;
01F4 C009 RJMP 0x01FE
(0091) case 0x7B:
(0092) keycode=0xB;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -