📄 dr.c
字号:
//#pragma SMALL
//#pragma disable
#include<absacc.h>
#include<reg51.h>
#include<intrins.h>
//#include"D:\exercise_C51\_inc\keyword.h" //在自己的电脑上
#include"F:\ldr\exercise_C51\_inc\keyword.h" //在培训中心的电脑上
///////////////////////////////////////////
//PORT & COMMAND ADDRESS的定义
#define PORT_A8255 XBYTE[0x2000] //chip enable & PortA
#define PORT_B8255 XBYTE[0x2001] //在这里,用不到的pin应该设为1还是设为0好点呢?
#define PORT_C8255 XBYTE[0x2002] //好像常见的都是设为1的.
#define COMMAND8255 XBYTE[0x2003] //chip enable & A1A0=11
#define SEG7_COM P1
//工作方式定义,之所以这样做是为了在函数调用时不会去改变之前的其它PORT的工作方式,
//一定程度上提高了代码的安全性.
#define KEY_PAD_SET0 0xfe //for Port C
#define KEY_PAD_SET1 0x88
#define LED7SEG_SET0 0xf9 //for Port B
#define LED8BIT_SET0 0b8f //for Port A
///////////////////////////////////////
#define TIME_500MS 500
#define START_TIME 10000
#define STEP_TIME 700
#define OFF_TIME 20
#define DISPLAY_NUM_TIME 100
#define DISPLAY_TIMES 10
// for lamp jmping
#define MODE0_TIME 80
#define MODE1_TIME1 50
#define MODE1_TIME2 80
#define DEBUG_TIME 00000
///////////////////////////////////////
void delay_self(ulong x);
void delay_display(ulong x);
void seg7_display(uchar *x);
void lamp_jmp_soft(uchar mode);
void pre_display(uint x);
///////////////////////////////////////
code uchar bcd_code_num[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//0 to 9
//code uchar bcd_code_char[]={0x77,0x7c,0x39,0x5e,0x79,0x71, //A to F
// 0x73, //P
// 0x3e, //U
// 0xff, //8.
// 0x00}; //"灭" 说明:全部为共阴之数据.
code uchar seg7com[]={0xf1,0xf2,0xf4,0xf8};
// 0 1 2 3 4 5 6 7 8 9
code uint log_data[256]={0, 0, 3010, 4771, 6021, 6990, 7782, 8451, 9031, 9541};
data uchar digit[]={0,1,2,3};
sbit cs138=P1^6;
void main(void)
{
cs138=0; //***
COMMAND8255=0x81; //抄世杰之程式.
while(1)
{
lamp_jmp_soft(0);
lamp_jmp_soft(1);
}
}
////////////////////////////Begin of subroutine//////////
//*****************************
void lamp_jmp_soft(uchar mode)
{
// uchar circle,
uchar i=0,j;
uchar light_data;
// cs138=0; //***
// COMMAND8255=0x8f;
switch(mode)
{
case 0: //1-4>>2-5>>3-6>>...
{
for(j=0;j<10;j++)
{
pre_display(log_data[j]);
light_data=0x77;
for(i=0;i<4;i++)
{
// COMMAND8255=0x8f;
PORT_A8255=light_data;
// PORT_A8255=_cror_(light_data,i);
light_data=_cror_(light_data,1);
delay_display(MODE0_TIME);
PORT_A8255=0xff;
}
}
// delay_display(MODE0_TIME);
break;
}
case 1: //1>>5>>2>>6>>3>>7...
{
for(j=0;j<10;j++)
{
pre_display(log_data[j]);
light_data=0x7f;
for(i=0;;i++)
{
// COMMAND8255=0x8f;
PORT_A8255=light_data;
delay_display(MODE1_TIME1);
// COMMAND8255=0x8f;
PORT_A8255=_cror_(light_data,2);
delay_display(MODE1_TIME2);
light_data=_cror_(light_data,1);
if(5==i) break;
}
}
delay_display(DEBUG_TIME);
}
}
}
// case 2: //4-5>>3-6>>...>>1-8>>2-7>>...
// {
// light_data=0xe7;
// for(i=0;i<7;i++)
// {
// PORT_A8255=light_data;
// delay(MODE2_TIME1);
void delay_display(ulong x)
{
for(;x>0;x--)
seg7_display(digit);
}
//*******************************
void delay_self(ulong x)
{
for(;x>0;x--);
}
//***************
//说明:本subroutine没有对7SEG LED进行初始化.
void seg7_display(uchar *x)
{
uchar i;
// cs138=0;
// COMMAND8255=LED7SEG_SET0;
for(i=0;i<4;i++)
{
PORT_B8255=bcd_code_num[x[i]];
// delay(DISPLAY_NUM_TIME);
SEG7_COM=seg7com[i];
delay_self(DISPLAY_NUM_TIME);
SEG7_COM=0x00;
}
}
/*-----------------------------
digit[]要先被定义过.
------------------------------*/
void pre_display(uint x) //change x to bcd code and transist to digit[]
{
digit[0]=x/1000;
digit[1]=(x%1000)/100;
digit[2]=(x%100)/10;
digit[3]=x%10;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -