下面是我在自己买的51开发板上编写的一个程序,程序实现的功能比较简单,就是在数码管上显示矩阵键盘(4X4键盘,依次编码为1~16)上按下的键值的平方值。其中P2^4~P2^7为8段数码管的位选,P0口为8段数码管的段选,P1^0~P1^3为键盘的列线,P1^4~P1^7为键盘的行线。用定时器0来刷新4位8段数码管的显示。
#include<reg52.h> #include<intrins.h>
#define uchar unsigned char #define uint unsigned int
uchar table[]={ 0xc0,0xf9,0xa4,0xb0, 0x99,0x92,0x82,0xf8, 0x80,0x90,0x88,0x83, 0xc6,0xa1,0x84,0x8e}; uchar j=0,k=0x7f,m=0,b=0xef,a[4]={0}; uint i=0; sbit line1=P1^0; sbit line2=P1^1; sbit line3=P1^2; sbit line4=P1^3;
void delay(uchar z) { uchar x,y; for(x=z;x>0;x--) for(y=250;y>0;y--); }
void time0_initial() { TMOD=0x01; TH0=(65535-1000)/256; TL0=(65535-1000)%256; EA=1; ET0=1; TR0=1; }
void main() { time0_initial(); AC=1; i=0; while(1) { for(m=0;m<4;m++) { P1=_crol_(b,m); if(line1==0) { delay(2); if(line1==0) { i=m*4+1; i=i*i; while(!line1); delay(2); } } if(line2==0) { delay(2); if(line2==0) { i=m*4+2; i=i*i; while(!line2); delay(2); } } if(line3==0) { delay(2); if(line3==0) { i=m*4+3; i=i*i; while(!line3); delay(2); } } if(line4==0) { delay(2); if(line4==0) { i=m*4+4; i=i*i; while(!line4); delay(2); } } } } }
void time0() interrupt 1 { TH0=(65535-1000)/256; TL0=(65535-1000)%256; a[0]=i/1000; a[1]=i/100%10; a[2]=i/10%10; a[3]=i%10; j++; if(j==4) j=0; P2=_cror_(k,j); P0=table[a[j]]; }
此时的程序是正确的。
编程过程中遇到的问题就是没有进行以下所示的位定义
sbit line1=P1^0; sbit line2=P1^1; sbit line3=P1^2; sbit line4=P1^3;
而是直接在程序中使用P1^0~P1^3,结果程序就运行不正常,苦思良久,未果,望请各位前辈高手们指点指点。
[ 本帖最后由 若如 于 2011-11-9 20:03 编辑 ]
|