数码管显示时间及点阵显示字符

合集下载

数码管显示字符 ppt课件

数码管显示字符 ppt课件

中断源


0




级 中断入口
中断源
SCON
3、TF0(TCON.5),片内定时/计数器T0 溢出中断请求标志。当定时/计数器T0发生 溢出时,置位TF0,并向CPU申请中断。
数码管显示字符
TCON
IE
IP
硬件查询
INT0 IT0 1
01
T0 INT1 IT1 1
01
T1
RX TX
EX0 1 EA 1 IE0
液晶LCD(Liquid Crystal Display)显示器、CRT显示器 等。LED、LCD显示器有两种显示结构:段显示(7 段、米字型等)和点阵显示(5×8、8×8点阵等)。
数码管显示字符
精品资料
• 你怎么称呼老师?
• 如果老师最后没有总结一节课的重点的难点,你 是否会认为老师的教学方法需要改进?
• 你所经历的课堂,是讲座式还是讨论式? • 教师的教鞭
• “不怕太阳晒,也不怕那风雨狂,只怕先生骂我 笨,没有学问无颜见爹娘 ……”
• “太阳当空照,花儿对我笑,小鸟说早早早……”
精品资料
g f GNDa b a
a
b
c
f
b
g
d
e
c
e
d ·dp
f g
dp
e d GND c dp
(a)
共阴极
+5V
数码管显示字符
二、中断优先级控制
80C51单片机有两个中断优先级,即可实现二级 中断服务嵌套。每个中断源的中断优先级都是由中断 优先级寄存器IP中的相应位的状态来规定的 。
▪PX0(IP.0),外部中断0优先级设定位; ▪PT0(IP.1),定时/计数器T0优先级设定位; ▪PX1(IP.2),外部中断0优先级设定位; ▪PT1(IP.3),定时/计数器T1优先级设定位; ▪PS (IP.4),串行口优先级设定位; ▪PT2 (IP.5) ,定时/计数器T2优先级设定位。

数码管显示时间及点阵显示字符

数码管显示时间及点阵显示字符

数码管显示时间及点阵显示字符//数码管显示时间及点阵显示字符#include#include#define uchar unsigned char#define uint unsigned int//定义Max7219端口#define DUAN P0 //P0口控制段#define WEI P2 //P2口控制位sbit k_hour=P1^0; // 更改小时按键sbit k_min=P1^1; // 更改分钟按键sbit k_sec=P1^2; // 更改秒按键//定义数码管端口sbit Max7219_pinCLK = P1^2;sbit Max7219_pinCS = P1^1;sbit Max7219_pinDIN = P1^0;//Max7219位定义unsigned char key; //P3按键扫描(执行模块控制)code uchar seg7code[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0XBF }; //显示段码数码管字跟uchar wei[8]={0XFE,0XFD,0XFB,0XF7,0XEf,0XDf,0XBf,0X7f}; //位的控制端uchar numb[8]; //定义字符串uint sec=0,min,hour;//数码管初始定义uchar code disp2[7][8]={{0x00,0x3E,0x2A,0xFF,0xAA,0xBE,0xC0,0x00}, //电{0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x00}, //一{0x00,0x00,0x1E,0x20,0x40,0x20,0x1E,0x00}, //V {0x00,0x00,0x4E,0x4A,0x4A,0x7A,0x00,0x00}, //5 {0x00,0x00,0x42,0x7E,0x42,0x00,0x00,0x00}, //I {0x00,0x0C,0x1E,0x3C,0x3C,0x1E,0x0C,0x00}, //love {0x00,0x00,0x3E,0x40,0x40,0x3E,0x00,0x00}, //U };char flag;//定义点阵显示字符void Delay_xms(uint x){uint i,j;for(i=0;i<x;i++)< p="">for(j=0;j<300;j++);}//公用的延时程序//功能:向MAX7219(U3)写入字节//入口参数:DATA//出口参数:无void Write_Max7219_byte(uchar DATA){uchar i;Max7219_pinCS=0;for(i=8;i>=1;i--){Max7219_pinCLK=0;Max7219_pinDIN=DATA&0x80;DATA=DATA<<1;if(flag)Delay_xms(500);Max7219_pinCLK=1;}}//功能:向MAX7219写入数据//入口参数:address、dat//出口参数:无//说明:void Write_Max7219(uchar address,uchar dat){Max7219_pinCS=0;Write_Max7219_byte(address); //写入地址,即数码管编号Write_Max7219_byte(dat); //写入数据,即数码管显示数字Max7219_pinCS=1;}void Init_MAX7219(void){Write_Max7219(0x09, 0x00); //译码方式:BCD码Write_Max7219(0x0a, 0x03); //亮度Write_Max7219(0x0b, 0x07); //扫描界限;8个数码管显示Write_Max7219(0x0c, 0x01); //掉电模式:0,普通模式:1Write_Max7219(0x0f, 0x00); //显示测试:1;测试结束,正常显示:0 }void t_to_dis(){numb[0]=hour/10; //显示小时十位numb[1]=hour%10; //显示小时个位numb[2]=10; //显示横杠numb[3]=min/10; //显示分十位numb[4]=min%10; //显示分个位numb[5]=10; //显示横杠numb[6]=sec/10; //显示秒十位numb[7]=sec%10; //显示秒个位</x;i++)<>。

16-32点阵数字钟及汉字显示

