📄 显示模块2.lst
字号:
(0018) 下载:
(0019) PB4~7: SPI通讯和下载端口
(0020) PD0~1: UART通讯口
(0021) 电机:
(0022) PD2: 外中断,电机脉冲
(0023) */
(0024)
(0025) /********************************************************
(0026) 广告屏程序第二次改版----主显示控制模块程序2.0
(0027)
(0028) 1、程序采用模块化构架,提高了可读性
(0029) 2、此程序支持第二套广告屏硬件
(0030) 3、创建时间:2004年11月23日
(0031) 4、作者:西南科技大学 电子设计大赛第8大组
(0032) 注意:需要包括 :<disp_key.h>
(0033)
(0034) ********************************************************/
(0035)
(0036)
(0037)
(0038) /***************************************************
(0039) 头文件申明
(0040) ****************************************************/
(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)
(0079) //特效处理
(0080) char DispModel =0;
(0081) int ModelDelayTime =0;
(0082) char ModelContJuge=0;
(0083) /************************************************
(0084) 函数申明
(0085) **************************************************/
(0086) //基本初始化
(0087) void port_int(void);
(0088) void timer_int(void);
(0089) void uart_int(void);
(0090) void device_int(void);
(0091)
(0092) //按键显示事件处理
(0093) void Display_event(void); //显示事件
(0094) void KEY_event(void); //按键事件处理
(0095)
(0096) //特效处理
(0097) void Disp_Model(void); //屏幕显示特效模式
(0098)
(0099) //外部RAM读写操作
(0100) void data_store(char data);
(0101) char RAM_Read(int adress);
(0102) void RAM_Write(int adress,char data);
(0103)
(0104) //显示屏数据发送
(0105) void Screen_send(void);
(0106) void SPI_data_send(unsigned char send_data);
(0107)
(0108) //UART收发数据
(0109) void uart_TX(unsigned char data);
(0110)
(0111) //中断函数
(0112) void exi_int0(void);
(0113) void timer1_vof(void);
(0114) void usart_rcx(void);
(0115) /*************************************************
(0116) * 子函数区 *
(0117) * *
(0118) *************************************************/
(0119)
(0120) /****************************************
(0121) 端口定义
(0122) ****************************************/
(0123) void port_int(void)
(0124) {
(0125) DDRA =0XFF;
_port_int:
0276 EF8F LDI R24,0xFF
0277 BB8A OUT 0x1A,R24
(0126) PORTA =0XFF;
0278 BB8B OUT 0x1B,R24
(0127) DDRB =0B00001110;
0279 E08E LDI R24,0xE
027A BB87 OUT 0x17,R24
(0128) PORTB =0XFF;
027B EF8F LDI R24,0xFF
027C BB88 OUT 0x18,R24
(0129) DDRC =0XFF;
027D BB84 OUT 0x14,R24
(0130) PORTC =0XFF;
027E BB85 OUT 0x15,R24
(0131) DDRD = 0xF8; //
027F EF88 LDI R24,0xF8
0280 BB81 OUT 0x11,R24
(0132) PORTD = 0XFF;
0281 EF8F LDI R24,0xFF
0282 BB82 OUT 0x12,R24
0283 9508 RET
(0133) }
(0134)
(0135) /****************************************
(0136) 定时器
(0137) ****************************************/
(0138) void timer_int(void)
(0139) {
(0140) TCCR1B = 0x00; //stop
_timer_int:
0284 2422 CLR R2
0285 BC2E OUT 0x2E,R2
0286 940E053F CALL 0x53F
(0141) TCNT1H = 0xd4; //setup
(0142) TCNT1L = 0xce;
(0143) TCCR1A = 0x00;
0288 BC2F OUT 0x2F,R2
(0144) TCCR1B = 0x01; //start Timer
0289 E081 LDI R24,1
028A BD8E OUT 0x2E,R24
(0145) TIMSK = 0x04;
028B E084 LDI R24,4
028C BF89 OUT 0x39,R24
028D 9508 RET
(0146)
(0147) }
(0148)
(0149) /****************************************
(0150) 外中断
(0151) ****************************************/
(0152) void exit_int(void)
(0153) {
(0154) GICR = 0x40;
_exit_int:
028E E480 LDI R24,0x40
028F BF8B OUT 0x3B,R24
(0155) MCUCR = 0x02;
0290 E082 LDI R24,2
0291 BF85 OUT 0x35,R24
0292 9508 RET
(0156)
(0157) }
(0158)
(0159) /****************************************
(0160) 串口通讯
(0161) ****************************************/
(0162) void uart_int(void)
(0163) {
(0164) UCSRB = 0x00; //disable while setting baud rate
_uart_int:
0293 2422 CLR R2
0294 B82A OUT 0x0A,R2
(0165) UCSRA = 0x00;
0295 B82B OUT 0x0B,R2
(0166) UCSRC = 0x00;
0296 BC20 OUT 0x20,R2
(0167) UBRR =5; //设置波特率115200
0297 E085 LDI R24,5
0298 B989 OUT 0x09,R24
(0168) UCSRB = 0x9c;
0299 E98C LDI R24,0x9C
029A B98A OUT 0x0A,R24
(0169) UCSRC = 0xB6;
029B EB86 LDI R24,0xB6
029C BD80 OUT 0x20,R24
029D 9508 RET
(0170) }
(0171)
(0172) /****************************************
(0173) 器件初始化函数
(0174) ****************************************/
(0175) void device_int(void)
(0176) {
(0177) CLI();
_device_int:
029E 94F8 BCLR 7
(0178) port_int();
029F DFD6 RCALL _port_int
(0179) timer_int();
02A0 DFE3 RCALL _timer_int
(0180) exit_int();
02A1 DFEC RCALL _exit_int
(0181) uart_int();
02A2 DFF0 RCALL _uart_int
(0182) SEI();
02A3 9478 BSET 7
02A4 9508 RET
(0183) }
(0184)
(0185) /****************************************
(0186) 串口收发数据
(0187) ****************************************/
(0188) void uart_TX(unsigned char data)
(0189) {
(0190) UCSRA |=0X40; //标志清零
_uart_TX:
data --> R16
02A5 9A5E SBI 0x0B,6
(0191) UDR =data;
02A6 B90C OUT 0x0C,R16
02A7 9508 RET
_SPI_data_send:
count --> R20
send_data --> R22
02A8 D1F7 RCALL push_gset2
02A9 2F60 MOV R22,R16
(0192) }
(0193)
(0194) /***************************************************
(0195) 向显示屏送数据
(0196) ***************************************************/
(0197)
(0198) void SPI_data_send(unsigned char send_data) //向595送数据串
(0199) {
(0200) unsigned char count;
(0201) for(count =0;count<8;count++)
02AA 2744 CLR R20
02AB C010 RJMP 0x02BC
(0202) {
(0203) if(((send_data<<count)&0x80 )==0)
02AC 2F06 MOV R16,R22
02AD 2F14 MOV R17,R20
02AE D23F RCALL lsl8
02AF 2F80 MOV R24,R16
02B0 7880 ANDI R24,0x80
02B1 F421 BNE 0x02B6
(0204) PORTC &= 0b01111111; //送 data
02B2 B385 IN R24,0x15
02B3 778F ANDI R24,0x7F
02B4 BB85 OUT 0x15,R24
02B5 C001 RJMP 0x02B7
(0205) else
(0206) PORTC |= 0b10000000;
02B6 9AAF SBI 0x15,7
(0207) PORTD |=0b00001000; //送SCK信号
02B7 9A93 SBI 0x12,3
(0208) PORTD &=0b11110111;
02B8 B382 IN R24,0x12
02B9 7F87 ANDI R24,0xF7
02BA BB82 OUT 0x12,R24
02BB 9543 INC R20
02BC 3048 CPI R20,0x8
02BD F370 BCS 0x02AC
02BE D1D9 RCALL pop_gset2
02BF 9508 RET
_Screen_send:
i --> R20
02C0 D1E1 RCALL push_gset1
(0209) }
(0210) }
(0211) void Screen_send(void)
(0212) {
(0213) char i;
(0214) PORTD &= 0b11101111; //送RCK信号,底电平
02C1 B382 IN R24,0x12
02C2 7E8F ANDI R24,0xEF
02C3 BB82 OUT 0x12,R24
(0215) for(i =0;i <8;i++)
02C4 2744 CLR R20
02C5 C007 RJMP 0x02CD
(0216) {
(0217) SPI_data_send(DispTemp[i]);
02C6 EF8B LDI R24,0xFB
02C7 E092 LDI R25,2
02C8 940E053A CALL 0x53A
02CA 8100 LDD R16,Z+0
02CB DFDC RCALL _SPI_data_send
02CC 9543 INC R20
02CD 3048 CPI R20,0x8
02CE F3B8 BCS 0x02C6
(0218) }
(0219) PORTD |= 0b00010000; //关闭RCK信号,高电平
02CF 9A94 SBI 0x12,4
02D0 D1D4 RCALL pop_gset1
02D1 9508 RET
(0220)
(0221) }
(0222) /**************************************************
(0223) 数据接受,外部RAM读写
(0224) ****************************************************/
(0225) //写外部RAM
(0226) void RAM_Write(int adress,char data)
(0227) {
(0228) PORTD |=0B11100000; //关ALE 读关闭 写关闭
_RAM_Write:
data --> R18
adress --> R16
02D2 940E04F4 CALL <created procedures>
(0229) DDRA =0XFF;
(0230) PORTA =adress&0xff;
(0231) PORTC =(adress >>8)&0xff;
(0232) PORTD &=0b01111111;
(0233) PORTD &=0b10111111;
02D4 7B8F ANDI R24,0xBF
02D5 BB82 OUT 0x12,R24
(0234) PORTA =data;
02D6 BB2B OUT 0x1B,R18
02D7 9508 RET
(0235) }
(0236) //读外部RAM
(0237) char RAM_Read(int adress)
(0238) {
(0239) PORTD |=0B11100000; //关ALE 读关闭 写关闭
_RAM_Read:
adress --> R16
02D8 940E04F4 CALL <created procedures>
(0240) DDRA =0XFF;
(0241) PORTA =adress&0xff;
(0242) PORTC =(adress >>8)&0xff;
(0243) PORTD &=0b01111111;
(0244) PORTD &=0b11011111;
02DA 7D8F ANDI R24,0xDF
02DB BB82 OUT 0x12,R24
(0245) DDRA =0;
02DC 2422 CLR R2
02DD BA2A OUT 0x1A,R2
(0246) return PINA;
02DE B309 IN R16,0x19
02DF 9508 RET
_data_store:
data --> R20
02E0 D1C1 RCALL push_gset1
02E1 2F40 MOV R20,R16
(0247) }
(0248) //存储数据到外部RAM
(0249)
(0250) void data_store(char data)
(0251) {
(0252) if((data ==76) &&(FileEnd ==1)) //数据起始位检测
02E2 344C CPI R20,0x4C
02E3 F479 BNE 0x02F3
02E4 91800085 LDS R24,FileEnd
02E6 3081 CPI R24,1
02E7 F459 BNE 0x02F3
(0253) {
(0254) HeadEN =1; //开启头文件数据传输
02E8 E081 LDI R24,1
02E9 93800087 STS HeadEN,R24
(0255) HeadLoad =0; //头文件指针清零
02EB 2422 CLR R2
02EC 92200086 STS HeadLoad,R2
(0256) DataIndex =0; //存储数据指针清零
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -