📄 yunying.c
字号:
#include "yunying.h"
#define dat XBYTE[0x0000]
void delay(unsigned char time) /*延时函数*/
{
unsigned char i,j;
for(i=0;i<time;i++)
for(j=0;j<10;j++);
}
unsigned char receive() /*接收函数 */
{
unsigned char i;
unsigned char t;
unsigned char rev=0x00;
unsigned char con_or_dat=0x15; //0x15:读指令
cs=0; //片选,读键值
clk=0;
delay(1);
for(i=0;i<8;i++)
{
if((con_or_dat&0x80)==0x80) //发送读命令
dio=1;
else
dio=0;
clk=1;
delay(1);
clk=0;
con_or_dat =con_or_dat<<1;
delay(2);
}
dio=1;
for(t=0;t<8;t++) //读键值
{
delay(1);
clk=1;
delay(1);
if(dio==1)
rev=rev|0x01;
rev =rev<<1;
clk=0;
delay(1);
}
dio=0;
cs=1;
return rev;
}
void externserver0(void) interrupt 0 /*外部中断服务程序*/
{
EX0 = 0; //关外部中断
ctr=0xff; //复位
ctr=(receive())>>1; //接收键值
}
void clockserver0(void) interrupt 1 /*定时器中断服务程序*/
{
TH0=0xff;
TL0=0xa6;
P0=0xff; //复位
oe=1; //ad输出使能
oe=1;
adin=P0; //将ad转换结果存入单片机
oe=0; //关闭ad输出
ad_start=1; //启动ad转换
ad_start=0;
P0=0xff; //复位
*p=adin; //写入ram
p++; //地址加
if(p==0xffff)
{
p=&dat; //地址赋初值
TR0=0;
sendcad(0xe0,61);
}
}
void clockserver1(void) interrupt 3
{
TH1=0xff;
TL1=0x9a;
P0=0xff; //复位
dac_cs=1;
dain=*p; //ram数据读出单片机
P0=dain; //写到da输入口
dac_cs=0; //da输出使能
p++; //地址加
if(p==0xffff)
{
p=&dat; //地址赋初值 可以循环赋值
}
}
void send(unsigned char con_or_dat) /*发送控制&数据函数*/
{
unsigned char i;
EX0=0; //关外部中断
cs = 0; //片选
delay(5);
clk=0;
for(i=0;i<8;i++)
{
if((con_or_dat&0x80)==0x80)
dio=1;
else
dio=0;
clk=1;
delay(1);
clk=0;
con_or_dat =con_or_dat<<1;
delay(1);
}
dio=0;
cs=1;
delay(2);
EX0=1; // 开外部中断
}
void sendcad(unsigned char con,unsigned char con_or_dat) /*发送控制&数据函数*/
{
unsigned char i;
EX0=0; //关外部中断
cs = 0;
delay(1);
clk=0;
for(i=0;i<8;i++) //发指令
{
if((con&0x80)==0x80)
dio=1;
else
dio=0;
clk=1;
delay(1);
clk=0;
con =con<<1;
delay(1);
}
for(i=0;i<8;i++) //发数据
{
if((con_or_dat&0x80)==0x80)
dio=1;
else
dio=0;
clk=1;
delay(1);
clk=0;
con_or_dat = con_or_dat<<1;
delay(1);
}
EX0=1;
cs=1;
}
void initial(void)
{
TMOD=0x11; //定时计数器0,定时计数器1 方式1
TH0=0xff;
TL0=0xa9; // 可以适当调整
TH0=0xff;
TL0=0x9a; //
cs=1; /*初始化*/
dio=1;
key=1;
clk = 0;
oe=0;
ad_start=0;
dac_cs=1;
delay(3);
IT0=1;
ET0 = 1; //开定时器中断0
EX0 = 1; //开外部中断
ET1 = 1; //开定时器中断1
EA = 1;
send(0xbf);
}
void main(void)
{
initial();
while(1)
{
switch(ctr)
{
case 0x0d: //写入ram
send(0xa4);
p=&dat; //地址赋初值
sendcad(0xe0,63);
TR0 =1; //开定时器0中断
ad_start=1;//启动AD转换
ad_start=0;
ctr=0xff;
EX0=1;
break;
case 0x0c: //从ram读出数据
send(0xa4);
p=&dat; //地址赋初值
sendcad(0xe0,60);
TR1=1; //开定时器1中断
ctr=0xff;
EX0=1;
break;
case 0x0e:
send(0xbf);
TR0=0; //关定时器0中断
TR1=0; //关定时器1中断
ctr=0xff;
EX0=1;
break;
default:
EX0 =1;
break;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -