pic单片机4位数码管显示 1~9999循环点亮

合集下载

(完整word版)pic单片机4位数码管显示 1~9999循环点亮

(完整word版)pic单片机4位数码管显示 1~9999循环点亮

#include <pic.h> //调用头文件,可以去PICC软件下去查找PIC16F87XA单片机的头文件__CONFIG(0x1832);//芯片配置字,看门狗关,上电延时开,掉电检测关,低压编程关,加密,4M晶体HS振荡#define DS1 RA1#define DS2 RA2#define DS3 RA3#define DS4 RA5#define B20 RA4#define uchar unsigned char#define uint unsigned intunsigned char unm;const unsigned char str[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40} ; //共阴数码管字码表const unsigned char str1[]={0x0bf,0x86,0x0db,0x0cf,0x0e6,0x0ed,0x0fd,0x87,0x0ff,0x0ef}; //个位带小数点字码表//const unsigned char wei[4]={COL1+COL2+COL3+COL4};//{0x001,0x002,0x004,0x008};/**********ds1820程序************/void delay(unsigned int i) //延时1微秒{for(i=100;i--;);}void init(void) //主板初始化{TRISD=0X00;TRISA=0X00;PORTA=0X00;PORTD=0X00;}/************主程序**********/uchar smg(){init();unsigned char j;unsigned int i,a,bit1000,bit100,bit10,bit1;DS1=1;DS2=1;DS3=1;DS4=1;while(1){for( i=1; i <= 9999;i++){a=i;bit1000=a/1000;//提取千位a=a%1000;bit100=a/100;//提取百位a=a%100;bit10=a/10;//提取十位bit1=a%10;//提取个位for( j=1; j <= 20;j++){DS4=0;PORTD=str[bit1];DS1=1; //个位的位选delay(2);//*延时5mS*DS1=0;PORTD=str1[bit10];DS2=1; //十位的位选delay(2);//*延时5mSDS2=0;PORTD=str[bit100];DS3=1; //百位的位选delay(2);//*延时5mSDS3=0;PORTD=str[bit1000];DS4=1; //千位的位选delay(2);//*延时5mS*/}}}}。

单片机 4位时钟数码管

单片机 4位时钟数码管

单片机控制4位时钟数码管的方法如下:
连接硬件:将4位数码管的共阳(或共阴)引脚连接到单片机的I/O口,连接数码管的段选引脚到单片机的另外4个I/O口。

同时,连接一个晶振和相关的电容电阻到单片机的时钟输入引脚和地。

设置引脚:在代码中定义每个数码管引脚对应的I/O口为输出模式,用于控制数码管的显示。

编写代码:使用单片机的定时器功能,通过编程计算出每个数码管显示的数字对应的段选编码,并在定时器中断服务程序中更新数码管的显示。

调试程序:将程序下载到单片机中,通过观察数码管的显示效果,调整程序中的参数或代码,以达到预期的显示效果。

需要注意的是,具体的实现方式可能因单片机的型号和数码管的类型而有所不同,需要根据实际情况进行相应的调整。

单片机LED数码管循环显示

单片机LED数码管循环显示

维修总厂电工技能培训班
技能训练课题
(单片机LED数码管循环显示)
学员单位
学员学号
学员姓名
武汉工程职业技术学院凤凰山校区电气教研室
课题单片机LED数码管循环显示一、原理图如下:
.
二、源程序
ORG 00H
START: MOV DPTR,#TABLE ;指针指向表头地址
S1: MOV A,#00H ;设置地址偏移量MOVC A,@A+DPTR ;查表取得段码,送A存储
CJNE A,#01H,S2 ;判断段码是否为结束符
LJMP START
S2: MOV P0,A ;段码送LED显示LCALL DELAY ;指针加1
INC DPTR
LJMP S1
DELAY: M OV R5,#20 ;延时子程序
D2: M OV R6,#20
D1: M OV R7,#248
DJNZ R7,$
DJNZ R6,D1
DJNZ R5,D2
RET
TABLE: DB 3FH,06H,5BH,4FH,66H ;段码表
DB 6DH,7DH,07H,7FH,6FH
DB 01H ;结束符
END
三、技能训练要求:
1、掌握数码管的工作原理和显示码表的编制;
2、读懂源程序,了解用单片机控制LED数码管循环显示;
3、掌握查表程序的编写;
4、安装LED数码管循环显示电路;
5、修改程序实现不同的数字循环和间隔时间,并正确进行调试,
四、考核配分及评分标准
- - 2。