16-32点阵数字钟及汉字显示

16*32点阵数字钟及汉字显示一.电路原理框架设计制作作品:16×32点阵显示数字钟及汉字显示实现功能:点阵显示的实时时钟以及汉字等字符的左移显示实用特征:采用双电源供电,断电后时钟由电池供电还能继续运行,而且精确性较高实现原理:1.时钟显示是由DS1302精确的时钟芯片产生时钟信号并将其送至单片机,经过单片机处理后再输送到点阵显示模块。

2.汉字显示并左移原理是先写入与本点阵驱动相应的代码进单片机,通过单片机控制程序取表进行处理后送点阵模块显示电路主要模块及原理图:1.单片机最小系统及控制按键电路2.DS1302与单片机接口电路DS1302除了系统上电时由系统供电外,如果主电源断电还有一电池给DS1302供电,防止断电后DS1302数据消失。

4.点阵行驱动模块电路行驱动采用74LS154(4-16线译码器)及PNP三极管,由于是16×32点阵显示功率较大故采用8550NP三极管。

5.点阵列驱动电路列驱动采用74HC595移位寄存器将控制位级连接入单片机,每个74HC595数据输入端单独接单片机。

16×32点阵模块由8块小的8×8点阵模块通过级连而拼成,共16行,32列。

二:主要元器件选择:单片机:AT89S51采用市场上比较常用的STC89C51三极管:点阵的行驱动电路用,这里采用PNP管,具体型号用8550 点阵块:为了电路简单,采用双色8×8点阵晶振:采用的是12MHZ的晶振电源部分:采用5V电压供电,采用的是L7805稳压芯片供电电阻:大部分是限流电阻,阻值为4.7K或10K,1K译码器:4-16线采用市场上较为常用的74LS154,用来作行驱动移位寄存器:采用74HC595移位寄存器作列驱动,驱动列端口分配及连接:P1.0-P1.2:DS1302与单片机接口P1.3-P1.4:K0,K1按键,用来调整时间,按下为0P0:P0口接点阵行驱动电路接译码器P2:P2口点阵列驱动电路接74HC595最后是做好之后的图。

8位数码管显示电子时钟c51单片机程序

8位数码管显示电子时钟c51单片机程序

8位数码管显示电子时钟C51单片机程序时间:2012-09-10 13:52:26 来源:作者:/*8位数码管显示时间格式51 用于小时加1操作52 用于小时减1操作53 用于分钟加1操作54 用于分钟减1操作05 —50—00 标示05点50分00秒*/#inClude<>sbit KEY仁P39 // sbit KEY2=P3A1; 定义端口参数sbitKEY3=P3A2;sbit KEY4=P3A3;sbit LED=P1A2; // 定义指示灯参数Code unsigned Char tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 共阴极数码管0—9 unsigned Char StrTab[8]; // 定义缓冲区unsigned Char minute=19,hour=23,seCond; // 定义并初始化为12:30:00void delay(unsigned int Cnt){while(--Cnt);}/****************************************************************/* 显示处理函数*//******************************************************************/void Displaypro(void){StrTab[0]=tab[hour/10]; //显示小时StrTab[1]=tab[hour%10];StrTab[2]=0x40; // 显示"-"StrTab[3]=tab[minute/10]; // 显示分钟StrTab[4]=tab[minute%10];StrTab[5]=0x40; // 显示"-"StrTab[6]=tab[seCond/10]; // 显示秒StrTab[7]=tab[seCond%10];}main()TMOD |=0x01; TH0=0xd8; // TL0=0xf0; // 定时器 0 10ms inM crystal 初值用于计时ET0=1; TR0=1; TMOD |=0x10; TH1=0xF8; TL1=0xf0; // //定时器 1用于动态扫描初值ET1=1; TR1=1; EA =1; Displaypro(); while(1){ //调用显示处理函数if(!KEY1){//按键 1去抖以及动作delay(10000); if(!KEY1){hour++;if(hour==24)hour=0;Displaypro();// 正常时间 小时 加 1if(!KEY2) // 按键 2去抖以及动作delay(10000); if(!KEY2){hour--;if(hour==255)hour=23;//正常时间 小时减1Displaypro();}if(!KEY3){delay(10000); if(!KEY3) {//按键去抖以及动作minute++;if(minute==60)minute=0; Displaypro(); // 分加1} }if(!KEY4) //{delay(10000);if(!KEY4){minute--;if(minute==255)minute=59;Displaypro(); 按键去抖以及动作// 分减1/****************************************************************/* 定时器1中断/**************************************************************** void time1_isr(void) interrupt 3 using 0 //{static unsigned char num;TH1=0xF8; // 重入初值TL1=0xf0;switch (num){case 0:P2=0;P0=StrTab[num];break; //case 1:P2=1;P0=StrTab[num];break;case 2:P2=2;P0=StrTab[num];break;case 3:P2=3;P0=StrTab[num];break;case 4:P2=4;P0=StrTab[num];break;case 5:P2=5;P0=StrTab[num];break;case 6:P2=6;P0=StrTab[num];break;case 7:P2=7;P0=StrTab[num];break;default:break;*/定时器1用来动态扫描分别调用缓冲区的值进行扫描} num++; //if(num==8) 扫描8次,使用8个数码管}num=0;**************************************************************定时器0中断*/ /***************************************************************void tim(void) interrupt 1 using 1{static unsigned char count; //TH0=0xd8; // 重新赋值TL0=0xf0;count++;switch (count){case 0:case 20:case 40:case 60:case 80:Displaypro();break; // case50:P1=~P1;break; // default:break;}if (count==100){count=0;second++; // 秒加 1 if(second==60){second=0;minute++; // if(minute==60) {minute=0;hour++; // if(hour==24) hour=0;}定义内部局部变量隔一定时间调用显示处理半秒LED 闪烁分加1时加1基于单片机的LCD1602空制总线模式时间:2012-09-10 13:50:39 来源:作者:第一行显示"Welcome"; 第二行显示="Happy day"; 若要显示其他字符,请直接往数组LCMLineOne[16] 和LCMLineTwo[16] 填充相应的代码。

