以下是Proteus仿真截图:
以下是Studio6.2编译通过的截图:
程序清单:
- /*
- * GccApplication21.c
- *
- * Created: 2014-11-25 18:20:45
- * Author: Administrator
- */
- #define F_CPU 2000000UL
- #include <avr/io.h>
- #include <avr/interrupt.h>
- #include <util/delay.h>
- #include <stdint.h>
- #define COMM_8155 (uint8_t*)0xFD00 //命令字端口
- #define PA_8155 (uint8_t*)0xFD01 //PA端口地址
- #define PB_8155 (uint8_t*)0xFD02
- #define PC_8155 (uint8_t*)0xFC00
- #define CONT_8155_L8 (uint8_t*)0xFD04
- #define CONT_8155_H8 (uint8_t*)0xFD05
- #define PMEM_8155 (uint8_t*)0xFC00
- #define BEEP() PORTB ^= _BV(PB0)
- const uint8_t SEG_CODE[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xFF};
- uint8_t Disp_Buffer[4] = {10,3,5,0};
- volatile uint16_t cnt_8155 = 350;
- enum OP_Type{ADD,SUB};
- void Sounder()
- {
- uint8_t i;
- for(i = 0; i<50; i++)
- {
- BEEP();_delay_us(160);
- }
- }
- void Set_8155_TC()
- {
- *CONT_8155_L8 = (uint8_t)cnt_8155;
- *CONT_8155_H8 = (uint8_t)(cnt_8155>>8);
- *COMM_8155 = 0B11000011;
- }
- void adjust_tCount(enum OP_Type op)
- {
- uint8_t i;
- uint16_t cnt;
- cnt_8155=(op == ADD)? cnt_8155+50:cnt_8155 - 50;
- if(cnt_8155 > 500) cnt_8155 = 500;
- else if(cnt_8155 < 100) cnt_8155 = 100;
- cnt = cnt_8155;
- for(i=3;i>=1;i--)
- {
- Disp_Buffer[i] = cnt % 10;
- cnt /=10;
- }
- }
- void Key_Process()
- {
- uint8_t i;
- static uint8_t Pre_Key_State = 0xFF;
- uint8_t curr_Key_State = * PC_8155 | 0xF0;
- if(Pre_Key_State == curr_Key_State)return;
- Pre_Key_State = curr_Key_State;
- switch(curr_Key_State)
- {
- case (uint8_t)~_BV(0):
- adjust_tCount(ADD);
- break;
- case (uint8_t)~_BV(1):
- adjust_tCount(SUB);
- break;
- case (uint8_t)~_BV(2):
- Set_8155_TC();
- break;
- case (uint8_t)~_BV(3):
- for(i=0;i<=100;i++)
- {
- *(PMEM_8155 +i) = i;
- }
- break;
- }
- }
- int main(void)
- {
- uint8_t i;
- DDRA = 0xFF;
- DDRB = 0xFF;
- DDRC = 0xFF;
- DDRD = 0x00; PORTD = 0xFF;
- MCUCR = 0x82;
- *COMM_8155 = 0B00000011;
- GICR = _BV(INT0);
- sei();
- while(1)
- {
- for(i = 0;i<4;i++)
- {
- *PB_8155 = 0x00;
- *PA_8155 = SEG_CODE[Disp_Buffer[i]];
- *PB_8155 = _BV(7-i);
- _delay_ms(4);
- Key_Process();
- }
- }
- }
- ISR(INT0_vect)
- {
- Sounder();
- Set_8155_TC();
- }
|