51单片机四位一体共阳数码管程序

51单片机四位一体共阳数码管程序

1.四位一体数码管的第一个数码管显示8 #include<reg52.h>sbit dula=P2^6;sbit wela=P2^7;void main(){wela=1;P0=0x01;wela=0;dula=1;P0=0x80;dula=0;while(1);}2.四位数码管同时从0到F变化#include<reg52.h>#define uchar unsigned char#define uint unsigned intsbit dula=P2^6;sbit wela=P2^7;uchar num;uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x98,0x83,0xc6,0xa1,0x86,0x8e};void delayms(uint);void main(){wela=1;P0=0x0f;wela=0;while(1){for(num=0;num<16;num++){dula=1;P0=table[num];dula=0;delayms(500);}}}void delayms(uint xms){uint i,j;for(i=xms;i>0;i--)for(j=110;j>0;j--);}3.四位数码管分别以1,2,3,4进行循环显示#include<reg52.h>#define uchar unsigned char#define uint unsigned intsbit dula=P2^6;sbit wela=P2^7;uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x98,0x83,0xc6,0xa1,0x86,0x8e};void delayms(uint);void main(){while(1){dula=1;P0=table[1];dula=0;P0=0x00; //送段选数据前关闭所有显示,防止打开位选wela=1; //锁存器时原来段选数据通过位选锁存器造成混乱P0=0x01;wela=0;delayms(500);dula=1;P0=table[2];dula=0;P0=0x00;wela=1;P0=0x02;wela=0;delayms(500);dula=1;P0=table[3];dula=0;P0=0x00;wela=1;P0=0x04;wela=0;delayms(500);dula=1;P0=table[4];dula=0;P0=0x00;wela=1;P0=0x08;wela=0;delayms(500);}}void delayms(uint xms) {uint i,j;for(i=xms;i>0;i--)for(j=110;j>0;j--); }。

四位数码管自动点亮

四位数码管自动点亮

数字起航—实验零基础电子设计系列课程
主讲人:范秋华
国家级电工电子实验教学中心(青岛大学)
6.1基础实验
6.1.1 一个LED点亮的控制
6.1.2 一位数码管点亮的控制
6.1.3 四位数码管点亮的控制
6.1.4 一个LED动态闪亮的控制
6.1.5 四位数码管自动点亮
6.1.6 加使能端控制四位数码管点亮6.2复杂实验
6.2.1 流水灯的设计
6.2.2 呼吸灯的设计
6.2.3 音乐基础的设计
6.2.4 简易电子琴的设计
6.2.5 乐曲播放器设计
6.3综合试验
6.3.1 音乐彩灯的设计
6.1.5 四位数码管自动点亮的控制
图数码管硬件接线图
实验任务:有四个共阴极数码管。

通电后4个数码管依次自动循环点亮0,1,…,9,A,B,C,D,E,F。

每个点亮1/3秒参数指标:系统时钟100MHz。

管脚约束
CLK---P17
VHDL 程序编写
设计思路:首先设计以分频器,输出高电平1/3秒。

对分频信号16进制计数,把计数值译码给数码管的相应段码,同时制定数码管的位码。

请看下载演示!
数字启航实验内容4国家级电工电子实验教学中心。

单片机数码管动态显示1234-9999

单片机数码管动态显示1234-9999

一、实验目的1.掌握Keil软件的基本使用2.学习和掌握C语言编写程序的一般格式3.了解数码管与单片机的接口方法;4.了解数码管性能及动态显示编程方法;5.了解并掌握单片机系统中定时器中断控制的基本方法;二、实验内容用定时器中断实现四位数码管动态显示从1234-9999。

三、实验原理3.1基础知识介绍A.数码管是LED的升级,每位数码管里面继承了8个LED,点亮数码管就是点亮数码管里面的LED。

