#include "reg52.h"
typedef unsigned int u16; //对数据类型进行声明定义
typedef unsigned char u8;
sbit C1=P2^7;
sbit C2=P2^6;
sbit C3=P2^5;
sbit C4=P2^4;
/*
sbit W0=P1^3; //数据最好归结倒一个口线组上去,如果依然保持这个定义,请另行添加程序处理
sbit W1=P1^2; // */
sbit W0=P0^0;
sbit W1=P0^1;
sbit W2=P0^2;
sbit W3=P0^3;
sbit W4=P0^4;
sbit W5=P0^5;
sbit W6=P0^6;
sbit W7=P0^7;
unsigned char SMGDUAN_CA[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90, 0x??};//共阳极0 1 2 3~9,最后一位是E显示
unsigned char display_buffer[4]; //显示缓存
unsigned char number = 0;
unsigned char display_place; //显示位号,可以不初始化
unsigned int len_time = 0;
unsigned int count=9986;
void displaySMG_4Bit(unsigned int dat); //显示数据缓存装载
unsigned char displaySMG_Bit(u8 pos,u8 *dat); //显示驱动
//void dis(unsigned char i); //显示
void delaySMG(unsigned int n)
{
while(n--);
}
unsigned char displaySMG_Bit(unsigned char pos,unsigned char *dat) //显示的哪一位,在什么位置
{
//显示消隐
P0 = 0xFF; //反偏
P2 &= 0x0F;
//位显示
if(pos > 3) pos = 0;
P0 = dat[pos]; //先置位显示数据,避免出现鬼影
P2 |= 1 << (4 + pos);
return pos ++; //返回增加值,或者这里用一个局部全局私有变量则不需要返回
}
void displaySMG_4Bit(unsigned int dat)
{ //数据线不在一组口编组里这里要分离处理
if(da > 9999) //错误处理,显示EEEE
{
display_buffer[0] = SMGDUAN_CA[10];
display_buffer[1] = SMGDUAN_CA[10];
display_buffer[2] = SMGDUAN_CA[10];
display_buffer[3] = SMGDUAN_CA[10];
}
else
{
display_buffer[3] = SMGDUAN_CA[dat/1000]; //装载显示千位
display_buffer[2] = SMGDUAN_CA[dat%1000/100]; //装载显示百位
display_buffer[1] = SMGDUAN_CA[dat%100/10]; //装载显示十位
display_buffer[0] = SMGDUAN_CA[dat%10]; //装载显示个位
} }
void delay_ms(u8 num_ms)
{
}
void delay_s(u8 num_s)
{
}
void main()
{
//初始化注意有没有方向设置
while(1)
{
//显示0000~9999 -> EEEE
for(number = 0; number < 11; number ++)
{ //非定时器定时,程序延时
len_time = 0;
displaySMG_4Bit(number*1111); //显示0000~9999 -> EEEE
while(len_time < TemerS) //自定义显示时间 = TemerS × 10ms 这里取300 = 3秒
{
display_place = displaySMG_Bit[display_place, display_buffer];
delay_ms(10); //10ms延时,保证每秒每一位数码管被扫描20次以上,否则会有闪烁,
} }
displaySMG_4Bit(count); //显示9986
while(1)
{
display_place = displaySMG_Bit[display_place, display_buffer];
delay_ms(10);
}
} }
|