本例通过8255接口扩展芯片控制8只集成式七段数码管。PC口增加3个按键。
8255的3个I/O端口和一个命令端口的定义。由于8255的接口地址仅需要单片机地址端口的高8位控制,这8位地十中实际仅使用的低3位,它们分别对应CS、A1、A0,其中A1与A0地址线可选择8255的4个端口地址之一。
Atmel Studio6.2的截图:
程序清单:
- /*
- * GccApplication20.c
- *
- * Created: 2014-11-21 21:19:28
- * Author: Administrator
- */
- /*
- * GccApplication1.c
- *
- * Created: 2014-11-21 6:15:19
- * Author: Administrator
- */
- #define F_CPU 2000000UL
- #include <avr/io.h>
- #include <avr/interrupt.h>
- #include <util/delay.h>
- #include <stdint.h>
- #define PA (uint8_t*)0xFF00
- #define PB (uint8_t*)0xFF01
- #define PC (uint8_t*)0xFF02
- #define COM (uint8_t*)0xFF03
- const uint8_t SEG_CODE[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};
- uint8_t Disp_Buffer[] = {1,2,10,3,0,5,0};
- uint8_t Pre_Key_State = 0x00;
- void Key_Process()
- {
- uint8_t Key_State,t;
- Key_State = *PC;
- if(Key_State==Pre_Key_State)return;
- Pre_Key_State = Key_State;
- switch(Key_State)
- {
- case(uint8_t)~_BV(0):
- t = Disp_Buffer[0] * 10 + Disp_Buffer[1];
- if(++t == 24) t = 0;
- Disp_Buffer[0] = t/10;
- Disp_Buffer[1] = t%10;
- break;
- case (uint8_t)~_BV(2):
- t = Disp_Buffer[3] * 10 + Disp_Buffer[4];
- if(++t == 60) t = 1;
- Disp_Buffer[3] = t /10;
- Disp_Buffer[4] = t % 10;
- break;
- case (uint8_t)~_BV(4):
- t = Disp_Buffer[6] * 10 + Disp_Buffer[7];
- if( ++t == 60) t=1;
- Disp_Buffer[6] = t /10;
- Disp_Buffer[7] = t %10;
- break;
- default:
- break;
- }
- }
- int main(void)
- {
- uint8_t i;
- MCUCR |= 0x80;
- * COM = 0B10001001; //8255工作方式选择
- while(1)
- {
- for(i=0;i<8;i++)
- {
- *PB = _BV(i);
- *PA = (uint8_t)SEG_CODE[Disp_Buffer[i]];
- _delay_ms(2);
- Key_Process();
- }
- //TODO:: Please write your application code
- }
- }
|