📄 24c02的读写asm.txt
字号:
uint j;
for(i;i>0;i--)
{
for(j=164;j>0;j--)
;
}
}
//**********************************************************
//延时
void delay(uint delay)
{
while(delay>0)
delay--;
}
//**********************************************************
//检测按键是否释放
void waitkey(void)
{
temp=P2;
temp=temp&0x0f;
while(temp!=0x0f)
{
temp=P2;
temp=temp&0x0f;
}
}
//**********************************************************
//按测键盘,查出键号
void keyscan(void)
{
uchar key;
P2=0xff;
P24=0;
temp=P2;
temp=temp&0x0f;
if(temp!=0x0f)
{
delaynms(20);
temp=P2;
temp=temp&0x0f;
if(temp!=0x0f)
{
temp=P2;
temp=temp&0x0f;
switch(temp)
{
case 0x0e:
key=0x00;
break;
case 0x0d:
key=0x01;
break;
case 0x0b:
key=0x02;
break;
case 0x07:
key=0x03;
break;
}
}
}
waitkey();
keyvalue=key;
P2=0xff;
P25=0;
temp=P2;
temp=temp&0x0f;
if(temp!=0x0f)
{
delaynms(20);
temp=P2;
temp=temp&0x0f;
if(temp!=0x0f)
{
temp=P2;
temp=temp&0x0f;
switch(temp)
{
case 0x0e:
key=0x04;
break;
case 0x0d:
key=0x05;
break;
case 0x0b:
key=0x06;
break;
case 0x07:
key=0x07;
break;
}
}
}
waitkey();
keyvalue=key;
P2=0xff;
P26=0;
temp=P2;
temp=temp&0x0f;
if(temp!=0x0f)
{
delaynms(20);
temp=P2;
temp=temp&0x0f;
if(temp!=0x0f)
{
temp=P2;
temp=temp&0x0f;
switch(temp)
{
case 0x0e:
key=0x08;
break;
case 0x0d:
key=0x09;
break;
case 0x0b:
key=0x0a;
break;
case 0x07:
key=0x0b;
break;
}
}
}
waitkey();
keyvalue=key;
P2=0xff;
P27=0;
temp=P2;
temp=temp&0x0f;
if(temp!=0x0f)
{
delaynms(20);
temp=P2;
temp=temp&0x0f;
if(temp!=0x0f)
{
temp=P2;
temp=temp&0x0f;
switch(temp)
{
case 0x0e:
key=0x0c;
break;
case 0x0d:
key=0x0d;
break;
case 0x0b:
key=0x0e;
break;
case 0x07:
key=0x0f;
break;
}
}
}
waitkey();
keyvalue=key;
}
//////////////////////////////////////////////////
//74138译码器,输出数码管位选信号
//////////////////////////////////////////////////
void sel74_138(uchar input)
{
switch(input)
{
case 7:
P04=1;
P05=1;
P06=1;
break;
case 6:
P04=0;
P05=1;
P06=1;
break;
case 5:
P04=1;
P05=0;
P06=1;
break;
case 4:
P04=0;
P05=0;
P06=1;
break;
case 3:
P04=1;
P05=1;
P06=0;
break;
case 2:
P04=0;
P05=1;
P06=0;
break;
case 1:
P04=1;
P05=0;
P06=0;
break;
case 0:
P04=0;
P05=0;
P06=0;
break;
default:
break;
}
}
//***********************************************************
//显示函数
void display()
{
P0=disbuff[0];
sel74_138(0);
delaynms(3);
P0=disbuff[1];
sel74_138(1);
delaynms(3);
P0=disbuff[2];
sel74_138(2);
delaynms(3);
P0=disbuff[3];
sel74_138(3);
delaynms(3);
P0=disbuff[4];
sel74_138(4);
delaynms(3);
P0=disbuff[5];
sel74_138(5);
delaynms(3);
P0=disbuff[6];
sel74_138(6);
delaynms(3);
P0=disbuff[7];
sel74_138(7);
delaynms(3);
}
//***********************************************************
//启动总线信号
void start(void)
{
scl=0;
sda=1;
_nop_();
scl=1;
delay(4);
sda=0;
delay(4);
scl=0;
}
//***********************************************************
//停止总线信号
void stop(void)
{
scl=0;
sda=0;
_nop_();
scl=1;
delay(4);
sda=1;
delay(4);
}
//***********************************************************
//发送应答信号,发送或接收完8BIT(8T)后在第9个脉冲周期开始(低电平)
//期间由主机将SDA置低
void sendack(void)
{
sda=0;
_nop_();
scl=1;
delay(4);
scl=0;
delay(4);
}
//*************************************************************
//发送非应答信号,和应答信号刚好相反
void sendnack(void)
{
sda=1;
_nop_();
scl=0;
delay(4);
scl=1;
delay(4);
}
//*************************************************************
//检测应答信号
bit checkack(void)
{
bit flag;
sda=1;
scl=1;
delay(4);
flag=sda;//检测SDA状态,看是否接收到应答信号
scl=0;//将SCL拉低,以备对SDA状态进行改变
if(flag==1)
return(FLASE);
else
return(TRUE);
}
//**************************************************************
//发送一个BIT "1"
void send1(void)
{
sda=1;
scl=1;
delay(4);
scl=0;
delay(4);
sda=0;
}
//**************************************************************
//发送一个BIT"0"
void send0(void)
{
sda=0;
scl=1;
delay(4);
scl=0;
delay(4);
}
//**************************************************************
//向IIC总线上写入一个字节数据
void writeonebyte(uchar b)
{
uchar k;
for(k=0;k<8;k++)
{
if((b<<k)&0x80)
send1();
else
send0();
}
}
//**************************************************************
//从IIC总线上读取一个字节数据
uchar readonebyte(void)
{
uchar m,receiveonebyte=0;
for(m=0;m<8;m++)
{
sda=1;
scl=1;
delay(4);
receiveonebyte=receiveonebyte<<1;
receiveonebyte=receiveonebyte|((uchar)(sda));
scl=0;
}
return(receiveonebyte);
}
//***************************************************************
//向IIC总线上写入N个字节数据
//入口参数:divesadrw--器件地址,romadr--器件内部寻址字节地址
//*p--指向待发送的数据缓冲区首址,y--待发送的数据字节数
void writenbyte(uchar *p,uchar divesadrw,uchar romadr,uchar y)
{
bit ack;
do
{
start(); //启动IIC总线
writeonebyte(divesadrw);//发送器件地址
ack=checkack();
}while(ack==0);
do
{
writeonebyte(romadr);//发送器件内部寻址字节地址
ack=checkack();
}while(ack==0);
for(;y!=0;y--) //发送数据
{
again:writeonebyte(*p);
ack=checkack(); //检测应答
if(ack==0)
goto again; //如果错误,则再发一次
else
p++;
continue;
}
stop();
P1=0x55;
}
//****************************************************************
//从IIC总线上读N个字节数据
//入口参数:divesadrw--器件地址,romadr--器件内部寻址字节地址
//divecadrr--器件地址,p--待接收的数据字节数
void readnbyte(uchar divesadrw,uchar romadr,uchar divesadrr,uchar p)
{
uchar t;
bit ack1;
start();
do
{
writeonebyte(divesadrw);//发送器件地址
ack1=checkack();
}while(ack1==0);
do
{
writeonebyte(romadr);//发送器件内部寻址字节地址
ack1=checkack();
}while(ack1==0);
do
{
writeonebyte(divesadrr);
ack1=checkack();
}while(ack1==0);
for(t=0;t<p;t++)
{
receivebuff[t]=readonebyte();
sendack(); //向发送器件发送应答信号
}
sendnack();//发送非应答信号
stop();
P1=0xaa;
}
//***********************************************************
//键功能操作
void keydone(void)
{
if(keyvalue<0x0a)
{
disbuff[0]=keyvalue;
sendbuff[0]=keyvalue;
display();
}
else
{
switch(keyvalue)
{
case 0x0a: //"存入"键
writenbyte(sendbuff,0xa0,0x00,0x01);
display();
break;
case 0x0b: //"调出"键
readnbyte(0xa0,0x00,0xa1,0x01);
disbuff[7]=receivebuff[0];
display();
break;
case 0x0c: //"清0"键
sendbuff[0]=0;
writenbyte(sendbuff,0xa0,0x00,0x01);
display();
break;
default:
break;
}
}
}
//********************************************************************
//主函数
void main()
{
P0=0x00;
P1=0x00;
P2=0x0f;
P3=0x00;
while(1)
{
keyscan();
keydone();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -