打印
[Atmel]

用AtmelStudio6.2跑mega16例程(57)8255扩展

[复制链接]
891|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ddllxxrr|  楼主 | 2014-11-21 21:48 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

本例通过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
}
}

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:http://shop34182318.taobao.com/ http://shop562064536.taobao.com

2398

主题

6956

帖子

67

粉丝