本帖最后由 727602048 于 2017-6-23 01:41 編輯
八個七段數碼管顯示程序
#include <reg51.h> //包含頭文件
#include <intrins.h> //包含移位函數頭文件
//段碼表
unsigned char code dis_code[11]={0xc0,0xf9,0xa4,0xb0, // 0, 1, 2, 3
0x99,0x92,0x82,0xf8,0x80,0x90, 0xff};// 4, 5, 6, 7, 8, 9, off
unsigned char code wei_code[8]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
unsigned char shi=0,fen=0,miao=0;
//毫秒級延時函數
unsigned int jishu,j=0;
void delay(unsigned int x);
void display(void);
void int0Init(void);
//主函數
void main()
{
P0 = 0xff; //先關閉數碼管
P2 = 0x00; //
int0Init();
while(1)
{
display();
}
}
void int0Init(void)
{
EA=1;
ET0=1;
TR0=1;
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
}
void delay(unsigned int x)
{
unsigned char i;
while(x--)
{
for(i=0;i<120;i++);
}
}
void display(void)
{
P2 = 0x00; //每顯示一位都要關閉位選端口一次
P2=wei_code[0]; //每次選通一個位選端口
P0=dis_code[miao%10]; //段碼送P0口
delay(2);
P2 = 0x00; //每顯示一位都要關閉位選端口一次
P2=wei_code[1]; //每次選通一個位選端口
P0=dis_code[miao/10]; //段碼送P0口
delay(2);
P2 = 0x00; //每顯示一位都要關閉位選端口一次
P2=wei_code[2]; //每次選通一個位選端口
P0=0xbf; //段碼送P0口
delay(2);
P2 = 0x00; //每顯示一位都要關閉位選端口一次
P2=wei_code[3]; //每次選通一個位選端口
P0=dis_code[fen%10]; //段碼送P0口
delay(2);
P2 = 0x00; //每顯示一位都要關閉位選端口一次
P2=wei_code[4]; //每次選通一個位選端口
P0=dis_code[fen/10]; //段碼送P0口
delay(2);
P2 = 0x00; //每顯示一位都要關閉位選端口一次
P2=wei_code[5]; //每次選通一個位選端口
P0=0xbf; //段碼送P0口
delay(2);
P2 = 0x00; //每顯示一位都要關閉位選端口一次
P2=wei_code[6]; //每次選通一個位選端口
P0=dis_code[shi%10]; //段碼送P0口
delay(2);
P2 = 0x00; //每顯示一位都要關閉位選端口一次
P2=wei_code[7]; //每次選通一個位選端口
P0=dis_code[shi/10]; //段碼送P0口
delay(2);
}
void Time0(void) interrupt 1 using 0
{
j++;
if (j==20)
{miao++;j=0;
if(miao==60)
{miao=0;fen++;
if(fen==60)
{fen=0;shi++;
if(shi==24)
{shi=0;}}}}
TH0 = (65536-50000)/256; //定時器重新賦初值
TL0 = (65536-50000)%256;
}
|