数码管显示(全面)

数码管显示(全面)

• 程序设计内容
由于显示的数字0-9的字形码没有规律可循,只能采用 查表的方式来完成P0口对数码管的控制。方法是找出 共阴极数码管显示0-9的字形码,按着数字0-9的顺序, 把这十个字形码放入数组table[]中。
• C语言源程序 • 调试与仿真
4.3 I/O口应用实例与仿真
例4.6 动态数码管显示的proteus仿真及C语言 程序设计
4.3 I/O口应用实例与仿真
• 程序设计内容
(1)动态扫描方法:动态扫描采用各数码管循环轮流 显示的方法,本例中,先让左边第一位数码管显示数 字“1”,延时一定时间后,第二位显示“2”,以此类 推,到第五位显示“5”后,又从“1”开始循环显示。 当循环显示频率较高时,利用人眼的暂留特性,我们 看到这五位数码管仿佛在同时显示,而看不出闪烁显 示现象。这种显示需要一个接口完成字形码的输出 (字形选择),另一接口完成各数码管的轮流点亮 (数位选择)。需要注意一点,由于电路的特性,在 点亮每一位数码管之前,一定要对整个数码管清屏 (场消隐),即让所有位选信号都处于不被选中状态。
g f GND a b a a f e d g b c dp b c d e f g dp a b c d e f g dp
+5V
·
e d GND c dp
(a)
共阴极
(b)
共阳极
使用LED显示器时,要注意区分这两种不同的接法。为了显 示数字或字符,必须对数字或字符进行编码。七段数码管加上一 个小数点,共计8段。因此为LED显示器提供的编码正好是一个字 节。TX-1B实验板用共阴LED显示器,根据电路连接图显示16进制
数码管是如何显示出字符的 数码管静态显示与动态显示原理
显示器及其接口

(汇编)实现数码管显示年,月,日,时,分,秒,星期,温度,按键可调万年历

(汇编)实现数码管显示年,月,日,时,分,秒,星期,温度,按键可调万年历

;///////////////////////////////////////////;本程序源代码由湖南工程职业技术学院提供.;专业单片机培训,让你学习单片机更容易.;程序员:蒋庆桥;QQ:xxxxxxxxx;本程序用汇编实现数码管显示年,月,日,时,分,秒,星期,温度,按键可调万年历,H_ADJ BIT P3.0 ;时/年调整M_ADJ BIT P3.1 ;分/月调整S_ADJ BIT P1.4 ;秒/日调整DT_SET BIT P1.6 ;时间/日期选择STR BIT P1.5;启动走时T_RST BIT P1.0 ;实时时钟复位线引脚T_CLK BIT P1.1 ;实时时钟时钟线引脚T_IO BIT P1.2 ;实时时钟数据线引脚HH_BIT EQU 40H ;时高位HL_BIT EQU 41H ;时低位MH_BIT EQU 42H ;分高位ML_BIT EQU 43H ;分低位SH_BIT EQU 44H ;秒高位SL_BIT EQU 45H ;秒低位TEMPER_L EQU 46HTEMPER_H EQU 47HYH_BIT EQU 48H ;年高位YL_BIT EQU 49H ;年低位MOH_BIT EQU 4aH ;月高位MOL_BIT EQU 4bH ;月低位DH_BIT EQU 4cH ;日高位DL_BIT EQU 4dH ;日低位SEC EQU 30HMIN EQU 31HHOUR EQU 32HDAY EQU 33HMONTH EQU 34HWEEK EQU 35HYEAR EQU 36HTEMPER equ 37hFLAG1 BIT 20h.0 ;DS18B20存在标志位DQ BIT P1.3A_BIT EQU 55HB_BIT EQU 56HDS1302_ADDR EQU 5EHDS1302_DATA EQU 5FHORG 00HLJMP STARTSTART:MOV SP,#60HMOV TMOD,#11HMOV TH0,#3CHMOV TL0,#0B0HMOV R0,#10SETB EASETB ET0SETB TR0MOV R1,37HMOV YEAR,#13H ;上电预置日期、时间MOV WEEK,#03H ;周1 MONMOV MONTH,#07H ;2011 04 25 12:00:00MOV DAY,#05HMOV HOUR,#23HMOV MIN,#00HMOV SEC,#00HMOV 50H,#0/////////////////////////////////////////////////////////////////////// ////MAIN:LCALL KEY//MAIN2:CALL FENLILCALL INIT_18B20LCALL GET_TEMPERcall CHANGEcall dispcall displayAJMP MAINFENLI:MOV A,YEARMOV B,#10HDIV ABMOV YL_BIT,BMOV YH_BIT,AMOV A,MONTHMOV B,#10HDIV ABMOV MOL_BIT,BMOV MOH_BIT,AMOV A,DAYMOV B,#10HDIV ABMOV DL_BIT,BMOV DH_BIT,AMOV A,HOURMOV B,#10HDIV ABMOV HL_BIT,BMOV HH_BIT,AMOV A,MINMOV B,#10HDIV ABMOV ML_BIT,BMOV MH_BIT,AMOV A,SECMOV B,#10HDIV ABMOV SL_BIT,BMOV SH_BIT,ARETKEY: ;按键子程序JB F0,MAIN10 ;F0=1,开始走时。

