📄 sram_cpld2.c
字号:
/*mcu向通过fpga控制ram,写入时候,给地址a0ff分两次先后送如1和0,fpga向ram写入一定数据
单片机从读数据时候,先向a0fe送入ram读取首地址,接着可以从此口读出数据
//*7218在硬件译码的时候,低四位数据进行译码,最高位控制小数点,其余三位无效*/
// distab保存要显示的8位数据(每一位为一个字节)
// ledtab为7218软件译码字型表 /dp,a,b,c,e,g,f,d
#include<reg52.h>
//#include<intrins.h>
#include<absacc.h>
#define DisCmd XBYTE [0xC100] //7218控制字地址
#define DisData XBYTE [0xC000] //7218数据口地址
#define scode 0xb0 //7218软件译码方式命令字
#define bcode 0x90 //B码译码方式命令字
#define hexcode 0xd0 //软件译码方式命令字
#define unchar unsigned char
sbit P3_0=P3^0;
sbit P1_0=P1^0;
bit enter=0;
unchar keynum; //按键号
unchar ledcursor=7; //保存光标当前位置
unchar distab[8]={0x12,0x13,0x14,0x00,0x12,0x12,0x0e,0x11} ; // 要显示的内容 hello-pp
unchar temp[8];
unchar code ledtab[]={ 0xfb,0xb0,0xed,0xf5,0xb6,0xd7,0xdf,0xf0,
//0, 1, 2, 3, 4, 5, 6, 7
0xff,0xf7,0xfe,0x9f,0xcb,0xbd,0xcf,0xce,
//8 9 ,a ,b c d e f
0x80,0xbe,0x8b,0xee,0x84,0xca,0xf6,0x00,
//灭 H L P - r q .
0xb7,0xbb,0xfa};
//y, u n
unchar add; // ram读取首地址
//***************************************************************************************
//void KeyprgF1(void){}
// void KeyprgF2(void ){}
//void KeyprgClear(void){}
//void KeyprgEnter(void){}
//***************************************************************************************
void display()
{
unchar i;
DisCmd=scode; //采用软件译码
for(i=0;i<8;i++) //将distab中的数据送如7218
{
DisData =ledtab[distab[i]]; //查表转化并将字型送入7218
}
}
//**************************************************************************************
void KeyprgF2() //在光标当前位置设置小数点
{
unchar i;
DisCmd=scode; //采用软件译码
for(i=0;i<8;i++) //将distab中的数据送如7218
{
if(i=ledcursor)
temp[i]=ledtab[distab[i]]+0x80;
temp[i]=ledtab[distab[i]]; //查表转化并将字型送入7218
DisData=temp[i];
}
}
//**************************************************************************************
void keyprg(unchar key) //键盘键值执行的程序
{
unchar i;
if((key<=9)&enter)
{
distab[ledcursor]=keynum; //键值送入distab最低位保存
if(ledcursor>0) //光标移位
ledcursor--;
else
ledcursor=7;
display(); //显示键值
}
else
{
switch(key)
{
case 0x0D: //加
if(distab[ledcursor]<0x09)
distab[ledcursor]++;
else
distab[ledcursor]=0;
display(); //显示键值
break;
case 0x0E: //减
if(distab[ledcursor]>0)
distab[ledcursor]--;
else
distab[ledcursor]=9;
display(); //显示键值
break;
case 0x0A: //KeyprgF1();
for(i=0;i<8;i++) //将distab中的数据送如7218
{
distab[i]=0;
}
ledcursor=7;
display(); //显示键值
break;
case 0x0B: //功能键F2
KeyprgF2();
break;
case 0x0C: //KeyprgBack();
if(ledcursor<7) //光标移位
ledcursor++;
else
ledcursor=0;
display(); //显示键值
break;
case 0x0F: //KeyprgEnter();
enter=!enter;
display(); //显示键值
break;
default:
break;
}
}
}
//**************************************************************************************
void intt0() interrupt 0
{
unchar xdata *cpld;
// unchar i;
EX0=0; //关键盘中断,禁止相应其他按键
keynum=P1; //从p1口读入键盘值
keynum=keynum&0x0f; //取低四位;
// keyprg(keynum);
if(keynum==0x0d) //地址加一
{
add+=10;
distab[7]=add/100;
distab[6]=(add%100)/10;
distab[5]=(add%100)%10;
distab[4]=0x10;
distab[3]=0x10;
display();
}
if(keynum==0x0e) //地址减一
{
add-=10;
distab[7]=add/100;
distab[6]=(add%100)/10;
distab[5]=(add%100)%10;
distab[4]=0x10;
distab[3]=0x10;
display();
}
if(keynum==0x0a) //F1,写数据
{
distab[7]=0x10;
distab[6]=0x10;
distab[5]=0x10;
distab[4]=0x10;
distab[3]=0x10;
distab[2]=0x0e;
distab[1]=0x1a;
distab[0]=0x0d;
cpld=0xa0ff;
*cpld=1;
*cpld=0;
display();
}
if(keynum==0x0b) //送入首地址
{
distab[7]=add/100;
distab[6]=(add%100)/10;
distab[5]=(add%100)%10;
distab[4]=0x10;
distab[3]=0x10;
cpld=0xA0fe;
*cpld=add;
display();
}
if(keynum==0x0f) //enter读入一个数据
{
cpld=0x2000+add;
//*cpld=add;
distab[2]=(*cpld)/100;
distab[1]=((*cpld)%100)/10;
distab[0]=((*cpld)%100)%10;
display();
}
EX0=1;
}
void main()
{
EX0=1;
EA=1;
display();
while(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -