📄 写字库.lst
字号:
(0041)
(0042) #include<iom16v.h>
(0043) #include <macros.h>
(0044) #include "disp_key.h"
(0045) /************************************************
(0046) 宏定义
(0047) **************************************************/
(0048) //RAM
(0049) #define ALE 7 //定义锁存脚
(0050) #define WE 6 //定义写允许位
(0051) #define RE 5 //定义读允许位
(0052)
(0053)
(0054) #pragma interrupt_handler exi_int0:2 //外部中断
(0055) #pragma interrupt_handler timer1_vof:9 //定时器1中断
(0056) #pragma interrupt_handler usart_rcx:12 //USART接受中断
(0057) /************************************************
(0058) 全局变量申明
(0059) **************************************************/
(0060) //基本全局变量
(0061) int sys_cont =0;
(0062) //显示缓冲区
(0063) char DispTemp[8];
(0064) char Head[3];
(0065) //按键处理
(0066)
(0067) //数脉冲
(0068) int PDataY =0;
(0069) int PDataYMax =154;
(0070) int PDataYMin =4;
(0071)
(0072) //UART接收数据
(0073) char FileEnd =1;
(0074) char HeadLoad =0;
(0075) char HeadEN =1;
(0076) int DataIndex =0;
(0077) int FileLength =0;
(0078) unsigned int time_out_ms=1; //接收数据时限
(0079) unsigned char time_out_s=0; //试图通讯重新时限
(0080)
(0081) //特效处理
(0082) char DispModel =0;
(0083) int ModelDelayTime =0;
(0084) char ModelContJuge=0;
(0085) /************************************************
(0086) 函数申明
(0087) **************************************************/
(0088) //基本初始化
(0089) void port_int(void);
(0090) void timer_int(void);
(0091) void uart_int(void);
(0092) void device_int(void);
(0093)
(0094) //按键显示事件处理
(0095) void Display_event(void); //显示事件
(0096) void KEY_event(void); //按键事件处理
(0097)
(0098) //特效处理
(0099) void Disp_Model(void); //屏幕显示特效模式
(0100)
(0101) //外部RAM读写操作
(0102) void data_store(char data);
(0103) char RAM_Read(int adress);
(0104) void RAM_Write(int adress,char data);
(0105)
(0106) //显示屏数据发送
(0107) void Screen_send(void);
(0108) void SPI_data_send(unsigned char send_data);
(0109)
(0110) //UART收发数据
(0111) void uart_TX(unsigned char data);
(0112) void uart_time_out(void);
(0113)
(0114) //中断函数
(0115) void exi_int0(void);
(0116) void timer1_vof(void);
(0117) void usart_rcx(void);
(0118) /*************************************************
(0119) * 子函数区 *
(0120) * *
(0121) *************************************************/
(0122)
(0123) /****************************************
(0124) 端口定义
(0125) ****************************************/
(0126) void port_int(void)
(0127) {
(0128) DDRA =0XFF;
_port_int:
013F EF8F LDI R24,0xFF
0140 BB8A OUT 0x1A,R24
(0129) PORTA =0XFF;
0141 BB8B OUT 0x1B,R24
(0130) DDRB =0B00001110;
0142 E08E LDI R24,0xE
0143 BB87 OUT 0x17,R24
(0131) PORTB =0XFF;
0144 EF8F LDI R24,0xFF
0145 BB88 OUT 0x18,R24
(0132) DDRC =0XFF;
0146 BB84 OUT 0x14,R24
(0133) PORTC =0XFF;
0147 BB85 OUT 0x15,R24
(0134) DDRD = 0xF8; //
0148 EF88 LDI R24,0xF8
0149 BB81 OUT 0x11,R24
(0135) PORTD = 0XFF;
014A EF8F LDI R24,0xFF
014B BB82 OUT 0x12,R24
014C 9508 RET
(0136) }
(0137)
(0138) /****************************************
(0139) 定时器
(0140) ****************************************/
(0141) void timer_int(void)
(0142) {
(0143) TCCR1B = 0x00; //stop
_timer_int:
014D 2422 CLR R2
014E BC2E OUT 0x2E,R2
014F 940E0450 CALL 0x450
(0144) TCNT1H = 0xd4; //setup
(0145) TCNT1L = 0xce;
(0146) TCCR1A = 0x00;
0151 BC2F OUT 0x2F,R2
(0147) TCCR1B = 0x01; //start Timer
0152 E081 LDI R24,1
0153 BD8E OUT 0x2E,R24
(0148) TIMSK = 0x04;
0154 E084 LDI R24,4
0155 BF89 OUT 0x39,R24
0156 9508 RET
(0149)
(0150) }
(0151)
(0152) /****************************************
(0153) 外中断
(0154) ****************************************/
(0155) void exit_int(void)
(0156) {
(0157) GICR = 0x40;
_exit_int:
0157 E480 LDI R24,0x40
0158 BF8B OUT 0x3B,R24
(0158) MCUCR = 0x02;
0159 E082 LDI R24,2
015A BF85 OUT 0x35,R24
015B 9508 RET
(0159)
(0160) }
(0161)
(0162) /****************************************
(0163) 串口通讯
(0164) ****************************************/
(0165) void uart_int(void)
(0166) {
(0167) UCSRB = 0x00; //disable while setting baud rate
_uart_int:
015C 2422 CLR R2
015D B82A OUT 0x0A,R2
(0168) UCSRA = 0x00;
015E B82B OUT 0x0B,R2
(0169) UCSRC = 0x00;
015F BC20 OUT 0x20,R2
(0170) UBRR =5; //设置波特率115200
0160 E085 LDI R24,5
0161 B989 OUT 0x09,R24
(0171) UCSRB = 0x98; //接受中断允许,接受允许,发送允许
0162 E988 LDI R24,0x98
0163 B98A OUT 0x0A,R24
(0172) UCSRC = 0xBc; //8BIT, 奇校验,2停止位
0164 EB8C LDI R24,0xBC
0165 BD80 OUT 0x20,R24
0166 9508 RET
(0173) }
(0174)
(0175) /****************************************
(0176) 器件初始化函数
(0177) ****************************************/
(0178) void device_int(void)
(0179) {
(0180) CLI();
_device_int:
0167 94F8 BCLR 7
(0181) port_int();
0168 DFD6 RCALL _port_int
(0182) timer_int();
0169 DFE3 RCALL _timer_int
(0183) exit_int();
016A DFEC RCALL _exit_int
(0184) uart_int();
016B DFF0 RCALL _uart_int
(0185) SEI();
016C 9478 BSET 7
016D 9508 RET
(0186) }
(0187)
(0188) /****************************************
(0189) 串口收发数据
(0190) ****************************************/
(0191) void uart_TX(unsigned char data)
(0192) {
(0193) UCSRA |=0X40; //标志清零
_uart_TX:
data --> R16
016E 9A5E SBI 0x0B,6
(0194) UDR =data;
016F B90C OUT 0x0C,R16
0170 9508 RET
0171 940E042C CALL 0x42C
(0195) }
(0196) //***************
(0197) //传输超时处理,当time_out_ms大于设定值的时候,等待等待20S,并且
(0198) //一直发送标志符号,超过20S以后,进行错误处理
(0199) void uart_time_out(void)
(0200) {
(0201) time_out_ms++;
_uart_time_out:
0173 9601 ADIW R24,1
0174 940E041D CALL 0x41D
(0202) if (HeadEN ==0 && FileEnd ==0 && time_out_ms >=800 )
0176 90200087 LDS R2,HeadEN
0178 2022 TST R2
0179 F521 BNE 0x019E
017A 90200085 LDS R2,FileEnd
017C 2022 TST R2
017D F501 BNE 0x019E
017E 3280 CPI R24,0x20
017F E0E3 LDI R30,3
0180 079E CPC R25,R30
0181 F0E0 BCS 0x019E
(0203) {
(0204) if(sys_cont ==0) //秒记时
0182 9020007D LDS R2,sys_cont
0184 9030007E LDS R3,sys_cont+1
0186 2022 TST R2
0187 F479 BNE 0x0197
0188 2033 TST R3
0189 F469 BNE 0x0197
(0205) {
(0206) time_out_s++;
018A 9180008E LDS R24,time_out_s
018C 5F8F SUBI R24,0xFF
018D 9380008E STS time_out_s,R24
(0207) if (time_out_s ==20) //结束标志
018F 3184 CPI R24,0x14
0190 F431 BNE 0x0197
(0208) {
(0209) time_out_ms=1; //闲置标志
0191 E081 LDI R24,1
0192 E090 LDI R25,0
0193 940E041D CALL 0x41D
0195 940E044B CALL 0x44B
(0210) HeadEN=1;
(0211) FileEnd=1;
(0212) //进行错误处理,并要跳出此结构体
(0213) {/**********/}
(0214) }
(0215) }
(0216) uart_TX(0xAA); //重复发送标志位
0197 EA0A LDI R16,0xAA
0198 DFD5 RCALL _uart_TX
0199 940E042C CALL 0x42C
(0217) time_out_ms--;
019B 9701 SBIW R24,1
019C 940E041D CALL 0x41D
(0218) }
(0219) if (time_out_ms ==1000)
019E 940E042C CALL 0x42C
01A0 3E88 CPI R24,0xE8
01A1 E0E3 LDI R30,3
01A2 079E CPC R25,R30
01A3 F421 BNE 0x01A8
(0220) time_out_ms=1; //1 表示空闲状态
01A4 E081 LDI R24,1
01A5 E090 LDI R25,0
01A6 940E041D CALL 0x41D
01A8 9508 RET
_SPI_data_send:
count --> R20
send_data --> R22
01A9 D1F9 RCALL push_gset2
01AA 2F60 MOV R22,R16
(0221) }
(0222) /***************************************************
(0223) 向显示屏送数据
(0224) ***************************************************/
(0225)
(0226) void SPI_data_send(unsigned char send_data) //向595送数据串
(0227) {
(0228) unsigned char count;
(0229) for(count =0;count<8;count++)
01AB 2744 CLR R20
01AC C010 RJMP 0x01BD
(0230) {
(0231) if(((send_data<<count)&0x80 )==0)
01AD 2F06 MOV R16,R22
01AE 2F14 MOV R17,R20
01AF D23A RCALL lsl8
01B0 2F80 MOV R24,R16
01B1 7880 ANDI R24,0x80
01B2 F421 BNE 0x01B7
(0232) PORTC &= 0b01111111; //送 data
01B3 B385 IN R24,0x15
01B4 778F ANDI R24,0x7F
01B5 BB85 OUT 0x15,R24
01B6 C001 RJMP 0x01B8
(0233) else
(0234) PORTC |= 0b10000000;
01B7 9AAF SBI 0x15,7
(0235) PORTD |=0b00001000; //送SCK信号
01B8 9A93 SBI 0x12,3
(0236) PORTD &=0b11110111;
01B9 B382 IN R24,0x12
01BA 7F87 ANDI R24,0xF7
01BB BB82 OUT 0x12,R24
01BC 9543 INC R20
01BD 3048 CPI R20,0x8
01BE F370 BCS 0x01AD
01BF D1DB RCALL pop_gset2
01C0 9508 RET
_Screen_send:
i --> R20
01C1 D1E3 RCALL push_gset1
(0237) }
(0238) }
(0239) void Screen_send(void)
(0240) {
(0241) char i;
(0242) PORTD &= 0b11101111; //送RCK信号,底电平
01C2 B382 IN R24,0x12
01C3 7E8F ANDI R24,0xEF
01C4 BB82 OUT 0x12,R24
(0243) for(i =0;i <8;i++)
01C5 2744 CLR R20
01C6 C003 RJMP 0x01CA
(0244) {
(0245) SPI_data_send(0xff);//sys_cont); //DispTemp[i]);
01C7 EF0F LDI R16,0xFF
01C8 DFE0 RCALL _SPI_data_send
01C9 9543 INC R20
01CA 3048 CPI R20,0x8
01CB F3D8 BCS 0x01C7
(0246) }
(0247) PORTD |= 0b00010000; //关闭RCK信号,高电平
01CC 9A94 SBI 0x12,4
01CD D1DA RCALL pop_gset1
01CE 9508 RET
(0248)
(0249) }
(0250) /**************************************************
(0251) 数据接受,外部RAM读写
(0252) ****************************************************/
(0253) //写外部RAM
(0254) void RAM_Write(int adress,char data)
(0255) {
(0256) PORTD |=0B11100000; //关ALE 读关闭 写关闭
_RAM_Write:
data --> R18
adress --> R16
01CF 940E03F0 CALL <created procedures>
(0257) DDRA =0XFF;
(0258) PORTA =adress&0xff;
(0259) PORTC =(adress >>8)&0xff;
(0260) PORTD &=0b01111111;
(0261) PORTA =data;
01D1 BB2B OUT 0x1B,R18
(0262) PORTD &=0b10111111;
01D2 B382 IN R24,0x12
01D3 7B8F ANDI R24,0xBF
01D4 BB82 OUT 0x12,R24
01D5 9508 RET
_RAM_Read:
temp --> R20
adress --> R16
01D6 D1CE RCALL push_gset1
01D7 940E03F0 CALL <created procedures>
(0263) //PORTD |=0B01100000; //关ALE 读关闭 写关闭
(0264) }
(0265) //读外部RAM
(0266) char RAM_Read(int adress)
(0267) {
(0268) char temp;
(0269) PORTD |=0B11100000; //关ALE 读关闭 写关闭
(0270) DDRA =0XFF;
(0271) PORTA =adress&0xff;
(0272) PORTC =(adress >>8)&0xff;
(0273) PORTD &=0b01111111;
(0274) PORTD &=0b11011111;
01D9 B382 IN R24,0x12
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -