哪位大神帮忙看一下,共阳数码管能正常显示吗
#include<reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define writedatamode_z 0x40 // 采用自动地址加一方式写显示缓存
#define writedatamode_g 0x44 //采用地址固定模式写缓存
#define readkeymode 0x42 // 键盘扫描模式
#define startdata 0xc0 //起始地址
#define display 0x8a //开启显示 亮度用后三位决定
#define closedis 0x80 //关显示
sbit SCLK=P0^0;
sbit DIO =P0^1;
uchar code num[]={
0xFC,/*0*/
0x60,/*1*/
0xDA,/*2*/
0xF2,/*3*/
0x66,/*4*/
0xB6,/*5*/
0xBE,/*6*/
0xE0,/*7*/
0xFE,/*8*/
0xF6,/*9*/
0xEE,/*A*/
0x3E,/*b*/
0x9C,/*C*/
0x7A,/*d*/
0x9E,/*E*/
0x8E,/*F*/
};
void delayms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=100;j>0;j--);
}//延时
void start() //开始条件
{
SCLK=1;
DIO=1;
DIO=0;
SCLK=0;
}
void send_data(uchar x) //送数据 低位先传
{
uchar i;
for(i=0;i<8;i++)
{
SCLK=0;
DIO=(bit)(x&0x01);
SCLK=1;
x>>=1;
}
SCLK=0;
}
void stop() //结束条件
{
SCLK=0;
DIO=0;
SCLK=1;
DIO=1;
}
uchar SEG[16];
void Display1(void)
{
unsigned char i,j,k,temp[16];
for(i=0; i<16; i++)
{
k = i / 8;
for(j=0; j<8; j++)
{
temp[j+k*8] |= ((SEG[i] & (0x80>>j))>>(7-j))<<(i%8);
}
}
start();
send_data(startdata); //起始地址
for(i=0;i<16;i++) //送16位数
{
send_data(temp[i]);
}
stop();
}
void Display2(void)
{
unsigned char i,j,k,temp[16];
for(i=0; i<16; i++)
{
k = i / 8;
for(j=0; j<8; j++)
{
if(SEG[i]&(0x80>>j))
temp[j+k*8] |= 1<<(i%8);
}
}
start();
send_data(startdata); //起始地址
for(i=0;i<16;i++) //送16位数
{
send_data(temp[i]);
}
stop();
}
void main(void)
{
unsigned char i;
start();
send_data(closedis); //关显示
stop();
start();
send_data(writedatamode_z); //自动地址
stop();
start();
send_data(display); //开显示
stop();
for (i=0; i<16; i++)
SEG[i] = num[i];
//SEG[i] = 1<<7;
Display1(); //两种转置方式
//Display2();
while(1)
{
;
}
}
一周热门 更多>