51 8X8点阵

来源:百度知道 编辑:UC知道 时间:2024/07/07 20:37:49
#include <REGX52.H>
#define uchar unsigned char
#define uint unsigned int
#define input1 P0
#define input2 P2
uint int_count=0;
uchar display=0;
uchar select=0;
uchar tim=0;

uchar code tab[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
uchar code seg[10][8]={
{0xff,0xff,0xc3,0xbd,0xbd,0xc3,0xff,0xff},//0
{0xff,0xff,0xbb,0x81,0xbf,0xff,0xff,0xff},//1
{0xff,0xff,0x1b,0x5d,0x5d,0x5d,0x63,0xff},//2
{0xff,0xff,0xbb,0x6d,0x6d,0x6d,0x93,0xff},//3
{0xff,0xff,0xcf,0xd7,0xdb,0x01,0xdf,0xff},//4
{0xff,0xff,0xb1,0x75,0x75,0x75,0x8d,0xff},//5
{0xff,0xff,0x83,0x6d,0x6d,0x6d,0x9b,0xff},//6
{0xff,0xff,0xfd,0xfd,0xfd,0x0d,0xf1,0xff},//7
{0xff,0xff,0x93,0x6d,0x6d,0x6d,0x93,0xff},//8
{0xff,0xff,0xb3,0x6d,0x6d,0x6d,0x83,0xff} //9
};

void t0() interrupt 1 using 0
{

while(1)
{
input1=tab[display];
input2=seg[select][display];
}
这段循环有问题!
改成这样试试:
while(1)
{
input1 = 0x00;//列选线置无效电平
input2 = 0xff;//代码段置无效电平
input1=tab[display];
input2=seg[select][display];
delay();//另外再加一个delay函数
}
delay函数:
void delay()
{
uint i;
i = 0x1ff;
while(i--);
}
原因:
错误的操作顺序:
【循环扫描显示LED的时候是选中行线,再往列行送相应的点阵电平.
然后再选中下一行的行线,再往列行送下一行相应的点阵电平.
........】
仔细思考这其中的细节:
如果你在显示第一行的内容之后没有把行上的有效电平取消,然后选中下一行的行线,这个瞬间就会在第二行显示第一行的内容.虽然你的程序马上又会选中正确的行线,但就是这一条指令的时间内的错误造成了整体的闪烁效果.
正确的操作方法是:
【显示一行之后要把行选线和列选线都置为无效电平.然后再显示下一行内容...[这个就是"消隐"]】