怎么才能把这个状态机数码管动态扫描改成共阴极的?

2020-01-25 15:37发布

#include <REGX52.H>
#define   LED_PORT P1
unsigned int g_u8LedDisplayBuffer[8]={0}; //显示缓冲区
code unsigned int g_u8LedDisplayCode[]=
{
0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,
0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0x40
};
sbit io_led_seg_cs=P2^0;
sbit io_led_bit_cs=P2^1;
bit  g_bSystemTime2Ms=0; // 2msLED 动态扫描时标消息

static void SendLedSegData(unsigned int dat)
{
LED_PORT=dat;
io_led_seg_cs=1; //开段码锁存,送段码数据
io_led_seg_cs=0 ;
}
static void SendLedBitData(unsigned int dat)
{
unsigned int temp;
temp=(0xfe<<dat); //根据要选通的位计算出位码
LED_PORT=temp;
io_led_bit_cs=1; //开位码锁存,送位码数据       
io_led_bit_cs=0;
}
void LedDisplay(unsigned int *pBuffer)
{
static unsigned int s_LedDisPos=0;
if(g_bSystemTime2Ms)
{
g_bSystemTime2Ms=0;
SendLedBitData(8); //消隐,只需要设置位选不为0~7 即可
if(pBuffer[s_LedDisPos]== '-') //显示'-'号
{
SendLedSegData(g_u8LedDisplayCode[16]) ;
}
else
{
SendLedSegData(g_u8LedDisplayCode[pBuffer[s_LedDisPos]]) ;
}
SendLedBitData(s_LedDisPos);
if(++s_LedDisPos >7)
{
s_LedDisPos=0;
}
}
}

void Timer0Init( )
{
TMOD=0xf0;
TMOD=0x01; //定时器0 工作方式1
TH0=0xf8; //定时器初始值
TL0=0xcc;
TR0=1;
ET0=1;
}
void Time0Isr( ) interrupt 1
{
TH0=0xf8; //定时器重新赋初值
TL0=0xcc;
g_bSystemTime2Ms=1; //2MS 时标标志位置位
}
压缩包里包含了仿真文件,请高手帮看下 状态机动态显示.rar (58.87 KB, 下载次数: 10) 2013-11-21 22:03 上传 点击文件名下载附件
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
11条回答
4758866
1楼-- · 2020-01-26 08:08
看出点问题了,明天再试试看吧
xou822
2楼-- · 2020-01-26 13:01
 精彩回答 2  元偷偷看……
liushiming82
3楼-- · 2020-01-26 18:21
同意4楼的,只需要改变位选,段选不需要改变,但是相关硬件电路要以身以身改变,编码要用共阴的编码
4758866
4楼-- · 2020-01-26 19:58
还是没弄出来,,,,,,,
4758866
5楼-- · 2020-01-26 21:55
终于搞出来了.现在才发现各位说的都是对的只是自己太笨了,没理解透

一周热门 更多>