数字显示工作原理

数字显示工作原理

数字显示工作原理数字显示技术是现代电子产品中广泛采用的一种显示方式。

它通过将数字信号转换为可见的数字或字符形式,使得用户能够直观地获取信息。

数字显示技术应用广泛,涵盖了诸如数码时钟、计算器、手机、电视机等各个领域。

本文将介绍数字显示工作原理,并探讨一些常见的数字显示技术。

一、数字显示工作原理数字显示的工作原理基于电子器件的特性和操作原理。

主要有以下几种方式:1.数码管显示数码管是一种常见的数字显示设备,它由多个发光二极管(LED)组成。

通过控制不同的LED点亮或熄灭,可以显示不同的数字或字符。

数码管按照结构可以分为共阳极和共阴极两种。

共阳极数码管的阳极连接,而共阴极的则连接阴极。

通过在不同数字或字符对应的阳极或阴极上加电,可实现相应的数字或字符显示。

2.液晶显示液晶显示是一种利用液晶材料的光学特性来实现图形或数字显示的技术。

液晶由液晶分子组成,其分子结构可以通过电场来控制,并改变光的传播方式。

液晶显示屏通常由液晶层、驱动电路和背光模块构成。

驱动电路通过控制液晶层中的电场,使得液晶分子的排列发生改变,从而改变光线的透射与反射,实现显示效果。

3.发光二极管显示发光二极管(LED)是一种具有自发光特性的半导体器件。

通过控制LED的电流来控制其亮度,LED可以发射不同颜色的光。

在数字显示中,常用的LED颜色包括红色、绿色、蓝色等。

通过将LED按照不同的布局组成数字或字符的形状,可以实现数字显示的效果。

4.数码管显示数码管显示是一种通过在单元矩阵中控制单元的点亮或熄灭来实现数字显示的技术。

通常使用的单元矩阵包括7段数码管和14段数码管。

通过控制各个单元的点亮状态,可以显示不同的数字或字符。

二、常见的数字显示技术1.七段数码管显示七段数码管是一种常见的数字显示设备,通常用于显示0-9的数字和一些字母。

它由7个发光二极管组成,每个发光二极管对应一个段。

通过控制每个段的点亮状态,可以显示不同的数字或字符。

2.点阵显示点阵显示是一种通过多个小点组成的矩阵来显示数字或字符的技术。

16-32点阵数字钟及汉字显示

16-32点阵数字钟及汉字显示

16*32点阵数字钟及汉字显示一.电路原理框架设计制作作品:16×32点阵显示数字钟及汉字显示实现功能:点阵显示的实时时钟以及汉字等字符的左移显示实用特征:采用双电源供电,断电后时钟由电池供电还能继续运行,而且精确性较高实现原理:1.时钟显示是由DS1302精确的时钟芯片产生时钟信号并将其送至单片机,经过单片机处理后再输送到点阵显示模块。

2.汉字显示并左移原理是先写入与本点阵驱动相应的代码进单片机,通过单片机控制程序取表进行处理后送点阵模块显示电路主要模块及原理图:1.单片机最小系统及控制按键电路2.DS1302与单片机接口电路DS1302除了系统上电时由系统供电外,如果主电源断电还有一电池给DS1302供电,防止断电后DS1302数据消失。

4.点阵行驱动模块电路行驱动采用74LS154(4-16线译码器)及PNP三极管,由于是16×32点阵显示功率较大故采用8550NP三极管。

5.点阵列驱动电路列驱动采用74HC595移位寄存器将控制位级连接入单片机,每个74HC595数据输入端单独接单片机。

16×32点阵模块由8块小的8×8点阵模块通过级连而拼成,共16行,32列。