要在数码管上面显示相应的值,就是点亮不同位置的LED。

数码管有共阴和共阳两种,共阴数码管公共端是所有LED的负极连接在一起,相反共阳数码管公共端是所有LED的正极连接在一起。

一般公共端称作“位选”,控制每一个LED的称为“段选”。

数码管主要是利用视觉暂留的效果,通过快速循环点亮数码管方式,将数据呈现出来。

数码管如图1.2所示1.2数码管1.3数码管实物图/B.定时器定时器也可看作是对计算机机器周期的计数器。

因为每个机器周期包含12个振荡周期,故每一个机器周期定时器加1,可以把输入的时钟脉冲看成机器周期信号。

故其频率为晶振频率的1/12。

如果晶振频率为12MHz,则定时器每接收一个输入脉冲的时间刚好为1μs。

定时器有两种工作模式,分别为计数模式和定时模式。

对Px,y 的输入脉冲进行计数为计数模式。

定时模式,则是对MCU的主时钟经过12分频后计数。

因为主时钟是相对稳定的,所以可以通过计数值推算出计数所经过的时间。

计数器的计数值存放于特殊功能寄存器中。

T0(TL0-0x8A, TH0-0x8C), T1(TL1-0x8B, TH1-0x8D)定时器工作原理如下图由上图可见与定时器相关的寄存器主要有下面这几个:TMOD、TCON、TL0、TH0、TL1、TH1。

下面介绍一下这几个寄存器16位加法计数器:是定时计数器的核心,其中TL0、TH0、是定时计数器0的底八位和高八位;TL1、TH1是定时计数器1的底八位和高八位;并且高八位和底八位可单独使用。

单只数码管循环显示0~9

单只数码管循环显示0~9

单只数码管循环显示0~9【任务】在单个数码管上循环显示数字0~9,实现类似于计时(或计数)显示的功能。

【硬件平台】在51单片机最小系统的基础上,以端口P0控制一个七段数码管。

为提高驱动能力,增加了上拉排阻RP1(10k)。

【编程思路】因为这里使用了共阴数码管,所以当P0端口相应引脚为高电平时,点亮相应的数码段。

0~9的段码按相同的时间间隔从单片机内存读到P0口,由此产生从0到9的循环显示效果。

先写下前面三板斧,内涵不赘述:#include <reg51.h>#define uchar unsigned char#define uint unsigned int因为0~9的段码是固定的,不妨将其保存为code类型的数组。

注意是共阴接法,比如要显示“0”,那么P0端口的各引脚电平为:a=b=c=d=e=f=1,g=0,闲置的P0.7=0(按字节给端口赋值,所以闲置位也赋值),表示为二进制是P0.7gfedcba=00111111,对应的十六进制为0x3F。

其余段码可类似分析:uchar code display_code[ ]={0x3F,0x06,0x5B,0x4F,0x66,0x66,0x6D,0x7D,0x7F,0x6F,0x00 }; //0x00表示段码全灭显示不同的数字之间要有时间间隔,须定义一个延时函数以便主函数调用实现间隔延时:最后编写主函数:【代码展示】#include <reg51.h>#define uchar unsigned char#define uint unsigned intuchar codedisplay_code[ ]={0x3F,0x06,0x5B,0x4F,0x66,0x66,0x6D,0x7D,0x 7F,0x6F,0x00};void delay(uint x){uchar i;while(x--) for(i=0;i<100;i++);}void main(){uchar i=0; //定义数组下标变量,用以遍历数组P0=0x00; //数码管初始不亮while(1){P0=display_code[i]; //0~9对应的段码送给P0口,显示9后段码熄灭(0x00)i=(i+1)%10;//从0循环到9,超过10后又回到0,%为取余数算符}}。

数码管循环显示0~9程序说明

数码管循环显示0~9程序说明

数码管循环显示0~9程序说明功能说明:用一位数码管循环显示数字0~9,数字间隔时间为0.2秒。

一、电路图数码管循环显示0~9电路图二、所用电子元器件AT89C51:单片机;7SEG—COM—AN—GRN:带公共端共阳七段绿色数码管;CAP、CAP—ELEC:电容、电解电容;CRYSTAL:晶振。

