MC9S08F8芯片控制四位共阳极数码管程序
功能:通过按键控制显示不同数字
#include <hidef.h> /* for EnableInterrupts macro */
#include "derivative.h" /* include peripheral declarations */
//位操作
#define BSET(bit,Register) ((Register)|= (1<<(bit))) //设置寄存器中某一位为1
#define BCLR(bit,Register) ((Register) &= ~(1<<(bit))) //设置寄存器中某一位为0
#define BGET(bit,Register) (((Register) >> (bit)) & 1) //得到寄存器中某一位状态
//定义数据类型
typedef unsigned char uint8; // 8 位无符号数
typedef unsigned short int uint16; // 16 位无符号数
typedef unsigned long int uint32; // 32 位无符号数
typedef char int8; // 8 位有符号数
typedef short int int16; // 16 位有符号数
typedef long int int32; // 32 位有符号数
uint16 m=0000;
// 定义延时函数ms
void Delay_n_ms(uint16 count)
{
uint16 i,j;
for(j=0; j<count; j++)
for(i=0; i<950; i++) ;
;
}
const uint8 Dtable[10]={ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90 };
//共阳极数码管
void int_LED(void)
{
//LED初始化 PTC 输出
PTCDD = 255;//将显示段位的八个引脚设置为输出
BSET(0,PTADD);
BSET(1,PTADD);
BSET(2,PTADD);
BSET(3,PTADD);//将位选模块设置为输出
BSET(0,PTAD);
BSET(1,PTAD);
BSET(2,PTAD);
BSET(3,PTAD); //数码管高电平不亮
}
void int_xiaodeng(void)
{
BSET(0,PTBDD);
BSET(1,PTBDD);
BSET(2,PTBDD);
BSET(0,PTBD);
BSET(1,PTBD);
BSET(2,PTBD);
}
void int_key(void)
{
BCLR(0,PTDDD);
BCLR(1,PTDDD);
BCLR(2,PTDDD);
}
void xiaodeng (void)
{
BCLR(0,PTBD);
Delay_n_ms(100);
BSET(0,PTBD);
}
void LED_show ( uint16 i )
{
uint8 b1,b10,b100,b1000,j;
b1=i%10;
b10=(i/10)%10;
b100=(i/100)%10;
b1000=(i/1000)%10;
for(j=0;j<4;j++)
{
PTCD=Dtable[b1000] ;
BCLR(0,PTAD);
Delay_n_ms(1);
BSET(0,PTAD);
PTCD=Dtable[b100] ;
BCLR(1,PTAD);
Delay_n_ms(1);
BSET(1,PTAD);
PTCD=Dtable[b10] ;
BCLR(2,PTAD);
Delay_n_ms(1);
BSET(2,PTAD);
PTCD=Dtable[b1] ;
BCLR(3,PTAD);
Delay_n_ms(1);
BSET(3,PTAD);
}
}
void LED(void)
{
if(BGET(0,PTDD)==0)
{
Delay_n_ms(1);
if(BGET(0,PTDD)==0)
{
m=8111;
}
} else if(BGET(1,PTDD)==0)
{
Delay_n_ms(1);
if(BGET(1,PTDD)==0)
{
m=1118;
}
} else if(BGET(2,PTDD)==0)
{
Delay_n_ms(1);
if(BGET(2,PTDD)==0)
{
m=8888;
}
}
LED_show(m);
}
void main(void)
{
int_xiaodeng();
int_key();
int_LED();
while(1)
{
LED();
}
for(;;)
{
__RESET_WATCHDOG();
} /* loop forever */
/* please make sure that you never leave main */
}
本程序开发目的为完成汽车电路设计与单片机课程大作业使用。虽然为测试版本,但经过实物测试,目标功能基本实现,相关电路设计参考芯片手册。