|
编译,仿真均已通过。但是还有一个问题,在换列点亮下一个灯时,会产生竞争冒险。请大神指教!
程序如下:
- #include<at89x51.h>
- #include<math.h>
- #define uint unsigned int
- #define uchar unsigned char
- sbit le1=P3^0; //驱动74HC573
- sbit le2=P3^1;
- sbit st=P3^5;
- sbit eoc=P3^6;
- sbit oe=P3^7;
- uchar ad_data,d,row,col;
- uchar code R[]={0X01,0X02,0X04,0X08,0X10,0X20,0X40,0X80}; //行和列的数组,共对应64个坐标
- uchar code C[]={0XFE,0XFD,0XFB,0XF7,0XEF,0XDF,0XBF,0X7F};
- void data_Pr(); //确定要点亮的灯的行row、列col
- void delay(k); //延时1ms
- void display_Re(); //点亮坐标为(row,col)的灯
- void main()
- {
-
- ad_data=0; //采样值存储单元置零
- P2=0xff;
- while(1)
- {
- oe=1;
- ad_data=P0;
- oe=0;
- data_Pr();
- oe=1;
- st=0; //启动ADC
- st=1;
- st=0;
- while(!eoc) //等待转换完成
- display_Re();
-
- }
- }
- void Delay(int count)
- {
- int i,j;
- for(i=0;i<count;i++)
- for(j=0;j<120;j++);
- }
- void data_Pr(void)
- {
- d=ad_data>>2;
- col=d/8;
- row=d%8;
-
- }
- void display_Re() //LED??ê?×ó3ìDò
- {
- le1=0; //这个程序会产生冒险竞争
- le2=0;
- P2=C[col];
- le2=1;
- le1=0;
- delay(1);
- P1=R[row];
- le1=1;
- le2=0;
- delay(1);
- }
复制代码
|
|