单片机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 475|回复: 9
收起左侧

有一种LCD叫段氏(Proteus仿真电路,单片机驱动段式液晶源码)

  [复制链接]
areyouok 发表于 2018-12-13 06:21 | 显示全部楼层 |阅读模式
1223.jpg 0.png


单片机驱动源程序:
#include <reg52.h>
#include <stdio.h>
// 管脚定义
sbit COM0=P3^5;
sbit COM1=P3^4;
sbit COM2=P3^3;
sbit COM3=P3^2;
sbit BI_4=P3^7;
sbit RTC_CLK=P3^0;
sbit RTC_IO=P3^1;
sbit RTC_RST=P3^7; // 复用
//P3 口模式寄存器
sfr P3M1=0xb1;
sfr P3M0=0xb2;

void dly(unsigned char x)
{
        unsigned char i;
        for (i=0; i<x; i++);
}


void ini_rtc()
{
        RTC_CLK=0;
        RTC_RST=0;
        dly(30);
        
        RTC_RST=1;
        rtc_wt_byte(0x8e); // 写CONTROL 寄存器
        rtc_wt_byte(0x00); // 值: 去掉写保护
        RTC_RST=0; // 复位
        RTC_RST=1; // 正常工作
        rtc_wt_byte(0x90); // 写TRICKLE CHARGE寄R存器
        rtc_wt_byte(0xa9); // 值: 使能充电,串联2 个二极管,串联2k 欧姆的电阻
        RTC_CLK=0;
        RTC_RST=0;
}


void Seg2Seg()
{
        unsigned char SegXX;
        SegBuf[0]=0;
        SegBuf[1]=0;
        SegBuf[2]=0x08;
        SegBuf[3]=0;
        bi_4a=0;
        bi_4b=0;
        bi_4c=0;
        
        SegXX=seg_code[DisplayBuf[0]]; // 第1 位数字
        
        if (SegXX&0x80) SegBuf[0]|=0x40;
        if (SegXX&0x40) SegBuf[1]|=0x40;
        if (SegXX&0x20) SegBuf[2]|=0x40;
        if (SegXX&0x10) SegBuf[3]|=0x80;
        if (SegXX&0x08) SegBuf[2]|=0x80;
        if (SegXX&0x04) SegBuf[0]|=0x80;
        if (SegXX&0x02) SegBuf[1]|=0x80;
        if (SegXX&0x01) SegBuf[3]|=0x40;
        
        SegXX=seg_code[DisplayBuf[1]]; // 第2 位数字
        
        if (SegXX&0x80) SegBuf[0]|=0x10;
        if (SegXX&0x40) SegBuf[1]|=0x10;
        if (SegXX&0x20) SegBuf[2]|=0x10;
        if (SegXX&0x10) SegBuf[3]|=0x20;
        if (SegXX&0x08) SegBuf[2]|=0x20;
        if (SegXX&0x04) SegBuf[0]|=0x20;
        if (SegXX&0x02) SegBuf[1]|=0x20;
        if (SegXX&0x01) SegBuf[3]|=0x10;
        
        SegXX=seg_code[DisplayBuf[2]]; // 第3 位数字
        
        if (SegXX&0x80) SegBuf[0]|=0x02;
        if (SegXX&0x40) SegBuf[1]|=0x02;
        if (SegXX&0x20) SegBuf[2]|=0x02;
        if (SegXX&0x10) SegBuf[3]|=0x04;
        if (SegXX&0x08) SegBuf[2]|=0x04;
        if (SegXX&0x04) SegBuf[0]|=0x04;
        if (SegXX&0x02) SegBuf[1]|=0x04;
        if (SegXX&0x01) SegBuf[3]|=0x02;
        
        SegXX=seg_code[DisplayBuf[3]]; // 第4 位数字
        
        if (SegXX&0x80) bi_4a=1;
        if (SegXX&0x40) bi_4b=1;
        if (SegXX&0x20) bi_4c=1;
        if (SegXX&0x10) SegBuf[3]|=0x01;
        if (SegXX&0x08) SegBuf[2]|=0x01;
        if (SegXX&0x04) SegBuf[0]|=0x01;
        if (SegXX&0x02) SegBuf[1]|=0x01;
}



BcdToDec(unsigned char BcdValue,unsigned char *pDecValue)
{
        //if (BcdValue>=0x9a||(BcdValue&0x0f)>=0x0a) return 0;
        *pDecValue++=(BcdValue&0xf0)>>4;
        *pDecValue=BcdValue&0x0f;
        //return 1;
}



InitInterResource()
{
        IE=0; // 关全部中断
        TCON=0; // 清全部中断请求
        IP=0; // 清中断优先级
        TMOD=0x01; //T0 工作方式1(16 位定时器)
        TH0=0x00; //T0 定时器辅初值
        TL0=0x00;
        TR0=1; // 允许T0 定时
        ET0=1; // 允许T0 中断
        EA=0; // 关全局中断
        RTC_RST=0;
}