三、程序汇编语言编写的数码管循环显示0~9源程序代码如下:START:MOV DPTR,#TABLEMOV R0,#00HLOOP: MOV A,R0MOVC A,@A+DPTRMOV P0,AACALL DL Y1SINC R0CJNE R0,#10,LOOPJMP STARTDL Y1S:MOV R5,#10HD1: MOV R6,#100HD2: MOV R7,#100HDJNZ R7,$DJNZ R6,D2DJNZ R5,D1RETTABLE:DB 0C0H,0F9H,0A4H,0B0HDB 99H, 92H, 82H, 0F8HDB 80H, 90H, 88H, 83HDB 0C6H,0A1H,86H, 8EHENDProtetus 安装说明使用说明1.先安装Setup71.exe,提示选择Setup Type时默认选择即可;若提示No LICENCE 选择安装文件中"crack"-->MAXIM_LICENCE.lxk,打开安装。

2.安装完成后将crack-->文件夹BIN 和文件夹MODELS 下的文件复制到安装目录相应的文件夹内覆盖。

3.安装proteus.7.x-patch,选择patch,提示can not find the file. search the file,选择yes即可;然后选择bin文件中的ares.exe ;在选择models 中的avr.dll安装完毕退出即可。

注:***"Keil驱动"中的程序为Proteus与Keil联调的驱动。

51单片机(四位数码管的显示)程序[1]

51单片机(四位数码管的显示)程序[1]

51单片机(四位数码管的显示)程序基于单片机V1或V2实验系统,编写一个程序,实现以下功能:1)首先在数码管 上显示P ”个字符;2)等待按键,如按了任何一个键,则将这 4个字符清除, 改为显示0000”个字符(为数字的0)。

E3最佳答案下面这个程序是4x4距阵键盘丄ED 数码管显示,一共可以到0-F 显示,你可以稍微 改一下就可以实现你的功能了,如还有问题请发信息,希望能帮上你!#i nclude<at89x52.h> un sig ned char codeDig[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1 ,0x86,0x8e}; //gongyang 数码管 0-F 代码void key_delay(void) {int t;for(t=0;t<500;t++);}un sig nedchar k;//设置全局变量k 为键盘的键值键盘延时函数键盘扫描函数 ***************************** *///延时函数voidkeyscan(void)//键盘初始化 //有键按下? //延时 //确认真的有键按下? //使行线 P2.4 为低电平,其余行为高电平 //a 作为缓存 //开始执行行列扫描 {case 0xee:k=15;break;case 0xde:k=11;break;case 0xbe:k=7;break;case 0x7e:k=3;break;default:P2 = 0xfd;//使行线 P2.5 为低电平,其余行为高电平a = P2;switch (a)//键盘扫描函数 {unsigned char a;P2 = 0xf0;if(P2!=0xf0){key_delay();if(P2!=0xf0){P2 = 0xfe;key_delay();a = P2;switch (a)case 0xed:k=14;break;case 0xdd:k=10;break;case 0xbd:k=6;break;case 0x7d:k=2;break;default:P2 = 0xfb; //使行线 P2.6 为低电平,其余行为高电平a = P2;switch (a){case 0xeb:k=13;break;case 0xdb:k=9;break;case 0xbb:k=5;break;case 0x7b:k=1;break;default:P2 = 0xf7; //使行线P2.7为低电平,其余行为高电平a = P2;switch (a){case 0xe7:k=12;break;case 0xd7:k=8;break;case 0xb7:k=4;break;case 0x77:k=0;break;default:break;}} break;}}}}void main(void){while(1){keyscan(); switch(k){case 0:P0=Dig[0];break;case 1:P0=Dig[1];break;case 2:P0=Dig[2];break;case 3:P0=Dig[3];break;case 4:P0=Dig[4];break;case 5:P0=Dig[5];break;**************************** ***主函数 * ********************************** //调用键盘扫描函数 //查找按键对应的数码管显示代码case 6:P0=Dig[6];break;case 7:P0=Dig[7];break;case 8:P0=Dig[8];break;case 9:P0=Dig[9];break;case10:P0=Dig[10];break;case11:P0=Dig[11];break;case12:P0=Dig[12];break;case13:P0=Dig[13];break;case14:P0=Dig[14];break;case15:P0=Dig[15];break;default:break; // 退出}}}endWelcome ToDownload !! !欢迎您的下载,资料仅供参考!。

