本帖最后由 xiaoliping1945 于 2013-8-25 11:24 编辑
请教下各位大神,为什么下面中断里的弄成左移8位就不行recevie_start =recevie_start<<8+CCAP0L ;
,而换成*256就可以,(recevie_start =recevie_start*256+CCAP0L ;
)这是什么原因啊??????
#include<STC12C5A60S2.h>
#include<intrins.h>
#include"lcd1602_595.h"
/*sfr CCAPM0 = 0xDA;
sfr CCON = 0xD8;
sfr CMOD = 0xD9;
sbit CCF0 = CCON^0;
sbit CR = CCON^6;
sfr CL = 0xE9;
sfr CH = 0xF9;
*/
bit FLAG;
uint recevie_start,recevie_end;
sbit PCA_LED=P1^0;
unsigned char code table[]="0123456789";
unsigned char date[]="0000";
void main()
{
init_lcd();
write_com(0x01);
delayus(50);
lcd_display(0X40,11,date) ;
delayus(50); //就是这个延时会影响进中断
CCON=0X01; //清溢出标志位,清中断标志,先不启动PCA计数器
CL=0;
CH=0;
CCAP0H=0;
CCAP0L=0;
CMOD=0X00;
//CCAPM0=0X11; //捕获模式,下降沿触发
//CCAPM0=0X21; //上升沿触发
CCAPM0=0X31; //同时为下降沿和上升沿触发
CR=1; //启动PCA计数器 //AUXR|=0X80;定时器0设置为1T模式
EA=1; //开总中断
while(1);
}
void PCA_isr() interrupt 7 using 1
{
CCF0=0;
// CF=0;
EA=0;
recevie_start=CCAP0H;
recevie_start =recevie_start<<8+CCAP0L ;
date[1]=table[recevie_start%1000/100];//转化为lcd要显示的字符,做测试,显示得到的时间值得后三位
date[2]=table[recevie_start%100/10];
date[3]=table[recevie_start%10];
lcd_display(0X40,11,date) ; / /第2行第11例开始显示
PCA_LED=~PCA_LED;
EA=1;
}
下面是串行的1602显示没问题
#ifndef __lcd1602_595_H__
#define __lcd1602_595_H__
#define uint unsigned int
#define uchar unsigned char
sbit rs=P2^2;
//rw=0; 只往lcd写入,不读出,故rw=0;
sbit en=P2^1;
sbit sclk=P2^2; //移位时钟
sbit ds=P2^0; //数据线
sbit rclk=P2^1 ; //锁存输出时钟
/*-----------函数声明------------*/
void delay(uint z);
void delayus(uint i);
void write_595(uchar date);
void write_com(uchar com) ;//写指令
void write_data(uchar date ); //写数据
void init_lcd(); //注意,里面有清屏命令
void lcd_display(uchar x,uchar y,uchar *s) ; //第X行第Y例开始显示
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void delayus(uint i)
{
while(i--);
}
void write_595(uchar date)
{
uchar i;
for(i=0;i<8;i++)
{
sclk=0;
ds=date&0x80;
delay(2);
sclk=1;
date<<=1; //sclk给一个上升沿脉冲即可读走一位
}
}
void write_com(uchar com) //写指令
{
write_595(com);
rs=0;
delay(1);
//rw=0;
rclk=1;
delay(1);
rclk=0; //令595输出,并用en输出一个高脉冲
}
void write_data(uchar date ) //写数据
{
write_595(date); //写入数据
rs=1;
delay(5);
rclk=1;
delayus(10);
rclk=0; //令595输出,并用en输出一个高脉冲
}
void init_lcd()
{
write_com(0x38);
delayus(50);
write_com(0x0c);
delayus(50);
write_com(0x06);
delayus(50);
// write_com(0x01);
// delayus(50);
}
void lcd_display(uchar x,uchar y,uchar *s) //第X行第Y例开始显示
{
init_lcd();
write_com(0x80+x+y);
while(*s!='\0')
{
write_data(*s++);
delay(5);
}
}
#endif
|