普中开源电子分享网

 找回密码
 立即注册
搜索
查看: 2290|回复: 1

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

 关闭 [复制链接]

1

主题

2

帖子

14

积分

新手上路

Rank: 1

积分
14
发表于 2019-8-14 17:30:40 | 显示全部楼层 |阅读模式
#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[index+i]);
  P0 = ledwei[i];
  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();
}

回复

使用道具 举报

1

主题

2

帖子

14

积分

新手上路

Rank: 1

积分
14
 楼主| 发表于 2019-8-15 15:17:24 | 显示全部楼层
已解决,中断里最好别放别的耗时间的操作,本程序void Hc595sentbyte(u8 dat)操作提到中断外,就解决了问题,后来的人引以为戒
回复 支持 1 反对 0

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

Archiver|手机版|小黑屋|普中开源电子分享网 粤ICP备16123577号-2

GMT+8, 2024-4-29 11:46 , Processed in 0.095382 second(s), 31 queries .

Powered by 论坛搭建 X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表