51单片机(四位数码管的显示)程序

51单片机(四位数码管的显示)程序

51单片机(四位数码管的显示)程序基于单片机V1或V2实验系统,编写一个程序,实现以下功能:1)首先在数码管上显示“P_ _ _”4个字符;2)等待按键,如按了任何一个键,则将这4个字符清除,改为显示“0000”4个字符(为数字的0)。

最佳答案下面这个程序是4x4距阵键盘,LED数码管显示,一共可以到0-F显示,你可以稍微改一下就可以实现你的功能了,如还有问题请发信息,希望能帮上你!#include<at89x52.h>unsigned char codeDig[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1 ,0x86,0x8e}; //gongyang数码管0-F 代码unsigned char k; //设置全局变量k 为键盘的键值/************************************键盘延时函数****************************/void key_delay(void) //延时函数{int t;for(t=0;t<500;t++);}/************************************键盘扫描函数******************************/void keyscan(void) //键盘扫描函数{unsigned char a;P2 = 0xf0; //键盘初始化if(P2!=0xf0) //有键按下?{key_delay(); //延时if(P2!=0xf0) //确认真的有键按下?{P2 = 0xfe; //使行线P2.4为低电平,其余行为高电平key_delay();a = P2; //a作为缓存switch (a) //开始执行行列扫描{case 0xee:k=15;break;case 0xde:k=11;break;case 0xbe:k=7;break;case 0x7e:k=3;break;default:P2 = 0xfd; //使行线P2.5为低电平,其余行为高电平a = P2;switch (a){case 0xed:k=14;break;case 0xdd:k=10;break;case 0xbd:k=6;break;case 0x7d:k=2;break;default:P2 = 0xfb; //使行线P2.6为低电平,其余行为高电平a = P2;switch (a){case 0xeb:k=13;break;case 0xdb:k=9;break;case 0xbb:k=5;break;case 0x7b:k=1;break;default:P2 = 0xf7; //使行线P2.7为低电平,其余行为高电平a = P2;switch (a){case 0xe7:k=12;break;case 0xd7:k=8;break;case 0xb7:k=4;break;case 0x77:k=0;break;default:break;}}}break;}}}}/****************************** ***主函数*************************************/ void main(void){while(1){keyscan(); //调用键盘扫描函数switch(k) //查找按键对应的数码管显示代码{case 0:P0=Dig[0];break;case 1:P0=Dig[1];break;case 2:P0=Dig[2];break;case 3:P0=Dig[3];break;case 4:P0=Dig[4];break;case 5:P0=Dig[5];break;case 6:P0=Dig[6];break;case 7:P0=Dig[7];break;case 8:P0=Dig[8];break;case 9:P0=Dig[9];break;case 10:P0=Dig[10];break;case 11:P0=Dig[11];break;case 12:P0=Dig[12];break;case 13:P0=Dig[13];break;case 14:P0=Dig[14];break;case 15:P0=Dig[15];break;default:break; //退出}}}/**********************************end***************************************/。

PIC单片机做的与PLC控制器接口的四位LED数字显示表

PIC单片机做的与PLC控制器接口的四位LED数字显示表

