📄 hzmmi.lst
字号:
__start:
__text_start:
007E E5CF LDI R28,0x5F
007F E1D0 LDI R29,0x10
0080 BFCD OUT P3D,R28
0081 BFDE OUT P3E,R29
0082 51C0 SUBI R28,0x10
0083 40D0 SBCI R29,0
0084 EA0A LDI R16,0xAA
0085 8308 STD R16,0+Y
0086 2400 CLR R0
0087 E5E8 LDI R30,0x58
0088 E0F1 LDI R31,1
0089 E011 LDI R17,1
008A 3EE4 CPI R30,0xE4
008B 07F1 CPC R31,R17
008C F011 BEQ 0x008F
008D 9201 ST R0,Z+
008E CFFB RJMP 0x008A
008F 8300 STD R16,0+Z
0090 EAE4 LDI R30,0xA4
0091 E0F0 LDI R31,0
0092 E0A0 LDI R26,0
0093 E0B1 LDI R27,1
0094 E010 LDI R17,0
0095 3FEC CPI R30,0xFC
0096 07F1 CPC R31,R17
0097 F021 BEQ 0x009C
0098 95C8 LPM
0099 9631 ADIW R30,1
009A 920D ST R0,X+
009B CFF9 RJMP 0x0095
009C 940E009F CALL _main
_exit:
009E CFFF RJMP _exit
FILE: D:\美来尼尔\美兰尼尔改进\测控单元\面板程序\测控面板调试程序\hzmmi.c
(0000) #include "hzmmi.h"
(0001)
(0002) #define __main__
(0003)
(0004) #define T_RELOAD (10000-1) //1.000ms @10MHz,毫秒定时器用
(0005)
(0006) void init1(void); //初始化子程序
(0007) void run_1s(void); //1秒任务
(0008) void dlyms(word ms); //毫秒级延时函数
(0009) void delly(word ns); //毫秒级延时函数
(0010) void str_hz(byte row,byte col,byte *str); //显示汉字串及大ASCII串
(0011) void wait_disp(void); //液晶忙等待
(0012) void write_order(byte order); //对液晶发送命令码
(0013) void write_data(byte data); //向LCD送数据码(ASCII码)
(0014) void init_disp_nocls(void); //对液晶初始化,不清屏
(0015) void cls(void); //清屏
(0016) void init_disp(void); //对液晶初始化,清屏
(0017) void str_sasc(byte row,byte col,byte *str); //显示小ASCII串
(0018) void disp_face(void); //显示首页
(0019) void full(void);
(0020) void write_data(byte data);
(0021) void write_data_auto(byte data);
(0022)
(0023) void wait_disp_auto(void);
(0024)
(0025) word sec_num; //1秒任务计时器
(0026) word mstimer1; //毫秒延时计数
(0027) word mstimer3; //串口发送延时
(0028) byte ctl_data;
(0029) LIB_ADDR lib_addr;
(0030)
(0031)
(0032) byte disp_buffer[128]; //显示缓冲区
(0033) byte flag;
(0034)
(0035) //主程序调用了上电复位进程,键盘进程,事件进程;
(0036) void main(void)
(0037) {
(0038) word i,j;
(0039) byte *pt;
(0040)
(0041) flag=1;
_main:
pt --> Y+1
j --> Y+1
i --> Y+1
009F E081 LDI R24,1
00A0 93800158 STS R24,_flag
(0042) init1();
00A2 D02C RCALL _init1
(0043) init_disp();
00A3 D140 RCALL _init_disp
(0044) disp_face();
00A4 D072 RCALL _disp_face
(0045) // dlyms(4000);
(0046) for(;;){
(0047) if(sec_num>1000) {
00A5 EE88 LDI R24,0xE8
00A6 E093 LDI R25,3
00A7 9030015A LDS R3,_sec_num+1
00A9 90200159 LDS R2,_sec_num
00AB 1582 CP R24,R2
00AC 0593 CPC R25,R3
00AD F470 BCC 0x00BC
(0048)
(0049) if(flag){
00AE 90200158 LDS R2,_flag
00B0 2022 TST R2
00B1 F029 BEQ 0x00B7
(0050) flag=0;
00B2 2422 CLR R2
00B3 92200158 STS R2,_flag
(0051) disp_face();
00B5 D061 RCALL _disp_face
(0052) }
00B6 C004 RJMP 0x00BB
(0053) else{
(0054) flag=1;
00B7 E081 LDI R24,1
00B8 93800158 STS R24,_flag
(0055) cls();
00BA D0F2 RCALL _cls
(0056) }
(0057)
(0058) run_1s();
00BB D003 RCALL _run_1s
(0059) }
(0060) asm("wdr"); //软看门狗复位
00BC 95A8 WDR
(0061) }
00BD CFE7 RJMP 0x00A5
00BE 9508 RET
(0062) }
(0063) //1秒任务
(0064) void run_1s(void)
(0065) {
(0066) sec_num=0;
_run_1s:
00BF 2422 CLR R2
00C0 2433 CLR R3
00C1 9230015A STS R3,_sec_num+1
00C3 92200159 STS R2,_sec_num
(0067) PORTE^=RUN_LAMP;
00C5 E084 LDI R24,4
00C6 B023 IN R2,P03
00C7 2628 EOR R2,R24
00C8 B823 OUT P03,R2
(0068) PORTG|=EL_ON;
00C9 91800065 LDS R24,0x65
00CB 6180 ORI R24,0x10
00CC 93800065 STS R24,0x65
(0069) }
00CE 9508 RET
(0070) //初始化
(0071) void init1(void)
(0072) {
(0073) //定时器初始化
(0074) MCUCR=0x80;//enable the External Memory
_init1:
00CF E880 LDI R24,0x80
00D0 BF85 OUT P35,R24
(0075) XMCRA=0x0e;
00D1 E08E LDI R24,0xE
00D2 9380006D STS R24,0x6D
(0076) XMCRB=0x80;
00D4 E880 LDI R24,0x80
00D5 9380006C STS R24,0x6C
(0077)
(0078) TCCR1A=0;
00D7 2422 CLR R2
00D8 BC2F OUT P2F,R2
(0079) TCCR1B=0x09; // ctc1=1,ck/1
00D9 E089 LDI R24,0x9
00DA BD8E OUT P2E,R24
(0080) TIMSK=0x10; // TIME1B COMPEAR INT OK
00DB E180 LDI R24,0x10
00DC BF87 OUT P37,R24
(0081) OCR1AH=(byte)(T_RELOAD/256);
00DD E287 LDI R24,0x27
00DE BD8B OUT P2B,R24
(0082) OCR1AL=(byte)T_RELOAD;
00DF E08F LDI R24,0xF
00E0 BD8A OUT P2A,R24
(0083) //液晶口初始化
(0084) DDRB=0x00; //键盘输入
00E1 BA27 OUT P17,R2
(0085) DDRD=0xff; //LCD控制
00E2 EF8F LDI R24,0xFF
00E3 BB81 OUT P11,R24
(0086) DDRE=0x0f;
00E4 E08F LDI R24,0xF
00E5 B982 OUT P02,R24
(0087) DDRF=0x0f; //LIB为输出
00E6 93800061 STS R24,0x61
(0088) DDRG=0x18;
00E8 E188 LDI R24,0x18
00E9 93800064 STS R24,0x64
(0089)
(0090) asm("sei");
00EB 9478 BSET 7
(0091) }
00EC 9508 RET
_int_timer0:
00ED 922A ST R2,-Y
00EE 923A ST R3,-Y
00EF 938A ST R24,-Y
00F0 939A ST R25,-Y
00F1 B62F IN R2,P3F
00F2 922A ST R2,-Y
(0092)
(0093) #pragma interrupt_handler int_timer0:13 //定义中断向量
(0094) void int_timer0(void) //定时器延时器中断,1ms中断一次
(0095) {
(0096) asm("cli"); //关中断
00F3 94F8 BCLR 7
(0097) OCR1AH=(byte)(T_RELOAD/256);
00F4 E287 LDI R24,0x27
00F5 BD8B OUT P2B,R24
(0098) OCR1AL=(byte)T_RELOAD;
00F6 E08F LDI R24,0xF
00F7 BD8A OUT P2A,R24
(0099) sec_num++; //秒计时+1
00F8 9190015A LDS R25,_sec_num+1
00FA 91800159 LDS R24,_sec_num
00FC 9601 ADIW R24,1
00FD 9390015A STS R25,_sec_num+1
00FF 93800159 STS R24,_sec_num
(0100) if(mstimer1>0) mstimer1--;
0101 903001E3 LDS R3,_mstimer1+1
0103 902001E2 LDS R2,_mstimer1
0105 2022 TST R2
0106 F411 BNE 0x0109
0107 2033 TST R3
0108 F031 BEQ 0x010F
0109 01C1 MOVW R24,R2
010A 9701 SBIW R24,1
010B 939001E3 STS R25,_mstimer1+1
010D 938001E2 STS R24,_mstimer1
(0101) // if(mstimer2>0) mstimer2--;
(0102) asm("sei"); //中断允许
010F 9478 BSET 7
(0103) }
0110 9029 LD R2,Y+
0111 BE2F OUT P3F,R2
0112 9199 LD R25,Y+
0113 9189 LD R24,Y+
0114 9039 LD R3,Y+
0115 9029 LD R2,Y+
0116 9518 RETI
_disp_face:
i --> Y+3
0117 9722 SBIW R28,2
(0104)
(0105) void disp_face(void)
(0106) {
(0107) byte i;
(0108) cls();
0118 D094 RCALL _cls
(0109)
(0110) strcpy(disp_buffer,"靶靶靶靶靶靶靶靶靶靶靶靶");
0119 E32F LDI R18,0x3F
011A E031 LDI R19,1
011B E50B LDI R16,0x5B
011C E011 LDI R17,1
011D 940E058B CALL _strcpy
(0111) str_hz(0,0,disp_buffer);
011F E58B LDI R24,0x5B
0120 E091 LDI R25,1
0121 8388 STD R24,0+Y
0122 8399 STD R25,1+Y
0123 2722 CLR R18
0124 2700 CLR R16
0125 D0E1 RCALL _str_hz
(0112)
(0113) strcpy(disp_buffer,"啊啊啊阿阿阿埃123456");
0126 E22A LDI R18,0x2A
0127 E031 LDI R19,1
0128 E50B LDI R16,0x5B
0129 E011 LDI R17,1
012A 940E058B CALL _strcpy
(0114) str_hz(16,0,disp_buffer);
012C E58B LDI R24,0x5B
012D E091 LDI R25,1
012E 8388 STD R24,0+Y
012F 8399 STD R25,1+Y
0130 2722 CLR R18
0131 E100 LDI R16,0x10
0132 D0D4 RCALL _str_hz
(0115)
(0116) strcpy(disp_buffer,"靶把耙班搬办绊绑棒磅");
0133 E125 LDI R18,0x15
0134 E031 LDI R19,1
0135 E50B LDI R16,0x5B
0136 E011 LDI R17,1
0137 940E058B CALL _strcpy
(0117) str_hz(32,0,disp_buffer);
0139 E58B LDI R24,0x5B
013A E091 LDI R25,1
013B 8388 STD R24,0+Y
013C 8399 STD R25,1+Y
013D 2722 CLR R18
013E E200 LDI R16,0x20
013F D0C7 RCALL _str_hz
(0118)
(0119) strcpy(disp_buffer,"01234567890123456789");
0140 E020 LDI R18,0
0141 E031 LDI R19,1
0142 E50B LDI R16,0x5B
0143 E011 LDI R17,1
0144 940E058B CALL _strcpy
(0120) str_sasc(48,0,disp_buffer);
0146 E58B LDI R24,0x5B
0147 E091 LDI R25,1
0148 8388 STD R24,0+Y
0149 8399 STD R25,1+Y
014A 2722 CLR R18
014B E300 LDI R16,0x30
014C D2A2 RCALL _str_sasc
(0121) }
014D 9622 ADIW R28,2
014E 9508 RET
(0122)
(0123)
(0124)
(0125)
(0126) //毫秒级延时函数
(0127) void dlyms(word ms)
(0128) {
(0129) mstimer1=ms;
_dlyms:
ms --> R16
014F 931001E3 STS R17,_mstimer1+1
0151 930001E2 STS R16,_mstimer1
0153 C001 RJMP 0x0155
(0130) while(mstimer1){
(0131) asm("wdr"); //软看门狗复位
0154 95A8 WDR
(0132) // PORTB^=WDG; //硬看门狗复位
(0133) }
0155 903001E3 LDS R3,_mstimer1+1
0157 902001E2 LDS R2,_mstimer1
0159 2022 TST R2
015A F7C9 BNE 0x0154
015B 2033 TST R3
015C F7B9 BNE 0x0154
(0134) }
015D 9508 RET
_delly:
i --> R20
ns --> R16
015E 940E0552 CALL push_gset1
(0135) //延时函数
(0136) void delly(word ns)
(0137) {
(0138) byte i;
(0139) for(i=0;i<ns;i++){
0160 2744 CLR R20
0161 C002 RJMP 0x0164
(0140) asm("wdr"); //软看门狗复位
0162 95A8 WDR
(0141) // PORTB^=WDG; //硬看门狗复位
(0142) }
0163 9543 INC R20
0164 2E24 MOV R2,R20
0165 2433 CLR R3
0166 1620 CP R2,R16
0167 0631 CPC R3,R17
0168 F3C8 BCS 0x0162
(0143) }
0169 940E0555 CALL pop_gset1
016B 9508 RET
(0144)
(0145) //液晶忙等待
(0146) void wait_disp(void)
(0147) {
(0148) byte flag;
(0149)
(0150) PORTD|=LCD_ID; //CD=1
_wait_disp:
flag --> R16
016C 9A96 SBI P12,6
(0151) PORTD|=LCD_ID; //CD=1
016D 9A96 SBI P12,6
(0152) PORTD&=~LCD_CS; //CE=0
016E 9895 CBI P12,5
(0153) PORTD&=~LCD_CS; //CE=0
016F 9895 CBI P12,5
(0154) PORTD&=~LCD_CS; //CE=0
0170 9895 CBI P12,5
(0155)
(0156) for(;;)
(0157) {
(0158) asm("nop");
0171 0000 NOP
(0159) asm("nop");
0172 0000 NOP
(0160) asm("nop");
0173 0000 NOP
(0161)
(0162) flag=*(byte*)0x8000;
0174 91008000 LDS R16,0x8000
(0163) if((flag & LCD_BUSY_S0) && (flag & LCD_BUSY_S1)) //判断液晶忙否?
0176 FF00 SBRS R16,0
0177 C009 RJMP 0x0181
0178 FF01 SBRS R16,1
0179 C007 RJMP 0x0181
(0164) {
(0165)
(0166) PORTD|=LCD_CS|LCD_ID; //CE=1,ID=1
017A B382 IN R24,P12
017B 6680 ORI R24,0x60
017C BB82 OUT P12,R24
(0167) PORTD|=LCD_CS|LCD_ID; //CE=1,ID=1
017D B382 IN R24,P12
017E 6680 ORI R24,0x60
017F BB82 OUT P12,R24
(0168) return;
0180 C004 RJMP 0x0185
(0169) }
(0170) asm("nop");
0181 0000 NOP
(0171) asm("nop");
0182 0000 NOP
(0172) asm("nop");
0183 0000 NOP
(0173) }
0184 CFEC RJMP 0x0171
0185 9508 RET
_write_order:
pt --> Y+1
order --> R20
0186 940E0552 CALL push_gset1
0188 2F40 MOV R20,R16
(0174) }
(0175)
(0176) //对液晶发送命令码
(0177) void write_order(byte order)//对液晶发送命令码
(0178) {
(0179) byte *pt;
(0180)
(0181) wait_disp();
0189 DFE2 RCALL _wait_disp
(0182) PORTD|=LCD_ID; //CD=1
018A 9A96 SBI P12,6
(0183) PORTD|=LCD_ID; //CD=1
018B 9A96 SBI P12,6
(0184) PORTD|=LCD_ID; //CD=1
018C 9A96 SBI P12,6
(0185) PORTD&=~LCD_CS; //CS=0
018D 9895 CBI P12,5
(0186) PORTD&=~LCD_CS; //CS=0
018E 9895 CBI P12,5
(0187) PORTD&=~LCD_CS; //CS=0
018F 9895 CBI P12,5
(0188) *(byte*)0x8000=order; //命令码
0190 93408000 STS R20,0x8000
(0189) PORTD|=LCD_CS; //CS=1
0192 9A95 SBI P12,5
(0190) PORTD|=LCD_CS; //CS=1
0193 9A95 SBI P12,5
(0191) PORTD|=LCD_CS; //CS=1
0194 9A95 SBI P12,5
(0192) PORTD&=~LCD_ID; //CD=0
0195 9896 CBI P12,6
(0193) PORTD&=~LCD_ID; //CD=0
0196 9896 CBI P12,6
(0194) PORTD&=~LCD_ID; //CD=0
0197 9896 CBI P12,6
(0195) }
0198 940E0555 CALL pop_gset1
019A 9508 RET
_write_data:
pt --> Y+1
data --> R20
019B 940E0552 CALL push_gset1
019D 2F40 MOV R20,R16
(0196)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -