点亮(8个共阴数码管)第一个并显示1

#include<reg52.h>
sbit wela=P2^0;//位选
sbit dula=P2^1;//段选
void main()
{
	wela=1;//位选打开,锁存器直通,可输入需存储的数据。
	P0=0xfe;//位选赋值。
	wela=0;//位选关闭,锁存器锁存,保持原状,不被改变。
	dula=1;//段选打开,锁存器直通,可输入需存储的数据。
	P0=0x06;//段选赋值。
	dula=0;//段选关闭,锁存器所存,保持原状,不被改变。
	while(1);//程序停止,死循环。
}

  

转载于:https://www.cnblogs.com/fengyepiaolei/archive/2011/11/18/2254544.html

文件名: LedDisp.h 版本号: v1.0.5 (v20091122.00001) 功能: 显示七段数码管风格的数字、小数点、冒号及部分字母。 (此版本理论上可用于MFC,Win32 SDK或其它环境,在Windows XP sp2下用vc6.0及vs2008编译、运行通过.) 第一作者: Jef 日期: 20091122 电子邮件: dungeonsnd@126.com 地址: 中国/江苏 版权: 1.您可以修改及免费使用本程序,但把本程序或修改后程序用于商业用途前请先通知第一作者得到作者的许可。 2.修改之后保留此文件开头处的文件说明信息更改副版本号(如 v20090825.00001 改成 v20091002.00001 )拷贝一份附上您的个人信息发送到上面的作者邮箱,作者负责在全面测试后发布您修改后的新版本。 3.您使用本程序而导致任何伤害以及经济损失,由过错方依法承担所有责任,一概与第一作者及合作单无关。 4.如果您使用本程序则表示您已经同意此版本协议!否则请勿使用! 其它: v1.0.1 (v20090825.00001) v1.0.2 (v20091026.00001) 1.增加Hide()方法 2.增加IsHide()方法 3.增加Disp(CDC* pdc,CRect DispRect,int iDigitsAmount,CString cs);方法 4.等 v1.0.3 (v20091031.00001) 1.增加多个小数点和冒号显示支持 2.增加GetLedFont()方法 3.修改了显示熄灭数码管的内部实现 4.等 v1.0.4 (v20091105.00001) 1.修改了SetSegmentPosition(int index)函数,增加内部属性 修正因子m_bMakeAmend, 设置修改因子为真时,在特殊情况下(如用户设置段宽度为2个像素或者1个像素), 程序将保证所有段的宽度相等,且保证段与段不会相连. 2.修改了保存显示区域背景机制! 前一版本在调用数码管显示函数(Disp()等函数)时会自动 保存一幅对应于显示区域RECT的图,此种机制当用户在OnPaint()函数里调用显示 函数而不调用Hide()时,且此时的RECT在每次调用显示函数时都改变,则会导致保存 背景图的向量m_vecBkSave不断扩大,而实际上保存的图将没有作用且浪费大量内存! 如: void CLEDView::OnPaint() { CPaintDC dc(this); OnShow(); //不断的以不同的RECT区域调用Disp()将导致保存的 //(对应于每个区域)数量剧增! } void CLEDView::OnShow() { CClientDC dc(this); CRect rtClient; GetClientRect(&rtClient); double m_x =rtClient.Width()/800.0; double m_y =rtClient.Height()/600.0; CRect rt0; rt0.SetRect(20*m_x,10*m_y,220*m_x,410*m_y); led.Disp((CDC*)&dc,rt0,1,_T("1:")); } 解决方案: 保存图将不再以RECT来标识,而是以一个用户输入的字符串来标识. 3. 添加MFC之外框架的支持.(未完成,未测试,希望测试的用户给作者联系测试结果.如WIN32 SDK,WTL等环境下.) v1.0.5 (v20091122.00001) 1. 增加UNICODE支持 2.完成MFC外的某些框架的支持 3.修改了和完善了某些代码段。如 删除保存背景的 向量某一元素之前先把其中的图删除; 内存dc用完之后添加删除操作 DeleteDC ; 构析函数中增加了删除 全部图资源操作 4. 修改了数个变量名使其更统一,如 SHOWPOS改成了iShowPos; 删除了某些接口,如 DispInt(); 2.说明及注意 (Attention!) a.支持 改变数码管亮时的颜色 灭时颜色 区域背景色,支持居左居中居右显示,支持细调显示(SetFont();)及数码管粗细等细节. 支持距离左或右一定距离显示字符串(m_iDistaceToRight). 支持创建不定数量的自定义字体(LedFontID来表示已创建的不同字体,已经创建过的字体被再次创建时则改写这个字体). 支持默认参数(调用时可以依次不传递有默认值参数). b.显示的字符的宽度与高度不随窗口的大小变化而自动变化,故调用者应自行处理. c.内部不含自动重画功能,故调用者应自己处理窗口重绘时字符的重新显示. d.字符串内可同时含 ":"与"." ,但字符串左起第一个字符不能为":"或"." ,且不能连续两个不点符号,如小数点或冒号!! e.能显示的字符包括 0-9,a-f,A-F,".",":","-" f.如 bool Disp(HDC hDc,RECT rtDispRect,TCHAR* cs,int iFontWidth,int iFontHeight,TCHAR* strIdentifier=_T("LedValue1")); 用户应自己设置好 rtDispRect与iFontWidth iFontHeight 的大小关系. 如果iFontHeight大于rtDispRect.Height(),则超出DispRect区域显示字符. 但左右可能不会超出显示(用户可设置m_bShowWhenOverstepRect来控制是否显示). 调用者应自己保证使字符串能全部显示在DispRect中,否则超出部分可能不会显示!!! g.当字符的宽度与数码管的每一段的宽度比例严重失调时,显示的字符会严重失真(如数码管每一段宽度为5个像素, 而长度却也为5像素则显示效果将失真)! 一般情况下,iFontHeight=2*m_iFontWidth,m_dSegmentWidth远小于m_iFontWidth h. led.SetColor(RGB(0,200,0)) 等方法会改变类的字体属性,故之后调用显示时字体属性都会发生改变. 但创建新的字体时不会改变类的字体属性. i.调用 Disp(...,strIdentifier)等此类数码管显示函数显示数码管后, 显示区域的背景及区域会自动保存. 1.再次调用Disp(...,strIdentifier)时会用新的显示区域的背景替换原背景及区域; 2.调用Hide(...,strIdentifier)方法时程序会自动删除strIdentifier对应原图及区域,然后隐藏该区域的数码管(用原背景图贴在此区域); 3.对象析构时会自动删除已经保存的所有的背景图及区域. 3.使用方法(仅举一种使用方法) (Using e.g.) i. void CLEDView::OnPaint() { CPaintDC dc(this); // device context for painting // TODO: Add your message handler code here OnShow(); // Do not call CView::OnPaint() for painting messages } void CLEDView::OnShow() { // TODO: Add your command handler code here CClientDC dc(this); CRect rtClient; GetClientRect(&rtClient); CBitmap bmp; bmp.LoadBitmap(IDB_BITMAP1); CDC memdc; memdc.CreateCompatibleDC(&dc); memdc.SelectObject(&bmp); dc.StretchBlt(0,0,rtClient.Width(),rtClient.Height(),&memdc,0,0, 800,600,SRCCOPY); double m_x =rtClient.Width()/800.0; double m_y =rtClient.Height()/600.0; CRect rt0; rt0.SetRect(int(20*m_x),int(10*m_y),int(420*m_x),int(80*m_y)); CString s; s ="123-:1:."; TCHAR str[256]; sprintf(str,"%s",s); led.DispDigits((HDC)dc,rt0,str,7,_T("Led1")); } void CLEDView::OnHide() { // TODO: Add your command handler code here CClientDC dc(this); led.Hide((HDC)dc,"Led1"); } ii. CClientDC dc(this); ...... CRect rt0; rt0.SetRect(int(20*m_x),int(10*m_y),int(420*m_x),int(80*m_y)); CString s; s ="123-:1:."; led.Disp_mfc((CDC*)&dc,rt0,s,27,45,_T("Led1")); */
### 数码管拼接概述 为了实现两共阴数码管的拼接,需要理解其基本工作原理以及具体的电气连接方式。共阴数码管的特点在于所有段的阴极端(即公共端)都已接地[^1]。因此,控制信号只需通过阳极输入即可点亮对应的段。 对于多数码管的设计,通常会采用动态扫描技术来减少所需的I/O引脚数量。这种技术的核心思想是对每一数码管依次刷新显示内容,利用人眼的视觉暂留效应形成稳定的显示效果[^2]。 --- ### 电路连接方式 #### 1. **段选线** 每数码管都有相同的段选线(a, b, c, d, e, f, g 和 dp)。这些段选线用于决定要显示的具体字符。由于两片四数码管的功能相同,可以将它们的段选线联在一起,由单路信号统一控制。 #### 2. **选线** 每一片四数码管都需要独立的选信号来激活当前需显示的一。假设第一数码管称为D1,第二数码管称为D2,则可以通过单独拉高某一选信号来选择该置上的数码管进行显示。具体来说: - D1选信号接到 MCU 的某个 I/O 引脚 P1。 - D2 的选信号接到另一个 I/O 引脚 P2。 当 P1 被置为低电平而其他保持高阻态时,仅 D1 工作;同理,P2 控制 D2 的状态。 #### 3. **驱动逻辑** 考虑到直接从微控制器输出可能无法提供足够的电流驱动 LED 段亮起,建议加入晶体管级放大器或者专用芯片作为缓冲器/驱动器。例如使用 NPN 类型三极管配合适当大小的限流电阻构成简单开关电路[^3]。 以下是基于上述描述的一个典型硬件配置实例: ```circuitikz \begin{circuitikz}[scale=0.7] % 绘制第一个数码管及其关联元件... \draw (0,0) node[dsp](DSP1){}; \foreach \s/\l in {a/A,b/B,c/C,d/D,e/E,f/F,g/G}{ \draw (\l |- DSP1.\s) -- ++(-1,0); } \draw (-1,-4) to[short,*-,o-*] (-1,-5);% 公共GND % 添加第二个相似结构... end{circuitikz} ``` 注意实际应用中还需要考虑抗干扰措施比如加滤波电容等细节处理[^4]。 --- ### 动态扫描程序框架 下面给出一段伪代码形式的Verilog片段展示如何轮询更新两个四字节显示器的内容: ```verilog reg [3:0] digit_data; // 当前待显数据 integer counter; always @(posedge clk or negedge reset_n) begin : proc_display_muxing if (!reset_n) begin mux_select <= 0; current_digit <= 4'b0000; end else begin case(mux_select) 2'd0: begin anodes <= 4'b1110; // Select first display only. segments <= decode(digit_data[3:0]); end 2'd1: begin anodes <= 4'b1101; // Switch over second one now. segments <= decode(digit_data[7:4]); end default: ; endcase // Cycle through multiplexed positions after brief delay. if(counter >= MAX_COUNT_VALUE){ mux_select <= mux_select + 1; counter <= 0; }else{ counter <= counter + 1; } end end ``` 此模块假定存在函数`decode()`负责把BCD编码转换成七段译码表格式,且变量`anodes[]`定义了哪些显示屏被使能。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值