标题:
光柱的单片机驱动程序(所有LED排列在一条直线上)
[打印本页]
作者:
mp3
时间:
2019-4-23 16:48
标题:
光柱的单片机驱动程序(所有LED排列在一条直线上)
光柱的显示原理其实和LED点阵差不多,只不过是把所有LED排列在一条直线上,形成一条光柱,驱动时按段、按线扫描点亮即可。
本程序使用的硬件见
http://www.51hei.com/bbs/dpj-156818-1.html
单片机源程序如下:
/* 104线光柱的显示
硬件型号:UQK-H101型显示仪表。
P2为8条线的开关,P0低4位为13段的开关。
*/
#include <at89x51.h>
#define uchar unsigned char
#define uint unsigned int
#define TIMER0 1000 //数码管刷新率50Hz
#define MAX_CNT 1000 //累计1秒的最大计数值
#define TIMER0_HIGH (65536 - TIMER0)/256
#define TIMER0_LOW (65536 - TIMER0)%256
uchar bdata led; // 低4位为LED显示状态(定时器开关状态)
code uchar disp_seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
code uchar disp_row[]={0xfc,0xfd,0xfb,0xfa,0xf9,0xf6,0xf8,0xf5,0xf4,0xf3,0xf2,0xf1,0xf0};
uchar disp_buf[4]; // bit7: 不显示; bit4: 闪烁; bit3~0: 0~9,a,B,c,d,E,F
uint tm_cnt; // 累计1秒的计数
uchar disp_bar; // 0~100
intr_t0() interrupt 1
{
uchar i, j, ch;
tm_cnt++;
TL0+=TIMER0_LOW;
TH0=TIMER0_HIGH+(uchar)CY;
if(tm_cnt>=MAX_CNT)
tm_cnt=0;
// LED、数码管、光柱的显示
i=tm_cnt%20;
if(i==4)
{
P0=0xff;
P2=~led|0xf0;
P0=0xfe; //打开阳极
}
else if(i<4)
{
ch=disp_buf[i];
if(ch&0x80 || ch&0x10 && tm_cnt>=MAX_CNT/2)
P0=0xff;
else
{
if(i==0 && tm_cnt<MAX_CNT/2)
j=0x7f; //显示小数点
else
j=0xff;
P0=0xff;
P2=disp_seg[ch&0x0f]&j;
P0=~(1<<i+4);
}
}
else
{
i-=5;
if(i<13)
{
if(disp_bar==0)
j=14; //不显示
else
j=(disp_bar-1)/8; //要显示的段(0~j)
ch=0xff;
if(i<j && j<13)
ch=0;
else if(i==j)
{
j=(disp_bar-1)%8;
do
ch>>=1;
while(j--!=0);
}
P0=0xff;
P2=ch;
P0=disp_row[i];
}
}
}
sbit SCLK=P1^1; //I/O时钟
sbit CS=P1^0; //片选
sbit SDO=P1^2; //数据线
uchar TLC549_ADC(void)
{
uchar i, dat=0;
SCLK=0;
CS=0;
for(i=0;i<8;i++)
{
SCLK=1; // 上升沿读数据
dat<<=1;
dat|=SDO;
SCLK=0;
}
CS=1;
return(dat);
}
void main()
{
uchar i;
uint ii;
TMOD=0x01;
TH0=TIMER0_HIGH;
TL0=TIMER0_LOW;
PT0=1;
ET0=1;
EA=1;
TR0=1;
……………………
…………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
TLC549.rar
(1.24 KB, 下载次数: 9)
2019-4-23 16:46 上传
点击文件名下载附件
带光柱显示的电压表
下载积分: 黑币 -5
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1