基于51和Protues仿真的82C55A 软件模拟读写时序
来源:互联网 发布:护士网络注册 编辑:程序博客网 时间:2024/06/05 02:09
仿真图:
源代码:
/*************** writer:shopping.w ******************/#include <reg52.h>#include <absacc.h>#define uint unsigned int#define uchar unsigned char//#define PA XBYTE[0x0000] //#define PB XBYTE[0x0001]//#define PC XBYTE[0x0002]//#define COM XBYTE[0x0003]#define ADDR_CMD 0x03#define ADDR_A_PORT 0x00#define ADDR_B_PORT 0x01#define ADDR_C_PORT 0x02#define C_PORT_LOW_IN_CMD (0x01<<0)#define C_PORT_LOW_OUT_CMD (~(0x01<<0))#define B_PORT_IN_CMD (0x01<<1)#define B_PORT_OUT_CMD (~(0x01<<1))#define C_PORT_UP_IN_CMD (0x01<<3)#define C_PORT_UP_OUT_CMD (~(0x01<<3))#define A_PORT_IN_CMD (0x01<<4)#define A_PORT_OUT_CMD (~(0x01<<4))#define _LE_L (_LE = 0)#define _LE_H (_LE = 1)#define _WR_L (_WR = 0)#define _WR_H (_WR = 1)#define _RD_L (_RD = 0)#define _RD_H (_RD = 1)#define _CS_L (_CS = 0)#define _CS_H (_CS = 1)sbit _LE = P2^7;sbit _WR = P2^5;sbit _RD = P2^6;sbit _CS = P2^4;uchar code DSY_CODE_Queue[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};uchar code DSY_Index[]={ 0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};void WriteData8255(uchar addr, uchar dat);uchar ReadData8255(uchar addr);void Delay(uint x){ uchar i;while(x--){ for(i=0;i<120;i++);}}void WriteData8255(uchar addr, uchar dat){_CS_H; _WR_H; _RD_H; _LE_H; Delay(10); _CS_L; P0 = addr; Delay(10); _LE_L; //锁存地址 P3 = dat; Delay(10); _WR_L; Delay(10); _WR_H; Delay(10); _CS = 1;}uchar ReadData8255(uchar addr){ uchar rval = 0; _CS_H;_WR_H;_RD_H;_LE_H;Delay(10);_CS_L;P0 = addr;Delay(10);_LE_L; //锁存地址_RD_L; //启动读信号 P3 = 0xff; //在置位后才能去读rval = P3; Delay(10);_RD_H;Delay(10);_CS_H; return rval;}void main(){uchar value = 0;uchar i,j,k;#if 1_CS = 1;_WR = 1;_RD = 1;//写控制字寄存器地址_LE = 1;Delay(10);_CS = 0;P0 = ADDR_CMD; //A1A0=11,CS=0,写控制字Delay(10);_LE = 0; //锁存器锁定地址P3 = 0x80; //PA,PB,PC全输出(方式选择)Delay(10);_WR = 0;Delay(10);_WR = 1;Delay(10);_CS = 1;#endif WriteData8255(ADDR_CMD, 0x80); //配置8255工作在MOD0模式,PA,PB,PC全输出。 while(1){#if 1 for(k=0;k<8;k++){WriteData8255(ADDR_C_PORT, DSY_Index[k]);WriteData8255(ADDR_A_PORT, DSY_CODE_Queue[k]);///*写B端口数据,A1,A0 = 2'b01*///_CS = 1;//_WR = 1;//_RD = 1;//// _LE = 1;//Delay(10);//_CS = 0;//P0 = ADDR_C_PORT; //Delay(10);//_LE = 0;// P3 = DSY_Index[k];// Delay(10); //_WR = 0;//Delay(10);//_WR = 1;//Delay(10);//_CS = 1;//Delay(10);//// /*写A端口数据,A1,A0 = 2'b00*///_CS = 1;//_WR = 1;//_RD = 1;////_LE = 1;//Delay(10);//_CS = 0;//P0 = ADDR_A_PORT;//Delay(10);//_LE = 0;//P3 = DSY_CODE_Queue[k]; //PA//Delay(10);//_WR = 0;//Delay(10);//_WR = 1;//Delay(10);//_CS = 1;Delay(200);}#endif//_CS = 1;//_WR = 1;//_RD = 1;////写控制字寄存器地址//_LE = 1;//Delay(10);//_CS = 0;//P0 = ADDR_CMD; //A1A0=11,CS=0,写控制字//Delay(10);//_LE = 0;//P3 = 0x82; //PB输入,PA,PC输出(方式选择)//Delay(10);//_WR = 0;//Delay(10);//_WR = 1;//Delay(10);//_CS = 1; WriteData8255(ADDR_CMD, 0x82); //PB输入,PA,PC输出(方式选择) // while(1);// /*读B端口数据,A1,A0 = 2'b02*/// _CS = 1;//_WR = 1;//_RD = 1;// //_LE = 1;//Delay(10);//_CS = 0;//P0 = ADDR_B_PORT;//Delay(10);//_LE = 0;//_RD = 0;//P3 = 0xff; //在置位后才能去读//value = P3; //读取PB的值//Delay(10);//_RD = 1;//Delay(10);//_CS = 1;value = ReadData8255(ADDR_B_PORT);P1 = value; //将读取到的值赋值给P1Delay(200);while(1);}}
阅读全文
0 0
- 基于51和Protues仿真的82C55A 软件模拟读写时序
- 虚拟串口与PROTUES软件的仿真
- protues 51仿真的一个好博客
- 悲剧的protues仿真
- STC单片机的protues仿真
- protues中LM032的仿真
- 关于win7下protues(单片机模拟软件)的自动退出问题
- 模拟和仿真的区别
- 模拟和仿真的区别
- ModelSim-Altera功能仿真和时序仿真
- protues与keil联合仿真51单片机跑马灯实例
- 软件模拟写SPI时序
- GPIO软件模拟IIC时序
- S3C2440的读写时序
- 使用keil & protues 进行仿真
- 基于AVR模拟I2S时序的原理分析
- Keil4和Protues联调的做法
- 基于51单片机实现模拟IIC总线时序
- Xamarin.Forms 用户界面——控件——DataPages——控件参考
- uboot 移植学习过程遇到问题的解决方法
- matlab批量创建变量并赋值
- UML类图
- 四.python 对象类型之列表、元组
- 基于51和Protues仿真的82C55A 软件模拟读写时序
- 用java构建一个优先队列
- exists关键词和case表达式
- Linux下Redis安装笔记
- 【springmvc】传值的几种方式&&postman接口测试
- tensorflow 核心流程剖析 1-- 简介
- 数组中重复的个数
- 南京邮电CTF 后面的几个WEB题目 By Assassinh
- slf4j、jcl、jul、log4j1、log4j2、logback大总结