二:主要元器件选择:单片机:AT89S51采用市场上比较常用的STC89C51三极管:点阵的行驱动电路用,这里采用PNP管,具体型号用8550 点阵块:为了电路简单,采用双色8×8点阵晶振:采用的是12MHZ的晶振电源部分:采用5V电压供电,采用的是L7805稳压芯片供电电阻:大部分是限流电阻,阻值为4.7K或10K,1K译码器:4-16线采用市场上较为常用的74LS154,用来作行驱动移位寄存器:采用74HC595移位寄存器作列驱动,驱动列端口分配及连接:P1.0-P1.2:DS1302与单片机接口P1.3-P1.4:K0,K1按键,用来调整时间,按下为0P0:P0口接点阵行驱动电路接译码器P2:P2口点阵列驱动电路接74HC595最后是做好之后的图附:点阵时间显示源程序//=================================================================== ================////*标题:16*32点阵数字钟显示程序//*说明:时钟信号产生采用DS1302,列采用74HC595驱动(共4个),行驱动采用4 -16线译码器74LS154//*功能:通过动态扫描显示时钟,可显示时,分,秒,日期中的月和日//*作者:HEY//*日期:2006-05-29//*邮箱:billy3416@//*备注:此是我刚接触单片机时的一个小制作程序和电路设计上难免有不足之处请谅解//=================================================================== ================//#include <reg51.h>#include <stdlib.h>#define uchar unsigned char//=================================================================== ================////用到的引脚及端口定义//=================================================================== ================//sbit SERIALIN_0=P2^0; //定义P2.0为列向第1个74HC595的DATA输入sbit SERIALIN_1=P2^1; //定义P2.1为列向第2个74HC595的DATA输入sbit SERIALIN_2=P2^2; //定义P2.2为列向第2个74HC595的DATA输入sbit SERIALIN_3=P2^3; //定义P2.3为列向第2个74HC595的DATA输入sbit CLOCK_DATA=P1^0; //定义P1.0为DS1302的D ATA端口sbit CLOCK_RST=P1^1; //定义P1.1为DS1302的复位输出端口sbit CLOCK_SCLK=P1^2; //定义P1.2为DS1302的时钟信号状态控制sbit K0=P1^3; //K0为按键1,用来选择要调整时间的选项(时和分)sbit K1=P1^4; //K1为按键2,执行加1 sbit CLOCK=P2^4; //74HC595的移位时钟控制sbit LATCH=P2^5; //74HC595的锁存输出时钟控制void control(); //调整时间控制函数void time();uchar CLOCK_TIME[3]={0,0,0}; //定义时钟时间数据存储区,分别为(时,分,秒)uchar BUFFER[8]={0,0,0,0,0,0,0,0}; //显示缓冲区uchar YEAR[3]={0,0,0}; //定义时钟年月日数据存储区uchar temp[4]={0,0,0,0}; //定义74HC595的移位缓冲区uchar FLASH_STOP; //显示小时和分钟之间的两点控制位uchar sec_flash; //用单片机定时器模拟的一秒(用来控制小时和分中之间的两点)//=================================================================== ================////定义0-9的点阵显示代码段 8*8//=================================================================== ================//uchar code bmp[10][8]={{0xe3,0xdd,0xdd,0xdd,0xdd,0xdd,0xdd,0xe3}, //0{0xf7,0xc7,0xf7,0xf7,0xf7,0xf7,0xf7,0xc1}, //1{0xe3,0xdd,0xdd,0xfd,0xfb,0xf7,0xef,0xc1}, //2{0xe3,0xdd,0xfd,0xe3,0xfd,0xfd,0xdd,0xe3}, //3{0xfb,0xf3,0xeb,0xdb,0xdb,0xc1,0xfb,0xf1}, //4{0xc1,0xdf,0xdf,0xc3,0xfd,0xfd,0xdd,0xe3}, //5{0xe3,0xdd,0xdf,0xc3,0xdd,0xdd,0xdd,0xe3}, //6{0xc1,0xdd,0xfd,0xfb,0xf7,0xf7,0xf7,0xf7}, //7{0xe3,0xdd,0xdd,0xe3,0xdd,0xdd,0xdd,0xe3}, //8{0xe3,0xdd,0xdd,0xdd,0xe1,0xfd,0xdd,0xe3}, //9};//=================================================================== ================////定义0-9的点阵显示代码段 8*8 与上面不同的是多了小时和分钟之间的两点//=================================================================== ================//uchar code bmp_1[10][8]={{0xe3,0xdd,0x5d,0xdd,0xdd,0x5d,0xdd,0xe3}, //:0{0xf7,0xc7,0x77,0xf7,0xf7,0x77,0xf7,0xc1}, //:1{0xe3,0xdd,0x5d,0xfd,0xfb,0x77,0xef,0xc1}, //:2{0xe3,0xdd,0x7d,0xe3,0xfd,0x7d,0xdd,0xe3}, //:3{0xfb,0xf3,0x6b,0xdb,0xdb,0x41,0xfb,0xf1}, //:4{0xc1,0xdf,0x5f,0xc3,0xfd,0x7d,0xdd,0xe3}, //:4{0xe3,0xdd,0x5f,0xc3,0xdd,0x5d,0xdd,0xe3}, //:5{0xc1,0xdd,0x7d,0xfb,0xf7,0x77,0xf7,0xf7}, //:6{0xe3,0xdd,0x5d,0xe3,0xdd,0x5d,0xdd,0xe3}, //:7{0xe3,0xdd,0x5d,0xdd,0xe1,0x7d,0xdd,0xe3}, //:8};//=================================================================== ================////定义0-9的点阵显示代码段数码似的字模 8*8 显示数据前有一横杠将月和日格开//=================================================================== ================//uchar code bmp_2[10][8]={{0xff,0xff,0xf8,0xfa,0x8a,0xfa,0xf8,0xff}, //-0{0xff,0xff,0xfe,0xfe,0x8e,0xfe,0xfe,0xff}, //-1{0xff,0xff,0xf8,0xfe,0x88,0xfb,0xf8,0xff}, //-2{0xff,0xff,0xf8,0xfe,0x88,0xfe,0xf8,0xff}, //-3{0xff,0xff,0xfa,0xfa,0x88,0xfe,0xfe,0xff}, //-4{0xff,0xff,0xf8,0xfb,0x88,0xfe,0xf8,0xff}, //-5{0xff,0xff,0xf8,0xfb,0x88,0xfa,0xf8,0xff}, //-6{0xff,0xff,0xf8,0xfe,0x8e,0xfe,0xfe,0xff}, //-7{0xff,0xff,0xf8,0xfa,0x88,0xfa,0xf8,0xff}, //-8{0xff,0xff,0xf8,0xfa,0x88,0xfe,0xf8,0xff}, //-9};//=================================================================== ================////定义0-9的点阵显示代码段模拟数码似的字模 8*8//=================================================================== ================//uchar code bmp_3[10][8]={{0xff,0xff,0x8f,0xaf,0xaf,0xaf,0x8f,0xff}, //0{0xff,0xff,0xef,0xef,0xef,0xef,0xef,0xff}, //1{0xff,0xff,0x8f,0xef,0x8f,0xbf,0x8f,0xff}, //2{0xff,0xff,0x8f,0xef,0x8f,0xef,0x8f,0xff}, //3{0xff,0xff,0xaf,0xaf,0x8f,0xef,0xef,0xff}, //4{0xff,0xff,0x8f,0xbf,0x8f,0xef,0x8f,0xff}, //5{0xff,0xff,0x8f,0xbf,0x8f,0xaf,0x8f,0xff}, //6{0xff,0xff,0x8f,0xef,0xef,0xef,0xef,0xff}, //7{0xff,0xff,0x8f,0xaf,0x8f,0xaf,0x8f,0xff}, //8{0xff,0xff,0x8f,0xaf,0x8f,0xef,0x8f,0xff}, //9};//=================================================================== ================////定义0-59模拟七段数码管显示 8*8//=================================================================== ================//uchar code bmp_4[60][8]={{0xff,0xff,0x88,0xaa,0xaa,0xaa,0x88,0xff}, //00{0xff,0xff,0x8e,0xae,0xae,0xae,0x8e,0xff}, //01{0xff,0xff,0x88,0xae,0xa8,0xab,0x88,0xff}, //02{0xff,0xff,0x88,0xae,0xa8,0xae,0x88,0xff}, //03{0xff,0xff,0x8a,0xaa,0xa8,0xae,0x8e,0xff}, //04{0xff,0xff,0x88,0xab,0xa8,0xae,0x88,0xff}, //05{0xff,0xff,0x88,0xab,0xa8,0xaa,0x88,0xff}, //06{0xff,0xff,0x88,0xae,0xae,0xae,0x8e,0xff}, //07{0xff,0xff,0x88,0xaa,0xa8,0xaa,0x88,0xff}, //08{0xff,0xff,0x88,0xaa,0xa8,0xae,0x88,0xff}, //09{0xff,0xff,0xe8,0xea,0xea,0xea,0xe8,0xff}, //10{0xff,0xff,0xee,0xee,0xee,0xee,0xee,0xff}, //11{0xff,0xff,0xe8,0xee,0xe8,0xeb,0xe8,0xff}, //12{0xff,0xff,0xe8,0xee,0xe8,0xee,0xe8,0xff}, //13{0xff,0xff,0xea,0xea,0xe8,0xee,0xee,0xff}, //14{0xff,0xff,0xe8,0xeb,0xe8,0xee,0xe8,0xff}, //15{0xff,0xff,0xe8,0xeb,0xe8,0xea,0xe8,0xff}, //16{0xff,0xff,0xe8,0xee,0xee,0xee,0xee,0xff}, //17{0xff,0xff,0xe8,0xea,0xe8,0xea,0xe8,0xff}, //18{0xff,0xff,0xe8,0xea,0xe8,0xee,0xe8,0xff}, //19{0xff,0xff,0x88,0xea,0x8a,0xba,0x88,0xff}, //20{0xff,0xff,0x8e,0xee,0x8e,0xbe,0x8e,0xff}, //21{0xff,0xff,0x88,0xee,0x88,0xbb,0x88,0xff}, //22{0xff,0xff,0x88,0xee,0x88,0xbe,0x88,0xff}, //23{0xff,0xff,0x8a,0xea,0x88,0xbe,0x8e,0xff}, //24{0xff,0xff,0x88,0xeb,0x88,0xbe,0x88,0xff}, //25{0xff,0xff,0x88,0xeb,0x88,0xba,0x88,0xff}, //26{0xff,0xff,0x88,0xee,0x8e,0xbe,0x8e,0xff}, //27{0xff,0xff,0x88,0xea,0x88,0xba,0x88,0xff}, //28{0xff,0xff,0x88,0xea,0x88,0xbe,0x88,0xff}, //29{0xff,0xff,0x88,0xea,0x8a,0xea,0x88,0xff}, //30{0xff,0xff,0x8e,0xee,0x8e,0xee,0x8e,0xff}, //31{0xff,0xff,0x88,0xee,0x88,0xeb,0x88,0xff}, //32{0xff,0xff,0x88,0xee,0x88,0xee,0x88,0xff}, //33{0xff,0xff,0x8a,0xea,0x88,0xee,0x8e,0xff}, //34{0xff,0xff,0x88,0xeb,0x88,0xee,0x88,0xff}, //35{0xff,0xff,0x88,0xeb,0x88,0xea,0x88,0xff}, //36{0xff,0xff,0x88,0xee,0x8e,0xee,0x8e,0xff}, //37{0xff,0xff,0x88,0xea,0x88,0xea,0x88,0xff}, //38{0xff,0xff,0x88,0xea,0x88,0xee,0x88,0xff}, //39{0xff,0xff,0xa8,0xaa,0x8a,0xea,0xe8,0xff}, //40{0xff,0xff,0xae,0xae,0x8e,0xee,0xee,0xff}, //41{0xff,0xff,0xa8,0xae,0x88,0xeb,0xe8,0xff}, //42{0xff,0xff,0xa8,0xae,0x88,0xee,0xe8,0xff}, //43{0xff,0xff,0xaa,0xaa,0x88,0xee,0xee,0xff}, //44{0xff,0xff,0xa8,0xab,0x88,0xee,0xe8,0xff}, //45{0xff,0xff,0xa8,0xab,0x88,0xea,0xe8,0xff}, //46{0xff,0xff,0xa8,0xae,0x8e,0xee,0xee,0xff}, //47{0xff,0xff,0xa8,0xaa,0x88,0xea,0xe8,0xff}, //48{0xff,0xff,0xa8,0xaa,0x88,0xee,0xe8,0xff}, //49{0xff,0xff,0x88,0xba,0x8a,0xea,0x88,0xff}, //50{0xff,0xff,0x8e,0xbe,0x8e,0xee,0x8e,0xff}, //51{0xff,0xff,0x88,0xbe,0x88,0xeb,0x88,0xff}, //52{0xff,0xff,0x88,0xbe,0x88,0xee,0x88,0xff}, //53{0xff,0xff,0x8a,0xba,0x88,0xee,0x8e,0xff}, //54{0xff,0xff,0x88,0xbb,0x88,0xee,0x88,0xff}, //55{0xff,0xff,0x88,0xbb,0x88,0xea,0x88,0xff}, //56{0xff,0xff,0x88,0xbe,0x8e,0xee,0x8e,0xff}, //57{0xff,0xff,0x88,0xba,0x88,0xea,0x88,0xff}, //58{0xff,0xff,0x88,0xba,0x88,0xee,0x88,0xff}, //59};//=================================================================== ================////名称:delay//说明:延时函数//功能:根据需要取不同的值,实现不同的延时效果//=================================================================== ================//void delay(){uchar n;for(n=0;n<=125;n++);}void delay2(uchar m){uchar n;while(m--){for(n=0;n<=200;n++);}}//=================================================================== ================////名称:shift//说明:74HC595左移程序//功能:实现74HC595的移位输入//=================================================================== ================//void shift(){uchar j;for(j=0;j<8;j++){temp[0]=temp[0]<<1; //将temp[0]左移1位SERIALIN_0=CY; //进位输出到移位寄存器temp[1]=temp[1]<<1; //将temp[1]左移1位后SERIALIN_1=CY; //进位输出到移位寄存器temp[2]=temp[2]<<1; //将temp[2]左移1位后SERIALIN_2=CY; //进位输出到移位寄存器temp[3]=temp[3]<<1; //将temp[0]左移1位后的进位输出到移位寄存器SERIALIN_3=CY; //进位输出到移位寄存器CLOCK=1; //移位时钟控制移位CLOCK=0;}}//=================================================================== ================////名称:display//说明:显示函数//功能:将要显示的数据通过74HC595和74LS154用LED点阵显示出来//实现方法:该16X32点阵为8块小点阵,显示时将上下分开,上面显示时间。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

