/*
在C51中通過總線地址來寫總線上的器件
如:
#define CTRL8255A XBYTE[0x7f00]
要寫的話就用:
CTRL8255A=0x0d; 即可。
而如今ATmega大多沒有總線,寫這些器件就得自已動(dòng)手了。
ATmega8L 模擬總線 控制 8255A
環(huán)境 ATmega8L GCC PROTEUS6.7
作者 zhb2000
執(zhí)行效果 ATmega8L通過8255A的A口控制2個(gè)數(shù)碼管循環(huán)顯示0~ff.
*/
#include <avr/io.h>
#include <avr/delay.h>
#define uchar unsigned char
#define uint unsigned int
#define sbi(sfr,bit) (sfr|=(1<<bit))
#define cbi(sfr,bit) (sfr&=~(1<<bit))
#define CS_8255A 4
void init(void);
void ctrl8255a(uchar ctrl); //寫8255a控制字
void wa_8255a(uchar value); //寫8255a的A口
int main(void)
{
uchar i=0;
init();
while(1)
{
wa_8255a(i);
_delay_ms(200);
++i;
}
return 0;
}
void init(void)
{
PORTB=0xff;
PORTC=0xff;
PORTD=0xff;
DDRB=0xff;
DDRC=0xff;
DDRD=0xff;
ctrl8255a(0x80); //ABC口方式0輸出
}
void ctrl8255a(uchar ctrl)
{
PORTD=0x0d; //選擇寫控制字
PORTB=ctrl;
sbi(PORTD,CS_8255A); //不選8255A
}
void wa_8255a(uchar value)
{ //寫值到8255A的A口
PORTD=0x01; //寫8255A的A口
PORTB=value;
sbi(PORTD,CS_8255A); //不選8255A
}
全部代碼及PROTEUS6.7仿真例子:
程式執(zhí)行如下圖:
