本帖最后由 xppx1987 于 2012-9-10 09:06 编辑
10# XIEYUANBIN 数码管确信是共阴极的没错,确实不知道程序哪里出错了,下面附上简单程序,望大侠纠正指出。还有就是第一个图在三极管C级加了上拉电阻可以正常显示了,不解?还望指点一二!
#include<pic.h>
#include<math.h>
#include<stdio.h>
__CONFIG(0x3B31); //芯片配置字,看门狗关,上电延时开,掉电检测关,低压编程关,加密,4M晶体HS振荡
#define data164 RA3
#define clk164 RA5
#define uchar unsigned char
#define uint unsigned int
#define _nop_() asm("nop")
uint temp=12;
uchar count_10ms=0;
uchar const bit_tab[]={0x80,0x40,0x20,0x01,0x08,0x04,0x02,0x01,0};//位选表,用来选择哪一只数码管进行显示
uchar const seg_data[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//段选表,共阴数码显示码值
uchar disbuf[2]; //定义显示缓冲单元
/******函数定义**************/
void sendbyte1(char byte);
void sendbyte2(char byte);
void conv(uint tmp_s);
void display();
/********端口设置函数********/
void port_init( )
{
TRISA=0x07;
TRISB=0x06;
TRISC=0x00; //端口C输出,位选
ADCON1=0x06; //定义RA为IO端口
//ANSEL=0x00;
//ANSELH=0x00;
}
/*****************显示函数***********************/
void sendbyte1(char byte)
{
unsigned char c;
for(c=0;c<8;c++)
{
if(byte&0x80)
data164=1;
else data164=0;
clk164=0;
_nop_();
clk164=1;
byte<<=1;
}
}
void sendbyte2(char byte)
{
unsigned char c;
for(c=0;c<16;c++)
{
if(byte&0x80)
data164=1;
else data164=0;
clk164=0;
_nop_();
clk164=1;
byte<<=1;
}
}
void conv(uint tmp_s)
{
disbuf[0]=tmp_s/10;
disbuf[1]=tmp_s%10;
}
void display()
{
static uchar count=0;
PORTC=bit_tab[8];
switch(count)
{
case 0:sendbyte1(seg_data[disbuf[0]]);PORTC=bit_tab[6];break;
case 1:sendbyte2(seg_data[disbuf[1]]);PORTC=bit_tab[7];break;
}
count++;
if(count==2) count=0;
}
/*********定时器0/定时器1初始化函数********/
void timer_init()
{
GIE=1; //开总中断
PEIE=1; //开外围功能模块中断
T0CS=0; //定时器0对内部时钟计数
PSA=0; //分频器分配给TRM0
PS0=1;
PS1=1;
PS2=1; //定时器0分频比为1:256
T0IE=1; //允许TMR0溢出中断
TMR0=248; //TMR0赋初值,定时2ms
T1CKPS0=1;T1CKPS1=1; //定时器1分频比为1:8
TMR1CS=0; //定时器1设置为定时功能
TMR1IE=1; //使能定时器1中断
TMR1ON=1; //启动定时器1
TMR1H=0xfb; //置计数值高位,定时时间为10ms
TMR1L=0x1e; //置计数值低位
}
/********中断服务程序********/
void interrupt ISR(void)
{
if(TMR0IF==1)
{
TMR0IF=0; //清TMR1溢出中断标志位
TMR0=248; //TMR0赋初值,定时2ms
display(); //调显示函数
}
if(TMR1IF==1)
{
TMR1IF=0; //清TMR1溢出中断标志位
TMR1H=0xfb; //重置计数值,定时时间为10ms
TMR1L=0x1e; //重置计数值
count_10ms++; //10ms计数器加1
if(count_10ms>=100)
{
count_10ms=0;//计数100次后恰好为1s,此时10ms计数器清零
}
}
}
/*************************主函数****************************/
void main( )
{
port_init();
timer_init(); //调定时器T0、T1初始化函数
while(1)
{
conv(temp); //调走时转换函数
}
}
|