今天写了一个时钟程序,不知道为什么闪
#include "ai8051u.h"
#include "stc32_stc8_usb.h"//usb 库文件,和那个stc_usb_cdc_32.LIB文件都是USB库文件,搞那个USB不停电下载时加的
#include "intrins.h"
#define u8 unsigned char //8位无符号变量(0-255)
#define u16 unsigned int //16位无符号变量(0-65535)
char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";
/************* 本地常量声明 **************/
u8 code t_display[]={ //标准字库
// 0 1 2 3 4 5 6 7 8 9 A B C D E F
0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,
//black - H J K L N o P U t G Q r M y
0x00,0x40,0x76,0x1E,0x70,0x38,0x37,0x5C,0x73,0x3E,0x78,0x3d,0x67,0x50,0x37,0x6e,
0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,0x46}; //0. 1. 2. 3. 4. 5. 6. 7. 8. 9. -1
u8 code T_COM[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; //位码
void Delay20ms(void) //@24.000MHz
{
unsigned long edata i;
_nop_();
_nop_();
i = 119998UL;
while (i) i--;
}
u16 i=0;
u8 ss=0;
u8 mm=0;
u8 hh=0;
u8 LED8[8]; //显示缓冲
u8 display_index; //显示位索引
/************* IO口定义 **************/
sbit P_HC595_SER = P3^4; //pin 14 SER data input
sbit P_HC595_RCLK = P3^5; //pin 12 RCLk store (latch) clock
sbit P_HC595_SRCLK = P3^2; //pin 11 SRCLK Shift data clock
void Timer0_Init(void); //500毫秒@24.000MHz
void Send_595(u8 dat);
void DisplayScan(void);
void DisplayRTC(void);
void main(void)
{
WTST = 0; //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
EAXFR = 1; //扩展寄存器(XFR)访问使能
CKCON = 0; //提高访问XRAM速度
P0M1 = 0x00; P0M0 = 0xff; //设置为推挽输出
P1M1 = 0x00; P1M0 = 0x00; //设置为准双向口
P2M1 = 0x00; P2M0 = 0x00; //设置为准双向口
P3M1 = 0x00; P3M0 = 0x00; //设置为准双向口
P4M1 = 0x00; P4M0 = 0x00; //设置为准双向口
P5M1 = 0x00; P5M0 = 0x00; //设置为准双向口
P6M1 = 0x00; P6M0 = 0x00; //设置为准双向口
P7M1 = 0x00; P7M0 = 0x00; //设置为准双向口
usb_init(); //USB CDC 接口配置
Timer0_Init(); //定时器初始化
IE2|=0x80; //使能USB中断
EA = 1; //开总中断吗?
while (DeviceState != DEVSTATE_CONFIGURED); //等待USB完成配置
while (1)
{
if (bUsbOutReady) //如果接收到了数据
{
//USB_SendData(UsbOutBuffer,OutNumber); //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
usb_OUT_done();
}
//这里面写代码
if(P33==0)
{
Delay20ms();
if(P33==0)
{
hh=0;
mm=0;
ss=0;
while(P33==0);
}
}
if(P32==0)
{
Delay20ms();
if(P32==0)
{
TR0=!TR0;
while(P33==0);
}
}
DisplayScan();
i++;
printf("当前run的状态:\xfd:%d 次\r\n",i);
}
}
void Timer0_Isr(void) interrupt 1 //1秒中断执行一次
{
ss++;
if(ss>60)
{
ss=0;
mm++;
if(mm>60)
{
mm=0;
hh++;
if(hh>24)
{
hh=0;
}
}
}
DisplayRTC();
}
void Timer0_Init(void) //1秒@24.000MHz
{
TM0PS = 0x1E; //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0xFC; //设置定时初始值
TH0 = 0x03; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1; //使能定时器0中断
}
/**************** 向HC595发送一个字节函数 ******************/
void Send_595(u8 dat)
{
u8 i;
for(i=0; i<8; i++)
{
dat <<= 1;
P_HC595_SER = CY;
P_HC595_SRCLK = 1;
P_HC595_SRCLK = 0;
}
}
/********************** 显示扫描函数 ************************/
void DisplayScan(void)
{
Send_595(t_display[LED8[display_index]]); //输出段码
Send_595(~T_COM[display_index]); //输出位码
P_HC595_RCLK = 1;
P_HC595_RCLK = 0;
if(++display_index >= 8) display_index = 0; //8位结束回0
}
/********************** 显示时钟函数 ************************/
void DisplayRTC(void)
{
if(hh >= 10) LED8[0] = hh / 10;
else LED8[0] = 0x10;
LED8[1] = hh % 10;
LED8[2] = 0x11;
LED8[3] = mm / 10;
LED8[4] = mm % 10;
LED8[5] = 0x11;
LED8[6] = ss / 10;
LED8[7] = ss % 10;
}