|
发表于 2012-5-7 15:54:34
|
显示全部楼层
我这个是52单片机驱动8 位共阴数码管的程序,请教下怎么改成驱动8 位共阳极数码管???
#include<reg52.h>
#include<intrins.h>
#define nop _nop_();
#define uchar unsigned char
#define uint unsigned int
sbit stb =P1^0; //定义片选通讯口
sbit clk =P1^1; //定义时钟通讯口
sbit dio =P1^3; //定义数据输入/输出通讯口
bdata uchar y=0;//定义可以位寻址全局变量y
sbit y7 =y^7;
uchar show[16] = {0x07,0x06,0x07,0x0b,0x03,0x08,0x03,0x08,0x03,0x0f};//初始化显示“HELLO”字符代码
uchar CODE[20] = {0x03,0x0f,0x00,0x06,0x05,0x0b,0x04,0x0f,0x06,0x06,0x06,0x0d,0x07,0x0d,0x00,0x07,0x07,0x0f,0x06,0x0f}; //0~9显示代码,相邻两个数之间
//代码组合显示一个数字
uchar TIME_seconds,seconds_2,sub_1,sub_2,shi_1,shi_2; //时间寄存器,依次从秒个位至小时十位
uchar TIME_count; //定时中断控制制位
uchar T_count; //时钟小数点闪
/*********************************
功能: TM1639写数据
**********************************/
void write(uchar wr_data)
{
uchar i;
stb =0; //给有效的片选信号(片选信号是低电平有效)
nop;
nop;
for(i=0;i<8;i++)//开始传送8位数据,每循环一次传送一位数据
{
clk =0;
nop;
nop;
wr_data >>= 1;//移位数据,低位在前!
nop;
dio = CY;
nop;
nop;
clk =1;
nop;
}
}
/*********************************
功能:读按键子程序 由y 返回1BIT按键数据
**********************************/
unsigned char read()
{
uchar d;
stb = 0; //给有效的片选信号(片选信号是低电平有效)
dio = 1; //将DIO置高,因为没有按键按下时,键值默认为00H,此时为了与键值有区别
for(d=0;d<8;d++)
{
clk = 0;
nop;
nop;
nop;
nop;
clk = 1; //上升沿读按键值
nop;
nop;
nop;
nop;
if(dio==1)
{
y7 = 1;
}
else
{
y7 = 0;
}
if(d!=7){y=(y>>1);}
nop;
nop;
}
return(y);
}
/*********************************
TM1639控制指令
功能: 驱动LED屏做相应的显示
**********************************/
void xianshi(uchar show_led[16])
{
uchar h;
stb = 1;
clk = 1;
dio = 1;
write(0x40);//写数据到显示寄存器,采用地址自动加一
stb = 1;
write(0xc0);//显示寄存器的00H单元开始
for(h=0;h<16;h++)
{
write(show_led[h]);//给显示寄存器送数据,
}
stb=1;
write(0x8b);//显示控制参数,点亮数码屏幕,亮度可以通过改变低三位调节
stb = 1;
}
//-------读按键以及相应的显示处理-------
void panjian()
{
P3=0xf0
uchar count3,key[4];
stb = 1;
write(0x42);//送读按键命令(42H),
TR0 = 1;
shi_2 = 0;
shi_1 = 0;
sub_2 = 0;
sub_1 = 0;
seconds_2 = 0;
TIME_seconds = 0;
}
}
/**********************************
定时中断函数入口
功能: 每50MS中断一次
**********************************/
void time0(void) interrupt 1 using 2
{
TH0=0x3c;
TL0=0xb0;
TIME_count++;
if(TIME_count==21)
{
TIME_count = 0;
TIME_seconds++; // 秒寄存器加1
T_count ^= 0x08;
}
}
/*********************************
时钟函数
功能: 处理时钟显示
**********************************/
void TIME_show()
{
show[0] = CODE[TIME_seconds*2];
show[1] = CODE[TIME_seconds*2+1]; // 数码屏上最后一个“8”字,依次下去
show[2] = CODE[seconds_2*2]; //数码屏倒数第二个“8”字,
show[3] = CODE[seconds_2*+1];
show[4] = CODE[sub_1*2];
show[5] = CODE[sub_1*2+1]|T_count;
show[6] = CODE[sub_2*2];
show[7] = CODE[sub_2*2+1];
show[8] = CODE[shi_1*2];
show[9] = CODE[shi_1*2+1]|T_count;
show[10] = CODE[shi_2*2];
show[11] = CODE[shi_2*2];
if(TIME_seconds == 10) //对时间数据进行处理,以免溢出。
{
TIME_seconds = 0;
seconds_2+=1;
}
if(seconds_2 == 6)
{
seconds_2 = 0;
sub_1 +=1;
}
if(sub_1 == 10)
{
sub_1 = 0;
sub_2 +=1;
}
if(sub_2 == 6)
{
sub_2 = 0;
shi_1 +=1;
}
if(shi_1 == 10)
{
shi_1 = 0;
shi_2 +=1;
}
if(shi_2 == 6) //时钟每60小时自动清0
{
shi_2 = 0;
shi_1 = 0;
sub_2 = 0;
sub_1 = 0;
seconds_2 = 0;
TIME_seconds = 0;
}
}
/*********************************
延时函数
功能: 1ms延时
**********************************/
void delay_ms(uchar cyc)
{
//当cyc=1的时候,延时1ms
uchar ii,jj;
for(jj=1;jj<=cyc;jj++)
{
for(ii=0;ii<200;ii++)
{
nop;
}
}
}
/*********************************
主函数
**********************************/
void main()
{
P0=0xff;
P1=0xff;
P2=0xff;
P3=0xff;//初始化单片机I/O口
TMOD=0x01; //定时器设置
TH0=0x3c;
TL0=0xb0;
IE=0x82;
TF0=1;
xianshi(show);//初始化显示“HELLO”字符
delay_ms(230);
delay_ms(230);
delay_ms(230);
delay_ms(230);
delay_ms(230); //共延时1s
while(1)//循环
{
stb = 1;
dio = 1;
clk = 1;
TIME_show(); //控制做时钟显示
panjian(); //判断按键值
xianshi(show); //根据按键值,给显示寄存器送相应的显示数据
}
}
|
|