第12章与PLC接口的4位LED数字显示表12.2 数显表头软件设计思路12.4 程序清单#include <pic16F87x.h>#include "mydefine.h"#include <pic.h>static int flag,flag0,flag1,flag3,led_d;static int data1[5],data2[5];static int data,data0,data_1,data_2,sdata;//=====================子程序=========================//端口初始化子程序void initport( ){PORTA=0;PORTB=0;PORTC=0;PORTD=0;ADCON1=0x07;TRISA=0x03; //设RA0,RA1为输入TRISB=0xE8; //设RB0,RB1,RB2,RB4为输出TRISC=0xFF; //设C口为输入TRISD=0; //设D口为输出}//判断地址是否相同子程序int adr_jud(int x){int adress,y;adress=PORTA&0x03;x&=0x60;adress=adress<<5;if (adress==x) y=1;else y=0;CLRWDT();return(y);}193//显示初始化子程序void initdis( ){PORTB=0xFE; //选通数码管1PORTD=0xC0;PORTB=0xFD; //选通数码管2PORTD=0xC0;PORTB=0xFB; //选通数码管3PORTD&=0x7F; //选通小数位PORTD=0xC0;PORTB=0xEF; //选通数码管4PORTD=0xC0;}//读5次数据判是否有4次相等int judge(arry)int arry[5];{int i,j,k;for(i=0;i<=4;i++){k=0;for(j=0;j<=4;j++){ if(arry[i]==arry[j]) k++;if(k>=4) {flag1=1;data0=arry[i];return(flag1);}else flag1=0;}}return(flag1);}//数据转换子程序int convert(int d1,int d2){auto int dd1,dd2;int i1,j1,k1,i2,j2,m;dd1=d1;194dd2=d2;j1=0x10;k1=2048;d1=0;for(i1=1;i1<=5;i1++) {if(j1==(dd1&j1)) m=1;else m=0;d1=d1+m*k1;j1=j1/2;k1=k1/2;}j2=0x40;d2=0;for(i2=1;i2<=7;i2++) {if(j2==(dd2&j2)) m=1;else m=0;d2=d2+m*k1;j2=j2/2;k1=k1/2;}data=d1+d2;return(data);}//显示子程序int display(int x){ int l1,l2,l3,l4;l1=x/1000;PORTB=0xFE; //选通数码管1PORTD=led[l1];l2=(x-l1*1000)/100;PORTB=0xFD; //选通数码管2PORTD=led[l2];l3=(x-l1*1000-l2*100)/10;PORTB=0xFB; //选通数码管3PORTD=0x7F;PORTD=led[l3];l4=x-l1*1000-l2*100-l3*10;PORTB=0xEF; //选通数码管4195PORTD=led[l4];}//中断服务子程序void interrupt int_serve( ){PIR1=0;TMR1L=0xE5;TMR1H=0xBE;di( );sdata=PORTC&0x80;ei( );}//开中断子程序void int_open( ){inportc=PORTC&0x80;if(inportc==1) return;else data1[0]=~PORTC;flag=adr_jud(data1[0]);if(flag==0) return; //地址不同返回else data1[1]=~PORTC;data1[2]=~PORTC;if(data1[0]==data1[1])if(data1[0]==data1[2]) {flag3=1;PIR1=0; //开通总中断前,清所有中断标志位TMR1IE=1; //TMR1溢出中断使能PEIE=1;ei( );TMR1L=0xE5;TMR1H=0xBE; //20ms中断1次T1CON=0x01; //设TMR1为1分频,计数器方式工作}else return;}//读第1帧子程序voidread_1( ){ int j0;196for(j0=1;j0<=4;j0++) data1[j0]=~PORTC;flag1=judge(data1);if (flag1==1) {data_1=data0;flag0=1;count1++;}flag=adr_jud(data1[0]);if(flag==1) {for(j0=1;j0<=4;j0++) data1[j0]=~PORTC;flag1=judge(data1);if (flag1==1){data_1=data0;flag0=1;count1++;}}}// 主程序main( ){ int i0,ii,i;flag0=0; //帧标志位flag1=0; //读5次数据判有4次相等标志位flag3=1; //开中断标志位count1=0; //读第1帧计数单元count2=0; //读第2帧计数单元data_1=0;data_2=0;led_d=0;led[0]=0xc0; //0led[1]=0xf9;led[2]=0xa4;led[3]=0xb0;led[4]=0x99;led[5]=0x92;led[6]=0x82;led[7]=0xf8;led[8]=0x80;197led[9]=0x90; //9initport( );OPTION=0xFE; //开看门狗initdis( );while(1) {if(flag3==0) int_open();else{if(sdata==0x80){ //第二帧数据到if(flag0==1){for(i0=0;i0<=4;i0++) data2[i0]=~PORTC;flag1=judge(data2);if (flag1==1) {data_2=data0;flag0=0;count2++;}}}else if(sdata==0) { //第一帧数据到if(flag0==0) {data1[0]=~PORTC;flag=adr_jud(data1[0]);if(flag==1) {for(j0=1;j0<=4;j0++) data1[j0]=~PORTC;flag1=judge(data1);if (flag1==1) {data_1=data0;flag0=1;count1++;}}}}CLRWDT();if(count1==count2) led_d=convert(data_1,data_2 );}display(led_d);}198}199。

