|
#include<STC8xxxx.h>
#include <stdio.h>
#include "intrins.h"
/************* 外部函數(shù)和變量聲明 *****************/
#define uint unsigned int
#define uchar unsigned char
uchar ScanCoun,ZZ;
#define MAIN_Fosc 22118400L //定義主時(shí)鐘
//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; //動(dòng)態(tài)掃描顯示位數(shù)計(jì)數(shù)器
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
////段碼緩沖區(qū)
uchar SegBuf[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};//COM1、COM2、COM3、COM4對(duì)應(yīng)的段碼緩沖
/////////////延時(shí) ms//////////////
void DelayMS(uint ms)
{
uchar i,j;
for(i=0; i<250; i++)
for(j=0; j<200;j++);
}
//COM口設(shè)置高阻態(tài)
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; //一定要設(shè)置為0,輸出緩存初始化
SegBuf[2]=0x00;SegBuf[3]=0x00;
SegBuf[4]=0x00;SegBuf[5]=0x00;
SegBuf[6]=0x00;SegBuf[7]=0x00;
//把3位數(shù)字的SEG放到COM1、COM2、COM3、COM4對(duì)應(yīng)的SEGBUF[]里面
//LCD的管腳定義與LED不同,不是一個(gè)COM對(duì)應(yīng)一位數(shù)字,而是對(duì)應(yīng)每個(gè)數(shù)字的一部分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位數(shù)字
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位數(shù)字
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位數(shù)字
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); //符號(hào)顯示
// 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; //&
}
/*******************************************
/////////////定時(shí)器初始化////////////
********************************************/
void InitInterResource()
{
IE=0; //關(guān)全部中斷
TCON=0; //清全部中斷請(qǐng)求
IP=0; //清中斷優(yōu)先級(jí)
TMOD=0x01; //T0工作方式1(16位定時(shí)器)
TH0=0xEC; //T0定時(shí)器輔初值
TL0=0x78;
TR0=1; //允許T0定時(shí)
ET0=1; //允許T0中斷
EA=0; //關(guān)全局中斷
}
void main()
{
DelayMS(20);
IO_set();
InitInterResource();
EA=1; //開全局中斷
while(1);
}
void tmr0_p(void) interrupt 1
{
Seg2Seg();
switch(ScanCoun) //動(dòng)態(tài)掃描顯示
{
case 0: //COM0正向驅(qū)動(dòng)
*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反向驅(qū)動(dòng)
*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正向驅(qū)動(dòng)
*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反向驅(qū)動(dòng)
*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正向驅(qū)動(dòng)
*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反向驅(qū)動(dòng)
*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正向驅(qū)動(dòng)
*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反向驅(qū)動(dòng)
*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; //重新定時(shí)5ms
TH0=0xec;
ZZ++;
EA=1;
}
//5V供電單片機(jī)引腳直接驅(qū)動(dòng)LCD屏幕(1/4BUTY,1/3BIAS),編譯無(wú)錯(cuò),就是沒(méi)有搞懂那里出問(wèn)題了,一直沒(méi)有顯示正確的數(shù)
|
|