我用8279做了一个数控电路源的赛题,但是我在protues中老是仿真不出来
为什么呢?请各路高手指点指点。
原理图:
调试的程序:为了调试,我只发送命令字,没有进行进一步的操作,但是,就发送命令都没有仿真成功,我就纳闷了;
#include "reg52.h"
#define data8279 0x4000 //a0=0,data 地址,~cs=0 A0=0 读写数据
#define comand8279 0x4001 //a0=1,COMMEND 地址 ~cs=0,A0=1发送命令,读取状态字
#define writeadd0832 0x8000 //DA0832的地址,
#define uchar unsigned char
#define uint unsigned int
uchar keydata[16]={0xc0,0xc1,0xc2,0xc3,0xc8,0xc9,0xca,0xcb,0xd0,0xd1,0xd2,0xd3,0xd8,0xd9,0xda,0xdb};
uchar key;
void Delay() //DELAY FOR A MONENT
{
uint i;
for(i=0;i<200;i++);
}
void SendCom(uchar c8279com) //1.send commend 发送命令,c8279com是命令字
{
*((uchar xdata *)comand8279)=c8279com; // (uchar xdata *)P8279A强行把数据转换成指向外部RAM储存地址为P8279的单元的指针,*((uchar xdata *)P8279A)就是给外部RAM储存地址为P8279的单元赋值
Delay(); //千万注意,一定要延时!!延短点都不行
}
void SendData(uchar c8279data) //2.send data 发送数据 c8279data是数据,显示数据
{
*((uchar xdata *)data8279)=c8279data;
Delay();
}
uchar GetState() //读取状态字
{
return*((uchar xdata *)comand8279);
}
uchar GetData() //3.return data 读取按键值, 返回按键值
{
return*((uchar xdata *)data8279);
}
void isr_int() interrupt 0 //4.intreeup for push key ;
{
SendCom(0xdf); //清屏 110 1 1111 同时键盘值也清零 显示RAM置一 为什么要清零呢???????????
SendCom(0x40); //发出读键盘命令 010 0 0000
key="GetData"(); //读键盘
switch(key)
{
case 0xc0:SendCom(0x80); SendData(0x3f);break;
case 0xc1:SendCom(0x80); SendData(0x06);break;
case 0xc2:SendCom(0x80); SendData(0x5b);break;
case 0xc3:SendCom(0x80); SendData(0x4f);break;
case 0xc8:SendCom(0x80); SendData(0x66);break;
case 0xc9:SendCom(0x80); SendData(0x6d);break;
case 0xca:SendCom(0x80); SendData(0x7d);break;
case 0xcb:SendCom(0x80); SendData(0x07);break;
case 0xd0:SendCom(0x80); SendData(0x7f);break;
case 0xd1:SendCom(0x80); SendData(0x6f);break;
case 0xd2:SendCom(0x80); SendData(0x77);break;
case 0xd3:SendCom(0x80); SendData(0x7c);break;
case 0xd8:SendCom(0x80); SendData(0x39);break;
case 0xd9:SendCom(0x80); SendData(0x5e);break;
case 0xda:SendCom(0x80); SendData(0x79);break;
case 0xdb:SendCom(0x80); SendData(0x71);break;
default: SendCom(0xdf);break;
}
/****************
if(key<0x0f) //这里按顺序接了16个键,返回的键盘码为0~0X0F
{
// SendCom(0x80); //100 0 0000 发送读显示RAM命令
// SendData(key); //把按键值发送给显示RAM
key="key"<<4; //因为显示输出接8279AOUT脚,需要移位。
SendCom(0x83); //1000 0011这是读取显示RAM而不是写啊???? 写显示RAM命令:011 0 0011 应该是63吧??? 写LED命令,在第三个数码管上显示
SendData(key); //写LED显示内容
}
else
SendCom(0xd3); //如果按了最后一个键0X0F,就全屏显示0
*****************/
}
void init_main()
{
P0=0XFF;
P1=0XFF;
P2=0XFF;
P3=0XFF;
Delay();
IT0=1; //外部中断0时促发方式,跳沿触发方式,
IE0=1; //外部中断0中断请求标志位,下降沿触发,使IE0置1,申请中断,硬件清零。一般IE0=0
EX0=1; //允许外部中断0申请中断,中断允许位
EA=1; //总中断允许位
}
main()
{
init_main();
SendCom(0x00); //初始化 键盘 显示方式命令字000,如没有特别要求,一般都 以这样初始化“0X00”8位左输入,编码扫描双键锁定
SendCom(0x22); //时钟命令字 001 分频10外部CLK分频 0010 1010
SendCom(0xdf); //清除命令,110 101 1 1 显示RAM全部置10。键盘RAM 清空 清屏,数据输出0X00到OUTA,
while(1);
}
仿真结果
仿真的时候,8279的状态居然没变!
显示RAM根本就没有清零!
为什么啊?
xucun915_925777961 2009-8-26 10:18