#include<STC8xxxx.h>
#include <stdio.h>
#include "intrins.h"
/************* 外部函数和变量声明 *****************/
#define uint unsigned int
#define uchar unsigned char
uchar ScanCoun,ZZ;
#define MAIN_Fosc 22118400L //定义主时钟
//COM SEG 的管脚定义
sbit LED=P1^6; //LED
sbit COM0=P1^0; //COM0
sbit COM1=P1^1; //COM1
sbit COM2=P1^2; //COM2
sbit COM3=P1^3; //COM3
sbit SEG0=P1^4; //SEG0
sbit SEG1=P1^5; //SEG1
sbit SEG2=P2^6; //SEG2
sbit SEG3=P2^5; //SEG3
sbit SEG4=P2^4; //SEG4
sbit SEG5=P2^3; //SEG5
sbit SEG6=P2^2; //SEG6
sbit SEG7=P2^1; //SEG7
sbit SEG8=P2^0; //SEG8
uchar ScanCoun=0; //动态扫描显示位数计数器
uchar *Tdat1,*Tdat2;
uchar LCD_load,W0,bai,shi,ge,W4;
//0~9的段码查询表
uchar code seg_code[12]={0xFA,0x60,0xD2,0xF4,0x6C,0xBC,0xBE,0x0E,0xEF,0xFC,0x01};
//0 1 2 3 4 5 6 7 8 9 Dot
////段码缓冲区
uchar SegBuf[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};//COM1、COM2、COM3、COM4对应的段码缓冲
/////////////延时 ms//////////////
void DelayMS(uint ms)
{
uchar i,j;
for(i=0; i<250; i++)
for(j=0; j<200;j++);
}
//COM口设置高阻态
void IO_set()
{
P1n_open_drain(1<<3);//P1^3高阻 COM3
P1n_open_drain(1<<2);//P1^2高阻 COM2
P1n_open_drain(1<<1);//P1^1高阻 COM1
P1n_open_drain(1<<0);//P1^0高阻 COM0
P2M1=0x00; //P2口为输出
P2M0=0xFF; //SEG2--SEG8
P1n_push_pull(1<<4);//P1^4输出 SEG0
P1n_push_pull(1<<5);//P1^5输出 SEG1
P1n_push_pull(1<<6);//P1^6输出 LED
}
void xianshi()
{
LCD_load=111;
bai=LCD_load/100%10;
shi=LCD_load/10%10;
ge=LCD_load%10;
}
//seg定义
void Seg2Seg()
{
uchar SegXX;
SegBuf[0]=0x00;SegBuf[1]=0x00; //一定要设置为0,输出缓存初始化
SegBuf[2]=0x00;SegBuf[3]=0x00;
SegBuf[4]=0x00;SegBuf[5]=0x00;
SegBuf[6]=0x00;SegBuf[7]=0x00;
//把3位数字的SEG放到COM1、COM2、COM3、COM4对应的SEGBUF[]里面
//LCD的管脚定义与LED不同,不是一个COM对应一位数字,而是对应每个数字的一部分SEG
// 1 2 3 4 5 6 7 8 9 10 11 12 | 13
//COM0 T5 T4 1F 1A 2F 2a 3f 3a -- segBuf【0】| v -- segBuf【4】
//---- COM1 T6 T3 1G 1B 2G 2b 3g 3b -- segBuf【1】| A -- segBuf【5】
//-------- COM2 T7 T2 1E 1C 2E 2c 3e 3c -- segBuf【2】| H -- segBuf【6】
//-------- ---- COM3 T8 T1 / 1D P1 2d P2 3d -- segBuf【3】| % -- segBuf【7】
// SegXX=seg_code[W0]; //电池方格
// if (SegXX&0x80) SegBuf[0]|=0x10; //T4
// if (SegXX&0x40) SegBuf[1]|=0x10; //T3
// if (SegXX&0x20) SegBuf[2]|=0x10; //T2
// if (SegXX&0x10) SegBuf[3]|=0x10; //T1
// if (SegXX&0x08) SegBuf[0]|=0x20; //T5
// if (SegXX&0x04) SegBuf[1]|=0x20; //T6
// if (SegXX&0x02) SegBuf[2]|=0x20; //T7
// if (SegXX&0x01) SegBuf[3]|=0x20; //T8
SegXX=seg_code[bai]; //第1位数字
if (SegXX&0x80) SegBuf[0]|=0x20; //1a
if (SegXX&0x40) SegBuf[1]|=0x20; //1b
if (SegXX&0x20) SegBuf[2]|=0x20; //1c
if (SegXX&0x10) SegBuf[3]|=0x20; //1d
if (SegXX&0x08) SegBuf[0]|=0x40; //1f
if (SegXX&0x04) SegBuf[1]|=0x40; //1g
if (SegXX&0x02) SegBuf[2]|=0x40; //1e
// if (SegXX&0x01) SegBuf[3]|=0x40; //0
SegXX=(seg_code[ge]|0x01); //第2位数字
if (SegXX&0x80) SegBuf[0]|=0x08;//2a
if (SegXX&0x40) SegBuf[1]|=0x08;//2b
if (SegXX&0x20) SegBuf[2]|=0x08;//2c
if (SegXX&0x10) SegBuf[3]|=0x08;//2d
if (SegXX&0x08) SegBuf[0]|=0x10;//2f
if (SegXX&0x04) SegBuf[1]|=0x10;//2g
if (SegXX&0x02) SegBuf[2]|=0x10;//2e
if (SegXX&0x01) SegBuf[3]|=0x10;//p1
SegXX=seg_code[shi]; //第3位数字
if (SegXX&0x80) SegBuf[0]|=0x02;//3a
if (SegXX&0x40) SegBuf[1]|=0x02;//3b
if (SegXX&0x20) SegBuf[2]|=0x02;//3c
if (SegXX&0x10) SegBuf[3]|=0x02;//3d
if (SegXX&0x08) SegBuf[0]|=0x04;//3f
if (SegXX&0x04) SegBuf[1]|=0x04;//3g
if (SegXX&0x02) SegBuf[2]|=0x04;//3e
if (SegXX&0x01) SegBuf[3]|=0x04;//p2
//SegXX=(seg_code[W4]|0x01); //符号显示
// if (SegXX&0x80) SegBuf[4]|=0x01; //v
// if (SegXX&0x40) SegBuf[5]|=0x01; //a
// if (SegXX&0x20) SegBuf[6]|=0x01; //h
// if (SegXX&0x10) SegBuf[7]|=0x01; //&
}
/*******************************************
/////////////定时器初始化////////////
********************************************/
void InitInterResource()
{
IE=0; //关全部中断
TCON=0; //清全部中断请求
IP=0; //清中断优先级
TMOD=0x01; //T0工作方式1(16位定时器)
TH0=0xEC; //T0定时器辅初值
TL0=0x78;
TR0=1; //允许T0定时
ET0=1; //允许T0中断
EA=0; //关全局中断
}
void main()
{
DelayMS(20);
IO_set();
InitInterResource();
EA=1; //开全局中断
while(1);
}
void tmr0_p(void) interrupt 1
{
Seg2Seg();
switch(ScanCoun) //动态扫描显示
{
case 0: //COM0正向驱动
*Tdat1=SegBuf[0];
SEG0 = (bit)(*Tdat1&0x01);
SEG1 = (bit)(*Tdat1&0x02);
SEG2 = (bit)(*Tdat1&0x04);
SEG3 = (bit)(*Tdat1&0x08);
SEG4 = (bit)(*Tdat1&0x10);
SEG5 = (bit)(*Tdat1&0x20);
SEG6 = (bit)(*Tdat1&0x40);
SEG7 = (bit)(*Tdat1&0x80);
*Tdat2=SegBuf[4];
SEG8 = (bit)(*Tdat2&0x01);
COM0=0;
P1n_push_pull(1<<1);//P1^1输出 COM1
P1n_open_drain(1<<2);//P1^2高阻 COM3
P1n_open_drain(1<<3);//P1^3高阻 COM2
P1n_open_drain(1<<0);//P1^0高阻 COM0
break;
case 1: //COM0反向驱动
*Tdat1=~SegBuf[0];
SEG0 = (bit)(*Tdat1&0x01);
SEG1 = (bit)(*Tdat1&0x02);
SEG2 = (bit)(*Tdat1&0x04);
SEG3 = (bit)(*Tdat1&0x08);
SEG4 = (bit)(*Tdat1&0x10);
SEG5 = (bit)(*Tdat1&0x20);
SEG6 = (bit)(*Tdat1&0x40);
SEG7 = (bit)(*Tdat1&0x80);
*Tdat2=~SegBuf[4];
SEG8 = (bit)(*Tdat2&0x01);
COM0=1;
P1n_push_pull(1<<1);//P1^1输出 COM1
P1n_open_drain(1<<2);//P1^2高阻 COM3
P1n_open_drain(1<<3);//P1^3高阻 COM2
P1n_open_drain(1<<0);//P1^0高阻 COM0
break;
case 2: //COM1正向驱动
*Tdat1=SegBuf[1];
SEG0 = (bit)(*Tdat1&0x01);
SEG1 = (bit)(*Tdat1&0x02);
SEG2 = (bit)(*Tdat1&0x04);
SEG3 = (bit)(*Tdat1&0x08);
SEG4 = (bit)(*Tdat1&0x10);
SEG5 = (bit)(*Tdat1&0x20);
SEG6 = (bit)(*Tdat1&0x40);
SEG7 = (bit)(*Tdat1&0x80);
*Tdat2=SegBuf[5];
SEG8 = (bit)(*Tdat2&0x01);
COM1=0;
P1n_push_pull(1<<1);//P1^1输出 COM1
P1n_open_drain(1<<2);//P1^2高阻 COM3
P1n_open_drain(1<<3);//P1^3高阻 COM2
P1n_open_drain(1<<0);//P1^0高阻 COM0
break;
case 3: //COM1反向驱动
*Tdat1=~SegBuf[1];
SEG0 = (bit)(*Tdat1&0x01);
SEG1 = (bit)(*Tdat1&0x02);
SEG2 = (bit)(*Tdat1&0x04);
SEG3 = (bit)(*Tdat1&0x08);
SEG4 = (bit)(*Tdat1&0x10);
SEG5 = (bit)(*Tdat1&0x20);
SEG6 = (bit)(*Tdat1&0x40);
SEG7 = (bit)(*Tdat1&0x80);
*Tdat2=~SegBuf[5];
SEG8 = (bit)(*Tdat2&0x01);
COM1=1;
P1n_push_pull(1<<1);//P1^1输出 COM1
P1n_open_drain(1<<2);//P1^2高阻 COM3
P1n_open_drain(1<<3);//P1^3高阻 COM2
P1n_open_drain(1<<0);//P1^0高阻 COM0
break;
case 4: //COM2正向驱动
*Tdat1=SegBuf[2];
SEG0 = (bit)(*Tdat1&0x01);
SEG1 = (bit)(*Tdat1&0x02);
SEG2 = (bit)(*Tdat1&0x04);
SEG3 = (bit)(*Tdat1&0x08);
SEG4 = (bit)(*Tdat1&0x10);
SEG5 = (bit)(*Tdat1&0x20);
SEG6 = (bit)(*Tdat1&0x40);
SEG7 = (bit)(*Tdat1&0x80);
*Tdat2=SegBuf[6];
SEG8 = (bit)(*Tdat2&0x01);
COM2=0;
P1n_push_pull(1<<1);//P1^1输出 COM1
P1n_open_drain(1<<2);//P1^2高阻 COM3
P1n_open_drain(1<<3);//P1^3高阻 COM2
P1n_open_drain(1<<0);//P1^0高阻 COM0
break;
case 5: //COM2反向驱动
*Tdat1=~SegBuf[2];
SEG0 = (bit)(*Tdat1&0x01);
SEG1 = (bit)(*Tdat1&0x02);
SEG2 = (bit)(*Tdat1&0x04);
SEG3 = (bit)(*Tdat1&0x08);
SEG4 = (bit)(*Tdat1&0x10);
SEG5 = (bit)(*Tdat1&0x20);
SEG6 = (bit)(*Tdat1&0x40);
SEG7 = (bit)(*Tdat1&0x80);
*Tdat2=~SegBuf[6];
SEG8 = (bit)(*Tdat2&0x01);
COM2=1;
P1n_push_pull(1<<1);//P1^1输出 COM1
P1n_open_drain(1<<2);//P1^2高阻 COM3
P1n_open_drain(1<<3);//P1^3高阻 COM2
P1n_open_drain(1<<0);//P1^0高阻 COM0
break;
case 6: //COM3正向驱动
*Tdat1=SegBuf[3];
SEG0 = (bit)(*Tdat1&0x01);
SEG1 = (bit)(*Tdat1&0x02);
SEG2 = (bit)(*Tdat1&0x04);
SEG3 = (bit)(*Tdat1&0x08);
SEG4 = (bit)(*Tdat1&0x10);
SEG5 = (bit)(*Tdat1&0x20);
SEG6 = (bit)(*Tdat1&0x40);
SEG7 = (bit)(*Tdat1&0x80);
*Tdat2=SegBuf[7];
SEG8 = (bit)(*Tdat2&0x01);
COM3=0;
P1n_push_pull(1<<1);//P1^1输出 COM1
P1n_open_drain(1<<2);//P1^2高阻 COM3
P1n_open_drain(1<<3);//P1^3高阻 COM2
P1n_open_drain(1<<0);//P1^0高阻 COM0
break;
case 7: //COM3反向驱动
*Tdat1=~SegBuf[3];
SEG0 = (bit)(*Tdat1&0x01);
SEG1 = (bit)(*Tdat1&0x02);
SEG2 = (bit)(*Tdat1&0x04);
SEG3 = (bit)(*Tdat1&0x08);
SEG4 = (bit)(*Tdat1&0x10);
SEG5 = (bit)(*Tdat1&0x20);
SEG6 = (bit)(*Tdat1&0x40);
SEG7 = (bit)(*Tdat1&0x80);
*Tdat2=~SegBuf[7];
SEG8 = (bit)(*Tdat2&0x01);
COM3=1;
P1n_push_pull(1<<1);//P1^1输出 COM1
P1n_open_drain(1<<2);//P1^2高阻 COM3
P1n_open_drain(1<<3);//P1^3高阻 COM2
P1n_open_drain(1<<0);//P1^0高阻 COM0
break;
}
ScanCoun++; //下一位
if(ScanCoun>7)
ScanCoun=0;
TL0=0x78; //重新定时5ms
TH0=0xec;
ZZ++;
EA=1;
}
//5V供电单片机引脚直接驱动LCD屏幕(1/4BUTY,1/3BIAS),编译无错,就是没有搞懂那里出问题了,一直没有显示正确的数
|