//数码管显示时间及点阵显示字符#include <reg52.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned int//定义Max7219端口#define DUAN P0 //P0口控制段#define WEI P2 //P2口控制位sbit k_hour=P1^0; // 更改小时按键sbit k_min=P1^1; // 更改分钟按键sbit k_sec=P1^2; // 更改秒按键//定义数码管端口sbit Max7219_pinCLK = P1^2;sbit Max7219_pinCS = P1^1;sbit Max7219_pinDIN = P1^0;//Max7219位定义unsigned char key; //P3按键扫描(执行模块控制)code uchar seg7code[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0XBF }; //显示段码数码管字跟uchar wei[8]={0XFE,0XFD,0XFB,0XF7,0XEf,0XDf,0XBf,0X7f}; //位的控制端uchar numb[8]; //定义字符串uint sec=0,min,hour;//数码管初始定义uchar code disp2[7][8]={{0x00,0x3E,0x2A,0xFF,0xAA,0xBE,0xC0,0x00}, //电{0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x00}, //一{0x00,0x00,0x1E,0x20,0x40,0x20,0x1E,0x00}, //V{0x00,0x00,0x4E,0x4A,0x4A,0x7A,0x00,0x00}, //5{0x00,0x00,0x42,0x7E,0x42,0x00,0x00,0x00}, //I{0x00,0x0C,0x1E,0x3C,0x3C,0x1E,0x0C,0x00}, //love{0x00,0x00,0x3E,0x40,0x40,0x3E,0x00,0x00}, //U};char flag;//定义点阵显示字符void Delay_xms(uint x){uint i,j;for(i=0;i<x;i++)for(j=0;j<300;j++);}//公用的延时程序//功能:向MAX7219(U3)写入字节//入口参数:DATA//出口参数:无void Write_Max7219_byte(uchar DATA){uchar i;Max7219_pinCS=0;for(i=8;i>=1;i--){Max7219_pinCLK=0;Max7219_pinDIN=DATA&0x80;DATA=DATA<<1;if(flag)Delay_xms(500);Max7219_pinCLK=1;}}//功能:向MAX7219写入数据//入口参数:address、dat//出口参数:无//说明:void Write_Max7219(uchar address,uchar dat){Max7219_pinCS=0;Write_Max7219_byte(address); //写入地址,即数码管编号Write_Max7219_byte(dat); //写入数据,即数码管显示数字Max7219_pinCS=1;}void Init_MAX7219(void){Write_Max7219(0x09, 0x00); //译码方式:BCD码Write_Max7219(0x0a, 0x03); //亮度Write_Max7219(0x0b, 0x07); //扫描界限;8个数码管显示Write_Max7219(0x0c, 0x01); //掉电模式:0,普通模式:1Write_Max7219(0x0f, 0x00); //显示测试:1;测试结束,正常显示:0 }void t_to_dis(){numb[0]=hour/10; //显示小时十位numb[1]=hour%10; //显示小时个位numb[2]=10; //显示横杠numb[3]=min/10; //显示分十位numb[4]=min%10; //显示分个位numb[5]=10; //显示横杠numb[6]=sec/10; //显示秒十位numb[7]=sec%10; //显示秒个位}//数码管求值函数void display()//显示函数{//数码管数据转换P2=0XFF;P0=seg7code[numb[0]];P2=wei[0];Delay_xms(80);P2=0XFF;P0=seg7code[numb[1]];P2=wei[1];Delay_xms(80);P2=0XFF;P0=seg7code[numb[2]];P2=wei[2];Delay_xms(80);P2=0XFF;P0=seg7code[numb[3]];P2=wei[3];Delay_xms(80);P2=0XFF;P0=seg7code[numb[4]];P2=wei[4];Delay_xms(80);P2=0XFF;P0=seg7code[numb[5]];P2=wei[5];Delay_xms(80);P2=0XFF;P0=seg7code[numb[6]];P2=wei[6];Delay_xms(80);P2=0XFF;P0=seg7code[numb[7]];P2=wei[7];Delay_xms(80);P2=0XFF;}void Display1(){//0P2=0X00;P0=0xc0;Delay_xms(200);//1P2=0X00;P0=0xf9;Delay_xms(200);//2P2=0X00;P0=0xa4;Delay_xms(200);//3P2=0X00;P0=0xb0;Delay_xms(200);//4P2=0X00;P0=0x99;Delay_xms(200);//5P2=0X00;P0=0x92;Delay_xms(200);//6P2=0X00;P0=0x82;Delay_xms(200);//7P2=0X00;P0=0xf8;Delay_xms(200);//8P2=0X00;P0=0x80;Delay_xms(200);//9P2=0X00;P0=0x90;Delay_xms(200); }//4位显示0~9void Display2(){P2=0XFE;P0=0x00;Delay_xms(200);P2=0XFD;P0=0x00;Delay_xms(200);P2=0XFB;P0=0x00;Delay_xms(200);P2=0XF7;P0=0x00;Delay_xms(200);P2=0XEF;P0=0x00;Delay_xms(200);P2=0XDF;P0=0x00;Delay_xms(200);P2=0XBF;P0=0x00;Delay_xms(200);P2=0X7F;P0=0x00;Delay_xms(200);}//数码管移位显示8void SetTime(){if(k_hour==0){hour++;while(!k_hour);if(hour>=24) hour=0;}if(k_min==0){min++;while(!k_min);if(min>=60) min=0;}if(k_sec==0){sec++;while(!k_sec);if(sec>=60) sec=0;}}//数码管按键函数void timer1(void)interrupt 3 //每一秒增加一{uchar i;TH1=0X3c;//定时初值TL1=0Xaf;//定时初值i++;if(i>=20){i=0;sec++;//秒加1if(sec>=60){sec=0; //秒清零min++; //60秒后分加1if(min>=60){min=0; //分清零hour++; //60分后时加1if(hour>=24)hour=0; //时清零}}}}//数码管中断函数void InitInterrupt(){TMOD=0X10;//定义定时器工作方式TH1=0X3c;TL1=0Xaf;ET1=1;TR1=1;//开定时器EA=1;//开中断}//数码管中断初始化void main1(){uchar m,n;Delay_xms(500);P2=0xaa;Delay_xms(500);P2=0x55;Delay_xms(500);flag=0;Init_MAX7219();flag=0;while(1){for(m=0;m<7;m++){for(n=0;n<9;n++)Write_Max7219(n,disp2[m][n-1]);Delay_xms(500);}}}//点阵Main函数void main2(){InitInterrupt(); //中断初始化Display1();Display2();while(1){SetTime();//按键函数t_to_dis();//确定秒分时值display(); //显示秒分时值}}//数码管Main函数void ext_int0(void) interrupt 0 using 1{if(P3!=0xff){Delay_xms(10);key=P3;}while(P3!=0xff);switch(key){case 0xfe:main1(); break;case 0xfd:main2(); break;default:break;}}//判断有按键按下,所控制的程序void main(){IT0=1; //设定为边沿触发方式IP=0x01; //置外部中断0为高优先级中断P3=0xff; //置P3口为输入态EA=1; //开CPU中断EX0=1; //开外部中断0while(1); //等待外部中断}。

相关文档
最新文档