#include
IC.h>
__CONFIG(0x3B31);
#define A0 RB0
#define A1 RB1
#define CS RB2
#define LE RD0
#define WR RD6
#define RD RD7
const unsigned char tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff};//0-F-全灭-共阳极数码管
unsigned char tmp[]={0,0,0,0,0,0,0,0};
void delay1ms(unsigned int x)
{
unsigned char i;
for(;x>0;x--)
for(i=0;i<165;i++);
}
void init()
{
TRISB=0x00;
PORTB=0x00;
TRISD=0x00;
PORTD=0x00;
LE=0;WR=1;RD=1; //关373,禁止8255读写
}
void init_8255()
{
LE=1;A1=1;A0=1;CS=0; //开373,发送写控制器命令,CS片选允许
LE=0; //锁住373,保持A1.A0,CS
PORTB=0x80; //发送控制命令
WR=0; //打开写入8255信号
NOP();NOP();
}
void write_data(unsigned char comm,unsigned char data) //comm:0=A,1=B,2=C
{
if(comm==0)
{
WR=1;
LE=1;A1=0;A0=0;CS=0;
LE=0;
PORTB=data;
WR=0;
NOP();NOP();
}
if(comm==1)
{
WR=1;
LE=1;A1=0;A0=1;CS=0;
LE=0;
PORTB=data;
WR=0;
NOP();NOP();
}
if(comm==2)
{
WR=1;
LE=1;A1=1;A0=0;CS=0;
LE=0;
PORTB=data;
WR=0;
NOP();NOP();
}
}
void display()
{
unsigned char i,LED;
LED=0x01;
for(i=0;i<8;i++)
{
write_data(0,tab[tmp[i]]);
write_data(1,LED);
LED<<=1;
delay1ms(2);
write_data(1,0x00);
}
}
void main()
{
unsigned char i,j,RR[24];
init();
init_8255();
while(1)
{
for(i=0;i<24;i++) //全部赋值为16,即显示为空,此处可精减,但演示用无所谓了
RR[i]=16;
RR[8]=2;RR[9]=0;RR[10]=0;RR[11]=9;RR[12]=0;RR[13]=7;RR[14]=1;RR[15]=2;
for(j=0;j<16;j++)
{
for(i=0;i<8;i++) //将RR[16]开始内部赋值tmp[]
tmp[i]=RR[16+i];
for(i=0;i<23;i++)
display();
for(i=23;i>0;i--) //此处将RR[]右移一位数组
RR[i+1]=RR[i];
}
}
}
关键字:PIC单片机 扩展8255A并口
引用地址:
PIC单片机扩展8255A并口
推荐阅读最新更新时间:2024-03-16 15:48
PIC单片机中断服务程序
中断服务程序有一个特殊的定义方法: void interrupt ISR(void);其中的函数名“ISR”可以改成任意合法的字母或数字组合,但其入口参数和返回参数类型必须是“void”型,亦即没有入口参数和返回参数,且中间必须有一个关键词“interrupt”。 中断函数可以被放置在原程序的任意位置。因为已有关键词“interrupt”声明,PICC 在最后进行代码连接时会自动将其定位到0x0004 中断入口处,实现中断服务响应。编译器也会实现中断函数的返回指令“retfie”。 一个简单的中断服务示范函数如下: void interrupt ISR(void) //中断服务程序 { if (T0IE && T0IF)
[单片机]
刚学PIC单片机,分享第一个电子时钟,定时器计时
#define _XTAL_FREQ 4000000 //晶振定义 #include pic.h //头文件包含 //__CONFIG(0x3b31);//芯片配置字定义 // CONFIG1 #pragma config FOSC = XT // Oscillator Selection bits (XT oscillator: Crystal/resonator on RA6/OSC2/CLKOUT and RA7/OSC1/CLKIN) #pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled and can be enabled
[单片机]
PIC单片机与AD5410芯片控制系统输出4-20mA电流信号的设计
仪表、传感器输出的电流信号多为4-20mA,为什么是4-20mA呢?因为4-20mA的传感器多为两线制,即信号线和电源线公用两根线,如果起点是0mA就这导致无法区分信号是0mA,还是传感器不工作;另外,起点是4mA也利于系统判断传感器是否掉电或者是短线。 那4-20mA的电流信号该如何产生呢,在数字电路高度发展的今天以单片机为核心的系统比比皆是,但是单片机是数字信号,而电流是模拟信号,这就需要用到DA转换,即数字信号转换为模拟信号。 目前,单片机要控制系统输出4-20mA的电流信号的常用方案为: 今天要推荐一款芯片:AD5410,该芯片是ANGLOG DEVICE生产的,单通道12位串行输入的DAC芯片,与单片机的通信方式
[单片机]
PIC单片机模拟异步串行通讯UART源程序
简介:用TMR0实现定时查询。任何带中断的PIC上都可以实现。可用此法扩展多个串口。 ;|--------------------------------------------------------------| ;| Implement duplex USART base on normal I/O pin | ;| Using TIMER0 interrupt for bit timing | ;| Tested on PIC16F83 running at 4MHz | ;| Written by Paul Zhang, Microchip Tech Inc
[单片机]
PIC单片机软件异步串行口实现方法
在用单片机开发各种嵌入式应用系统时,异步串行通信是经常要用到的一种通信模式,很多应用中还要求实现多路异步串行通信。大家平时熟悉的各种厂家的单片机,绝大部分片上只提供一个硬件UART模块,利用它可以方便实现一路串行通讯。PIC系列单片机也不例外,在其丰富的产品家族成员中,除高端系列(PIC17/18)一些型号片上带有两路硬件UART模块外,其它大部分型号片上只有一路UART,一些低端廉价的PIC单片机甚至还不带硬件UART。为了提高系统的性能价格比,就要求设计工程师用软件增加实现一路或多路异步串行通信。很多工程师对用软件实现的UART在可靠性和效率方面持怀疑态度,其实关键问题是看软件采用何种方式来实现可靠的UART功能。 在
[单片机]
有关PIC单片机在线编程器、在线仿真器的问题
有关PIC单片机在线编程器、在线仿真器的问题 1.1在线串行编程接口 带有Flash闪速存储器的PIC单片机产品一般都具有在线串行编程功能,只需要5根引线就可以把程序下载到单片机的Flash程序存储器中。这5根线的排列顺序是MCLR/Vpp、Vdd、Vss、PD(或PGD)和PC(或PGC)。 1.2引脚含义 上述5根引线的具体含义是:MCLR/Vpp 编程电压(对于PIC单片机一般为13 V左右);Vdd 编程电源(5 V);Vss 地;PD 编程数据信号;PC 编程时钟信号。有了这个编程连接电路,只需要合适的编程硬件电路和编程软件,就可以实现单片机在线串行编程和调试。 2 在线调试器 2.1在线调试器与目标板的
[单片机]
DS18B20和PIC单片机通讯源程序
ORG PIC54 GOTO MAIN ORG 0 ;---------------------- ;---------------------------- DELAY22 MOVLW D'200' ; DELAY 2*250=500mS MOVWF COUNT1 DE32 MOVLW D'250' ; 8*250=2mS MOVWF COUNT2 DE42 NOP ; 1+2+1=5uS DECFSZ COUNT2,1 GOTO DE42 DECF
[单片机]
PIC单片机4×4行列式键盘的工作原理解析
在本文中,小编将对pic单片机的4×4行列式键盘的工作原理加以介绍,以帮助大家增进对pic单片机键盘系统的了解,方便后期编程使用。 (1)单片机系统键盘原理 行列式键盘的接法比独立式键盘的接法复杂,编程实现上也会比较复杂。但是,在占用相同的I/O端口的情况下,行列式键盘的接法会比独立式接法允许的按键数量多,其原理图如图1所示。 图1 4×4行列式键盘的原理图 实际的工程中,可能会使用PIC16C5X这种通用的可编程的键盘、显示接口器件,使用PIC16C5X单片器件就能够完成键盘输入和显示控制两种功能。 行列式键盘的工作方式是先用列线发送扫描字,然后读取行线的状态,查看是否有按键按下。键盘部分提供一种扫描的工作方式,可以
[单片机]