void main()
{
        InitInterResource();
        ini_rtc(); // 初始化DS1302
        rtc_wr_time(ClockBuffer); // 写入时间初始值
        EA=1; // 开全局中断
        while(1)
        {
               
        }  
}


void tmr0_p(void) interrupt 1
{
        TL0=0x78; // 重新定时5ms
        TH0=0xec;
        Seg2Seg();
        P3M1=0x3c;
        P3M0=0x00;
        switch(ScanCoun) // 动态扫描显示
        {
        case 0: //COM0 正向驱动
                P1= SegBuf[0];
                BI_4= bi_4a;
                COM0=0;
                P3M1=0x1c; // 除COM0输出外,其余COM设为输入
                P3M0=0x00;
                break;
        case 1: //COM0 反向驱动
                P1= ~SegBuf[0];
                BI_4= ~bi_4a;
                COM0=1;
                P3M1=0x1c;
               
               
                P3M0=0x00;
                break;
        case 2: //COM1 正向驱动
                P1= SegBuf[1];
                BI_4= bi_4b;
                COM1=0;
                P3M1=0x2c;
                P3M0=0x00;
                break;
        case 3: //COM1 反向驱动
                P1= ~SegBuf[1];
                BI_4= ~bi_4b;
                COM1=1;
                P3M1=0x2c;
                P3M0=0x00;
                break;
        case 4: //COM2 正向驱动
                P1= SegBuf[2];
                BI_4= bi_4c;
                COM2=0;
                P3M1=0x34;
                P3M0=0x00;
                break;
        case 5: //COM2 反向驱动
                P1= ~SegBuf[2];
                BI_4= ~bi_4c;
                COM2=1;
                P3M1=0x34;
                P3M0=0x00;
                break;
        case 6: //COM3 正向驱动
                P1= SegBuf[3];
                COM3=0;
                P3M1=0x38;
                P3M0=0x00;
                RTC_RST=0;
               
               
                rtc_rd_time(ClockBuffer); // 读时间
                BcdToDec(ClockBuffer[0],DisplayBuf+2); // 秒送入显示缓冲
                BcdToDec(ClockBuffer[1],DisplayBuf); // 分送入显示缓冲
                BI_4= ~bi_4c;
                break;
        case 7: //COM3 反向驱动
                P1= ~SegBuf[3];
                COM3=1;
                P3M1=0x38;
                P3M0=0x00;
                break;
        }
        ScanCoun++; // 下一位
        if (ScanCoun>7) ScanCoun=0;
}


附件中有完整仿真电路,源码
全部资料51hei下载地址:
有一种LCD叫段氏.zip (26.04 KB, 下载次数: 46)

评分

参与人数 5黑币 +193 收起 理由
Sawardeakar + 35
sheng7533967 + 8 赞一个!
刀刀见红 + 15 共享资料的黑币奖励!
shuisheng + 35 绝世好帖!
admin + 100 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

zmc419 发表于 2018-12-15 15:06 | 显示全部楼层
很好,实验已通过
回复

使用道具 举报

jhczy 发表于 2018-12-15 20:16 | 显示全部楼层
LCD屏的真值表吗?
回复

使用道具 举报

 楼主| areyouok 发表于 2018-12-18 18:07 | 显示全部楼层
不是LCD屏,是段式液晶,原来的电子表,计算器用的很多,现在的使用也很多。网上讲LCD1602的例子很多多,这种却少!

评分

参与人数 3黑币 +45 收起 理由
yoxi + 15
#include51.h + 15 绝世好帖!
Sawardeakar + 15 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

qzyhlf 发表于 2019-1-8 16:32 | 显示全部楼层
好资料,51黑有你更精彩!!!
回复

使用道具 举报

紫色的云 发表于 2019-1-10 09:40 | 显示全部楼层
谢谢楼主的资料,学习了,
回复

使用道具 举报

Sawardeakar 发表于 2019-2-2 19:01 | 显示全部楼层
好,找了好久的仿真器件

评分

参与人数 2黑币 +47 收起 理由
jinsheng7533967 + 35 很给力!
shuisheng60 + 12

查看全部评分

回复

使用道具 举报

Sawardeakar 发表于 2019-2-3 19:24 | 显示全部楼层
真的j 很不错的好东西

评分

参与人数 1黑币 +35 收起 理由
jinsheng7533967 + 35 很给力!

查看全部评分

回复

使用道具 举报

就你?呸! 发表于 2019-2-11 13:39 | 显示全部楼层
超级大帖!谢谢了!

评分

参与人数 1黑币 +35 收起 理由
jinsheng7533967 + 35

查看全部评分

回复

使用道具 举报

sheng7533967 发表于 2019-2-13 16:37 | 显示全部楼层
实验已通过
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|单片机论坛 |51黑电子论坛单片机.

Powered by 单片机教程网

快速回复 返回顶部 返回列表