hypo 发表于 2019-8-14 17:30:40

求解答!定时的1ms进入中断确要2ms,延时的1s切换实际是2.5s切换。求求求求求!!

#include <reg51.h>
#include <intrins.h>// ????????
typedef unsigned char u8;//u8 = unsigned char
typedef unsigned int u16;
sbit SRCLK = P3^6;//移位寄存器
sbit RCLK = P3^5;//存储寄存器
sbit SER = P3^4;//串行数据输入
static unsigned int tmr = 0,index = 0;
u8 ledduan[] = {
0x00,0x70,0x89,0x89,0x89,0x89,0x7e,0x00,// 8*8点阵显示数字9
0x00,0x36,0x49,0x49,0x49,0x36,0x00,0x00,//8
0x00,0x40,0x43,0x44,0x48,0x50,0x60,0x00}; //   7

u8 ledwei[] = {0x7f, 0xbf, 0xdf, 0xef, 0xf7, 0xfb, 0xfd, 0xfe};//选择列数导通
void Time0()
{
TMOD = 0X01;
TH0 = 0XFC;//1ms定时
TL0 = 0X18;
TR0 = 1;
EA = 1;
ET0 = 1;
}
void Hc595sentbyte(u8 dat)
{
u8 a;
SRCLK = 0;
RCLK = 0;
for(a = 0; a < 8; a++)
{
SER = (dat >> 7);//1100 1001;ser =0000 0001
dat<<=1;   //dat= 1001 0010
SRCLK = 1;
// _nop_();
SRCLK = 0;
}
RCLK = 1;   
RCLK = 0;
}
void time0int() interrupt 1
{
u8 i = 0;
TH0 = 0XFC;
TL0 = 0X18;
tmr++;
for(i = 0; i < 8; i++)    //循环显示8列
{
Hc595sentbyte(ledduan);
P0 = ledwei;
Hc595sentbyte(0x00);
P0 = 0xff;
}
}
void run()
{
while(1)
{
if(tmr >= 1000)    //1s延时
{
   tmr = 0;
   index = index + 8;//作为切换显示
   if(index > 16)
   index = 0;
}
}
}
void main()
{
Time0();
run();
}

hypo 发表于 2019-8-15 15:17:24

已解决,中断里最好别放别的耗时间的操作,本程序void Hc595sentbyte(u8 dat)操作提到中断外,就解决了问题,后来的人引以为戒
页: [1]
查看完整版本: 求解答!定时的1ms进入中断确要2ms,延时的1s切换实际是2.5s切换。求求求求求!!