PIC18F458控制数码管显示1~8数字程序

PIC18F458控制数码管显示1~8数字程序

PIC18F458控制数码管显示1~8数字程序本程序是基于PIC18F458控制LED数码管显示1~8数字的C语言程序,笔者也是刚刚学习PIC单片机,也是和大家一起学习交流吧!不多说了,先贴程序:#include "p18f458.h"static volatile int table[20]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0XD8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x7f,0xbf,0x89,0xff};//段码volatile unsigned char data;/*初始化子程序*/void initial(){TRISA=0x00; /*A口设置为输出*/TRISC=0x00; /*SDO引脚为输出,SCK引脚为输出*/ INTCON=0x00; /*关闭所有中断*/SSPCON1=0x30; /*SSPEN=1;CKP=1,FOSC/4*/SSPSTAT=0xC0; /*时钟下降沿发送数据*/PIR1=0; /*清除SSPIF标志*/}/*显示子程序*/void SPILED(char data){PORTAbits.RA5=0;/*LACK送低电平,为锁存做准备*/SSPBUF=data; /*启动发送*/do{;}while(PIR1bits.SSPIF==0); /*等待发送完毕*/ PIR1bits.SSPIF=0; /*清除SSPIF标志*/PORTAbits.RA5=1; /*最后给锁存信号,代表显示任务完成*/}/*主程序*/main(){unsigned i;initial(); /*系统初始化*/for(i=8;i>0;i--) /*连续发送8个数据*/{data=table[i]; /*通过数组的转换获得待显示的段码*/SPILED(data); /*发送显示段码显示*/ }for(;;)//无限循环{}}。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
delay(2);//*延时5mS*
DS1=0;
PORTD=str1[bit10];
DS2=1; //十位的位选
delay(2);//*延时5mS
DS2=0;
PORTD=str[bit100];
DS3=1; //百位的位选
delay(2);//*延时5mS
DS3=0;
PORTD=str[bit1000];
{
a=i;
bit1000=a/1000;//提取千位
a=a%1000;
bit100=a/100;//提取百位
a=a%100;
bit10=a/10;//提取十位
bit1=a%10;//提取个位
for( j=1; j <= 20;j++)
{
DS4=0;
PORTD=str[bit1];
DS1=1; //个位的位选
#define DS4 RA5
#define B20 RA4
#define uchar unsigned char
#define uint uconst unsigned char str[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40} ; //共阴数码管字码表
#include <pic.h> //调用头文件,可以去PICC软件下去查找PIC16F87XA单片机的头文件
__CONFIG(0x1832);
//芯片配置字,看门狗关,上电延时开,掉电检测关,低压编程关,加密,4M晶体HS振荡
#define DS1 RA1
#define DS2 RA2
#define DS3 RA3
const unsigned char str1[]={0x0bf,0x86,0x0db,0x0cf,0x0e6,0x0ed,0x0fd,0x87,0x0ff,0x0ef}; //个位带小数点字码表
//const unsigned char wei[4]={COL1+COL2+COL3+COL4};//{0x001,0x002,0x004,0x008};
}
/************主程序**********/
uchar smg()
{
init();
unsigned char j;
unsigned int i,a,bit1000,bit100,bit10,bit1;
DS1=1;
DS2=1;
DS3=1;
DS4=1;
while(1)
{
for( i=1; i <= 9999;i++)
DS4=1; //千位的位选
delay(2);//*延时5mS*/
}
}
}
}
/**********ds1820程序************/
void delay(unsigned int i) //延时1微秒
{
for(i=100;i--;);
}
void init(void) //主板初始化
{
TRISD=0X00;
TRISA=0X00;
PORTA=0X00;
PORTD=0X00;
相关文档
最新文档