#include<stdio.h>
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit l1=P2^7;//LED1选通位,为0有效,初始都为1
sbit l2=P2^6;//LED2选通位
sbit l3=P2^5;//LED3选通位
sbit l4=P2^4;//LED4选通位
/*93c46工作在8位模式*/
sbit CS=P2^3;//93c46片选信号
sbit SK=P2^2;//93c46时钟信号
sbit DI=P2^1;//93c46数据写入脚
sbit DO=P2^0;//93c46数据读出脚
uchar led1=0,led2=1,led3=2,led4=3;//4位数码管显示值
uchar dispcode[]={0XCF,0X48,0XD6,0XDC,0X59,0X9D,0X9F,0XCE,0XDF,0XDD};//0--9
void delay1ms(uint p)//12mhz 延时1毫秒
{
uchar i,j;
for(i=0;i<p;i++)
{
for(j=0;j<124;j++)
{
;
}
}
}
/*93c46擦/写使能指令程序*/
void Ewen(void) {
unsigned char temp,InData;
CS=0;
SK=0;
CS=1;
InData=0x98; // 10011XXXXXX
for(temp=10;temp!=0;temp--)// 10
{
DI=InData&0x80;
SK=1; SK=0;
InData<<=1;
}
CS=0;
}
/*93c46擦/写禁止指令程序*/
void Ewds(void)
{
unsigned char temp,InData;
CS=0;
SK=0;
CS=1;
InData=0x80; // 10000XXXX
for(temp=10;temp!=0;temp--)// 10
{
DI=InData&0x80;
SK=1; SK=0;
InData<<=1;
}
CS=0;
}
/*读取数据指令程序*/
uchar Read(uchar address)
{
uchar temp;
uchar result;
Ewen();
SK=0; DI=1; // 110 A6-A0
CS=0; CS=1;
SK=1; SK=0; // 1 指令起始位
DI=1; SK=1; SK=0;//操作码第一位1,第二位0循环里移入
address=address&0x7f;
for(temp=8;temp!=0;temp--) // 8, 7位地址写入
{
DI=address&0x80;
SK=1; SK=0;
address<<=1;
}
DO=1;
for(temp=8;temp!=0;temp--) // 8 一字节循环读出数据
{
SK=1;
result=(result<<1)|DO;
SK=0;
}
CS=0;
Ewds();
return(result);//返回读出字节数据
}
/*写入数据指令程序*/
void Write(unsigned char address,unsigned char InData)
{
unsigned char temp;
Ewen();
SK=0; DI=1; // 101 A6-A0
CS=0; CS=1;
SK=1; SK=0; // 1 指令起始位
DI=0; SK=1; SK=0; //写操作码第一位0
address=address|0x80;
for(temp=8;temp!=0;temp--)// 8, 7位地址写入
{
DI=address&0x80;
SK=1; SK=0;
address<<=1;
}
for(temp=8;temp!=0;temp--)// 一字节数据循环写入
{
DI=InData&0x8000;
SK=1; SK=0;
InData<<=1;
}
CS=0; DO=1;
CS=1; SK=1;
while(DO==0) // busy test
{
SK=0; SK=1;
}
SK=0; CS=0;
Ewds();
}
/*擦除指定地址数据*/
void Erase(unsigned char address)
{
unsigned char temp;
Ewen();
SK=0; DI=1; // 111 A6-A0
CS=0; CS=1;
SK=1; SK=0; // 1 指令码起始位
DI=1; SK=1; SK=0;//操作码第一位
address|=0x80;
for(temp=8;temp!=0;temp--)// 8
{
DI=address&0x80;
SK=1; SK=0;
address<<=1;
}
CS=0; DO=1;
CS=1; SK=1;
while(DO==0)
{
SK=0; SK=1;
}
SK=0; CS=0;
Ewds();
}
void displed()//显示程序
{
P0=dispcode[led1];
l1=0;
delay1ms(2);
l1=1;
P0=dispcode[led2];
l2=0;
delay1ms(2);
l2=1;
P0=dispcode[led3];
l3=0;
delay1ms(2);
l3=1;
P0=dispcode[led4];
l4=0;
delay1ms(2);
l4=1;
}
main()
{
uchar a=0,b=0,c=0,d=0,e=0;
P2=0XFF;
Erase(0);
Erase(1);
Write(0,0X59);
Write(1,0XDF);
led1=Read(0);
led2=Read(1);
led3=Read(2);
led4=Read(3);
while(1)
{
displed();
}
}
把程序贴出来了,工作在8位模式 |