PIC单片机数码管程序

合集下载

PIC单片机的C语言使用

PIC单片机的C语言使用

PIC单片机的C语言使用PIC(Perpheral Interface Controllers)单片机是一种高性价比的嵌入式处理器,也是应用最广泛的单片机之一、它们常常用于各种电子设备,例如家电、汽车、电子仪器仪表和医疗设备等。

PIC单片机的优点是具有较低的成本、低功耗和高性能。

在C语言中使用PIC单片机可以实现许多功能,例如控制输入输出、实现逻辑运算、实现算法等。

```c#include <xc.h>#include <pic.h>void mainTRISB=0x00;//将PORTB定义为输出口PORTB=0x00;//将PORTB的值初始化为0while(1)PORTB=0xFF;//将PORTB的值设置为全高电平__delay_ms(1000); // 延时1秒PORTB=0x00;//将PORTB的值设置为全低电平__delay_ms(1000); // 延时1秒}```上述示例程序中,我们使用了XC8编译器,它是一个用于编译PIC单片机C语言程序的开源编译器。

在以上代码中,我们将PORTB定义为输出口,然后在一个无限循环中将PORTB设置为全高电平,并延时1秒,然后将PORTB设置为全低电平,并再次延时1秒。

```c#include <xc.h>#include <pic.h>void mainADCON1=0x0F;//将ADCON1寄存器设置为模拟输入模式TRISB=0x00;//将PORTB定义为输出口PORTB=0x00;//将PORTB的值初始化为0while(1)ADCON0bits.GO = 1; // 启动A/D转换while(ADCON0bits.GO); //等待转换完成//读取A/D转换结果并进行温度转换int adcValue = ADRES;int temperature = (5 * adcValue) / 1023;PORTB = temperature; // 将温度值显示在PORTB上}```在以上代码中,我们首先将ADCON1寄存器设置为模拟输入模式,然后将PORTB定义为输出口,并初始化为0。

PIC单片机之数码管

PIC单片机之数码管

PIC单片机之数码管大家好,通过前一期的学习,我们已经对ICD2 仿真烧写器和增强型PIC 实验板的使用方法及学习方式有所了解与熟悉,学会了如何用单片机来控制发光管、继电器、蜂鸣器、按键等资源,体会到了学习板的易用性与易学性,特别是当自己第一次动手编程点亮一个发光管时,相信对于初学者来说,一定很兴奋,很有成就感吧!现在我们就趁热打铁,再向上跨一步,一起来学习一下数码管的工作原理及使用方法,这一期实验将会更具生动性。

说到七段数码管,它在家电及工业控制中有着很广泛的应用,例如用来显示温度、数量、重量、日期、时间等,具有显示醒目、直观的优点。

在一般的人机对话中,输入器件一般都是以按键为主,但输出器件则以数码管或LCD 为主。

数码管作为一种应用十分普遍的显示器件,可以在各种各样的设备上见到,如图1 所示就是某数字表头显示时候的效果图。

它很适合用在对价格、亮度等条件比较敏感,同时基本上只要求显示数字量的时候,所以在数据显示,定时控制等场合用得很多。

常见的数码管实物如图2 所示。

图1 数码管显示效果图图2 数码管实物图首先,我们先对相关理论知识进行一番了解。

我们可以看到图1中有8 位数码管,那么这些数码管是怎样来显示1,2,3,4……数字的呢?别着急,我们一起慢慢来学。

数码管实际上是由7 个发光管组成“8”字形构成的,加上小数点就是8 个。

这些段分别由字母a,b,c,d,e,f,g,dp来表示。

当数码管特定的段加上电压后,这些特定的段就会发亮,以形成我们眼睛看到的字样了。

如:显示一个“2”字,那么应当是a 亮、b 亮、g 亮、e 亮、d 亮、f 不亮、c 不亮、dp 不亮。

7 段数码管的段排列和内结构见图3。

图3 数码管结构图由于驱动方式的差异,也就是对应在各个显示段是低电平还是高电平点亮,数码管又分成两种类型,即共阳极和共阴极数码管。

所谓“共阳极”是指8 个LED 的阳极连接在一起组成公共端;同理“共阴极”则是8 个LED 的阴极连接在一起组成公共端。

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

pic单片机4位数码管显示 1~9999循环点亮
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

(完整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*/}}}}。

PIC单片机的DS18B20程序

PIC单片机的DS18B20程序
{
uint i;
uchar j;
for(i=x;i>0;i--);
for(j=y;j>0;j--);
}
void delay(uint x)
{
uint a,b;
for(a=x;a>0;a--)
for(b=110;b>0;b--);
}
void init()
{
TRISD=0;
}
void reset()
{
uchar st=1;
DQ_HIGH();
NOP();NOP();
while(st)
{
DQ_LOW();
delayus(70,30);
DQ_HIGH();
delayus(4,4);
if(DQ==1)
st=1;
static bit j;
for(i=8;i>0;i--)
{
date=date>>1;
DQ_HIGH();
NOP();NOP();
DQ_LOW();
NOP();NOP();NOP();NOP();NOP();NOP();
DQ_HIGH();
NOP();NOP();NOP();NOP();
tem2=read_byte();
aaa=(tem2*256+tem1)*6.25;
temper=(int)aaa;
a1=temper/1000;
a2=temper%1000/100;
a3=temper%100/10;
a4=temper%10;
}
void delayus(uint x,uchar y)

PIC单片机对数码管的动态扫描显示设计

PIC单片机对数码管的动态扫描显示设计
delay();
PORTD=TABLE[5];//显示数据5(同数据0)
PORTA=0X1f;
delay();
}
}
voidinit()//I/O口初始化函数
{
TRISA=0X00;//设置A0输出,其他输入
TRISD=0X00;//设置D口输出
ADCON1=0X07;//设置A口为普通I/O口
PORTA=0xff;
PORTD=0xff;//先熄灭所有显示
}
voiddelay()//延时程序
{
inti;//定义整形变量
for(i=0x100;i--;);//延时
}
PIC单片内部资源预定义
__CONFIG(0x1832);
//芯片配置字,看门狗关,上电延时开,掉电检测关,低压编程关,加
密,4M晶体HS振荡
voiddelay();//delay函数申明
voidinit();//I/O口初始化函数申明
constcharTABLE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92};//定义常
数0-5的数据表格
voidmain()//主函数
{
while(1)//死循环,让数码管持续点亮
{
init();//调用初始化函数
PORTD=TABLE[0];//D口输出数据表格第1个数据0
PORTA=0X3E;//点亮第1位数码管
delay();//延时一定时间,保证数码管亮度
PORTD=TABLE[1];//显示数据1(同数据0)
PORTA=0X3d;
delay();
PORTD=TABLE[2];//显示数据2(同数据0)
PORTA=0X3b;

pic16f688 数码管电压表程序代码

pic16f688 数码管电压表程序代码

pic16f688 数码管电压表程序代码摘要:1.引言2.pic16f688 单片机简介3.数码管电压表的工作原理4.程序代码概述5.程序代码详细解析6.结论正文:1.引言本文将详细介绍pic16f688 单片机数码管电压表的程序代码。

数码管电压表是一种常用的电子测量仪器,广泛应用于各种电子设备和电路中。

通过使用pic16f688 单片机,我们可以实现对电压的精确测量和显示。

2.pic16f688 单片机简介PIC16F688 是Microchip 公司生产的一款高性能、低功耗的8 位单片机。

它具有丰富的内置功能,如256 字节的数据存储器、32 字节的程序存储器、15 个I/O 引脚等,可满足各种应用场景的需求。

3.数码管电压表的工作原理数码管电压表的工作原理主要是通过pic16f688 单片机对输入电压进行采样、处理和显示。

首先,将待测电压通过采样电路输入到单片机,然后单片机对电压信号进行处理,将其转换为可供数码管显示的数字信号。

最后,通过驱动电路将数字信号转换为数码管的显示内容。

4.程序代码概述本文提供的程序代码主要包括以下部分:- 初始化部分:配置单片机的时钟、引脚等资源;- 电压采样部分:通过模拟多路开关对输入电压进行采样;- 电压处理部分:对采样电压进行放大、滤波、模数转换等处理;- 数码管显示部分:将处理后的数字信号转换为数码管的显示内容;- 主循环部分:执行整个测量过程。

5.程序代码详细解析(1)初始化部分```c#include <reg52.h>#include <intrins.h>sbit DLED = P1^0; // 数码管段选引脚sbit DP = P1^1; // 数码管位选引脚void init(); // 初始化函数void delay(); // 延时函数```(2)电压采样部分```cvoid sample_voltage() {// 模拟多路开关采样电路}```(3)电压处理部分```cvoid process_voltage() {// 放大、滤波、模数转换等处理}```(4)数码管显示部分```cvoid display_voltage() {// 将处理后的数字信号转换为数码管的显示内容}```(5)主循环部分```cvoid main() {init();while(1) {sample_voltage();process_voltage();display_voltage();}}```6.结论本文详细介绍了pic16f688 单片机数码管电压表的程序代码。

PIC单片机驱动LED数码管显示程序

PIC单片机驱动LED数码管显示程序

PIC单片机驱动LED数码管显示程序;*****该程序用于驱动led 数码管显示,在8 个LED 数码管上依次显示数字1、2、3、4、5、6、7、8*******;****51hei 单片机学习网经典程序已测试,led 数码管共阴和共阳不同请修改码值转换表部分LIST P=18F458INCLUDE “P18F458.INC”;所用的寄存器XIANR EQU 0X20ORG 0X00GOTO MAINORG 0X30;****************以下为码值转换表********************CONVERT ADDWF PCL,1RETLW 0XC0 ;0,显示段码与具体的硬件连接有关RETLW 0XF9 ;1RETLW 0XA4 ;2RETLW 0XB0 ;3RETLW 0X99 ;4RETLW 0X92 ;5RETLW 0X82 ;6RETLW 0XD8 ;7RETLW 0X80 ;8RETLW 0X90 ;9RETLW 0X88 ;ARETLW 0X83 ;BRETLW 0XC6 ;CRETLW 0XA1 ;DRETLW 0X86 ;ERETLW 0X8E ;FRETLW 0X7F ;”.”RETLW 0XBF ;”-”RETLW 0X89 ;HRETLW 0XFF ;DARKRETURN;**************初始化子程序*****************INITIAL BCF TRISA,5 ;置RA5 为输出方式,以输出锁存信号BCF TRISC,5BCF TRISC,3 ;设置SCK 与SDO 为输出方式BCF INTCON,GIE ;关闭所有中断MOVLW 0XC0MOVWF SSPSTAT ;设置SSPSTAT 寄存器MOVLW 0X30MOVWF SSPCON1 ;设置SPI 的控制方式,允许SSP 方式,并且时钟下降;沿发送数据,与”74HC595当其SCLK 从低到高电平;跳变时,串行输入数据(DI)移入寄存器”的特点相对应MOVLW 0X11 ;显示值寄存器赋初值,每个值占两个字节,MOVWF XIANR ;从8 开始显示RETURN ;返回;***************led 数码管显示子程序******************;SPI 发送显示子模块DISPLAYTRANSMIT CLRF PORTA;LACK 送低电平,为锁存做准备MOVWF SSPBUF ;启动发送WAIT BTFSS PIR1,SSPIFGOTO WAIT ;等待发送结束BCF PIR1,SSPIF ;清除中断标志。

PIC单片机之数码管

PIC单片机之数码管
现在我们已经了解了整个显示过程,所以我们也就有了写程序的思路: 程序中应该有一个变量,每隔一定时间在 0~9 之间变化,然后按照这个数 据去查找段码表,把查到的数据送到 RC 口,段码值我们参照表 2 中共阳 这一项。
我们使用 MPLab IDE 软件来进行 C 语言编程,它是我们的编程环境, 同时我们可以通过使用 ICD2 仿真烧写器和增强型 PIC 实验板连接进行程 序的仿真调试和烧写步骤,具体的操作步骤,我们已经在前几期做了详细的 说明和介绍,在此就不再重复,读者可以参阅以前的文章或直接登陆我们的 网站查看资料。前面,我们已经对硬件原理和软件编写思路进行了了解,现 在我们可以输入程序代码进行调试了。我们在 MPLab IDE 软件中新建工程, 加入源程序代码,同时进行芯片型号的选择和配置位的设置,我们实验所用 的芯片型号为 PIC16F877A。上面理论说了一大堆,现在我们可以从这里开
始动手了。本来 6 个数码管可以各自显示不同数字,RA 口动态扫描,每个 瞬间只有一个管显示,视觉上感到是 6 位数。作为初次实验,我们的任务是 要让六个数码管同时显示数字“0”~“9”字样,时间间隔为 1 秒。
#include<pic.h> const unsigned char display_numb[10]={0x c0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xd8,0x80,0 x90}; void delay_1ms(void) { unsigned int n; for(n=0;n<50;n++) { NOP(); } } void delay_ms(unsigned int time) { for(;time>0;time--) { delay_1ms(); } }

单片机指令编程实例数码管显示程序设计

单片机指令编程实例数码管显示程序设计

单片机指令编程实例数码管显示程序设计在单片机的开发中,数码管是一种常见的输出设备。

通过编程控制数码管的显示,我们可以实现各种功能,如计时、计数、温度显示等。

本文将介绍一个简单的单片机指令编程实例,用于设计一个数码管显示程序。

一、概述数码管是一种由七段LED组成的显示器件,每个数码管可以显示0-9的数字。

通过合理的控制,可以将多个数码管连接起来并显示多位数值。

在这个实例中,我们将使用AT89C51单片机和共阳数码管进行程序设计。

二、硬件连接将数码管的七段LED引脚依次连接到单片机的GPIO引脚,并将共阳极引脚连接到单片机的VCC。

为了方便控制,可以利用74HC595芯片实现数码管的级联连接,这样只需要使用三个IO口即可控制多个数码管。

三、程序设计程序设计的主要逻辑是通过编写一系列的指令来控制数码管的显示。

以下是一个简单的实例程序:```#include <reg51.h>sbit SDA = P1^0; // 74HC595芯片的串行数据引脚sbit SCK = P1^1; // 74HC595芯片的时钟引脚sbit RCK = P1^2; // 74HC595芯片的输出使能引脚unsigned char code num[10] = {0xC0, // 数字0的显示码0xF9, // 数字1的显示码0xA4, // 数字2的显示码0xB0, // 数字3的显示码0x99, // 数字4的显示码0x92, // 数字5的显示码0x82, // 数字6的显示码0xF8, // 数字7的显示码0x80, // 数字8的显示码0x90 // 数字9的显示码};void delay(unsigned int t) {unsigned int i;while (t--) {for (i = 0; i < 1000; i++);}}void writeByte(unsigned char dat) {unsigned char i;for (i = 0; i < 8; i++) {SDA = (dat & 0x80) ? 1 : 0;dat <<= 1;SCK = 0;SCK = 1;}}void display(unsigned char n) {unsigned char i;for (i = 0; i < 8; i++) {writeByte(num[n]);RCK = 1;RCK = 0;delay(1); // 延时一段时间,使数码管显示出来}}void main() {unsigned char i;while (1) {for (i = 0; i < 10; i++) {display(i);delay(500); // 每个数字显示的时间间隔为500ms}}}```以上程序通过将各个数字的显示码存储在一个数组中,然后通过控制74HC595芯片的串行数据引脚、时钟引脚和输出使能引脚,来实现数码管的动态显示。

PIC单片机按键检测,单双击、长短按识别

PIC单片机按键检测,单双击、长短按识别

硬件PIC16F883芯片,10个按键,4位数码管。

【芯片引脚】【数码管连接】PORTC连接数码管的8段LED,PORTA<3:0>连接数码管的4个共阴极(控制选通位)。

【按键连接】按键扫描程序在上一篇博文里面有说明,现在还是使用上面的扫面方式(代码都是一样的)。

用记录按键按下和弹起的时间判断是不是长按和双击。

TMR1设置,1:4分频、1:8预分频,计数周期为8uS。

TMR1溢出一次时间为0.524288 S keypress记录TMR1溢出的次数。

keypress大于等于2就跳出检测,认为他是长按(时间为1.048576S)。

keypress<1 且keyrelease <1 ,再次按下的keypress<1就认为是双击。

如下图:KP按键按下,KR按键弹起。

【实现代码】1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 #include<p16f883.inc>__CONFIG _CONFIG1, _LVP_OFF & _FCMEN_ON & _IESO_OFF & _BOR_OFF & _CPD_OFF & _CP_OFF & _MCLRE_ON & _PWRTE_ON & _WDT_OFF &_INTRC_OSC_NOCLKOUT__CONFIG _CONFIG2, _WRT_OFF & _BOR21Vudata_shrcounter res 1 ;计数个位counter0 res 1 ;计数十位counter1 res 1 ;扫描按键变量counter2 res 1 ;延时程序微调参数key_state res 1 ;按键状态keynum res 1 ;按键标号swap res 1 ;确认按键转换值29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 keypress res 1keypressbak res 1keyrelease res 1LED1 res 1LED2 res 1LED3 res 1LED4 res 1UDATAcounter3 res 1counter4 res 1sign res 1reset code 0x0000pagesel startgoto start;int_vector code 0x0004codestartbanksel ANSEL ;设置PORTA 为数字模式clrf ANSELbanksel ANSELH ;设置PORTB 为数字模式73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 clrf ANSELHbanksel TRISB ;设置PORTB 为输入模式movlw b '11111111'movwf TRISBbanksel WPUB ;设置PORTB 弱上拉movlw b '11111111'movwf WPUBbanksel OPTION_REGmovlw b '01000101' ;TMR0 64分频movwf OPTION_REGbanksel T1CONmovlw b '10010001' ;打开TMR1,设置1:8预分频,内部时钟源1:4分频movwf T1CONbanksel TRISA ;设置PORTA<3:0>为输出,接数码管的共阴极movlw b '11110000'movwf TRISAbanksel PORTAclrf PORTAbanksel TRISCmovlw b '00000000' ;设置PORTC 为输出,接8段数码管movwf TRISCclrf counter1117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159loopmovlw HIGH Table1movwf PCLATHmovf counter1,0call Table1banksel TRISBmovwf TRISBmovf counter1,0call Table1banksel PORTBmovwf PORTBmovf PORTB,0movwf key_statemovlw b '11001000'iorwf key_state,1movf counter1,0call Table1xorwf key_state,0movwf swapcomf swap,1161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 incfsz swap,1goto case1incf counter1,1movf counter1,0call Table1banksel TRISBmovwf TRISBmovf counter1,0call Table1banksel PORTBmovwf PORTBmovf PORTB,0 ;读取I/O 状态movwf key_statemovlw b '11001000'iorwf key_state,1movf counter1,0call Table1xorwf key_state,0movwf swapcomf swap,1incfsz swap,1205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 goto case2incf counter1,1movf counter1,0call Table1banksel TRISBmovwf TRISBmovf counter1,0call Table1banksel PORTBmovwf PORTBmovf PORTB,0 ;读取I/O 状态movwf key_statemovlw b '11001000'iorwf key_state,1movf counter1,0call Table1xorwf key_state,0movwf swapcomf swap,1incfsz swap,1goto case3249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291incf counter1,1movf counter1,0call Table1banksel TRISBmovwf TRISBmovf counter1,0call Table1banksel PORTBmovwf PORTBmovf PORTB,0 ;读取I/O 状态movwf key_statemovlw b '11001000'iorwf key_state,1movf counter1,0call Table1xorwf key_state,0movwf swapcomf swap,1incfsz swap,1goto case4goto continue293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335case1btfsc key_state,4goto key2movlw d '1'movwf keynumcall DealKeyPressgoto continuekey2btfsc key_state,2goto key3movlw d '2'movwf keynumcall DealKeyPressgoto continuekey3btfsc key_state,1goto key4movlw d '3'movwf keynumcall DealKeyPressgoto continue337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 key4btfsc key_state,0goto continuemovlw d '4'movwf keynumcall DealKeyPressgoto continuecase2;-------------------------------------------------;下面代码实现K10\K8\K5的按键处理btfsc key_state,2goto key8movlw d '10'movwf keynumcall DealKeyPressgoto continue;------------------------------------;处理K8381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 key8btfsc key_state,1goto key5movlw d '8'movwf keynumcall DealKeyPressgoto continue;------------------------------------;处理K5key5btfsc key_state,0goto case3movlw d '5'movwf keynumcall DealKeyPressgoto continuecase3;----------------------------------;处理K6/K9btfsc key_state,1goto key6425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 movlw d '9'movwf keynumcall DealKeyPressgoto continuekey6btfsc key_state,0goto case4movlw d '6'movwf keynumcall DealKeyPressgoto continuecase4;-----------------------------------------;处理K7btfsc key_state,0goto continuemovlw d '7'movwf keynumcall DealKeyPresscontinuecall display469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 clrf counter1goto loop;-----------------------------------;按键去抖,约8mSdelaymovlw d '4'movwf counter2LOOP2banksel TMR0clrf TMR0LOOP1banksel INTCONbtfss INTCON,T0IFgoto LOOP1bcf INTCON,T0IFdecfsz counter2,1goto LOOP2returndelay2513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 incfsz counter3,1goto delay2return;--------------------------------;按键处理程序;DealKeyPressclrf LED1clrf LED2clrf LED3clrf LED4call delaybanksel TMR1Hclrf TMR1Hbanksel TMR1Lclrf TMR1Lclrf keypresspresstimebanksel PIR1btfss PIR1,TMR1IF557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 goto nextbcf PIR1,TMR1IFincf keypressmovlw d '2'subwf keypress,0banksel STATUSbtfsc STATUS,Cgoto longpressnextmovf counter1,0call Table1banksel TRISBmovwf TRISBbanksel PORTBmovwf PORTBmovf PORTB,0 ;读取I/O 状态movwf key_statemovlw b '11001000'iorwf key_state,1movf counter1,0call Table1xorwf key_state,0601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 movwf swapcomf swap,1incfsz swap,1goto presstimecall delaybanksel TMR1Hclrf TMR1Hbanksel TMR1Lclrf TMR1Lclrf keyreleasereleasetimebanksel PIR1btfss PIR1,TMR1IFgoto next1bcf PIR1,TMR1IFincf keyreleasemovlw d '1'subwf keyrelease,0banksel STATUSbtfsc STATUS,C644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 goto clicknext1movf counter1,0call Table1banksel TRISBmovwf TRISBbanksel PORTBmovwf PORTBmovf PORTB,0 ;读取I/O 状态movwf key_statemovlw b '11001000'iorwf key_state,1movf counter1,0call Table1xorwf key_state,0movwf swapcomf swap,1incfsz swap,1goto overgoto releasetimeovercall delay688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 banksel TMR1Hclrf TMR1Hbanksel TMR1Lclrf TMR1Lclrf keypresspresstime1banksel PIR1btfss PIR1,TMR1IFgoto next2bcf PIR1,TMR1IFincf keypressmovlw d '1'subwf keypress,0banksel STATUSbtfsc STATUS,Cgoto clicknext2movf counter1,0call Table1banksel TRISBmovwf TRISBbanksel PORTB732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 movwf PORTBmovf PORTB,0 ;读取I/O 状态movwf key_statemovlw b '11001000'iorwf key_state,1movf counter1,0call Table1xorwf key_state,0movwf swapcomf swap,1incfsz swap,1goto presstime1movf keynum,0 ;双击movwf LED1movlw d '10'movwf LED2incf countergoto backlongpress ;长按movf keynum,0movwf LED2movlw d '10'776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 movwf LED1goto backclick ;单击movf keynum,0movwf LED1movwf LED2backcall CountNumreturn;----------------------------;按键计数;CountNummovlw d '9'subwf counter,0banksel STATUSbtfsc STATUS,Cgoto addincf counter820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 goto over1addincf counter0clrf countermovlw d '10'subwf counter0,0banksel STATUSbtfsc STATUS,Cgoto cleargoto over1clearclrf counter0over1movf counter,0movwf LED4movf counter0,0movwf LED3return864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 ;--------------------------------;显示数码管;displaybanksel PORTAmovlw b '11111110'movwf PORTAmovf LED1,0call Table3banksel PORTCmovwf PORTCcall delay2banksel PORTAmovlw b '11111101'movwf PORTAmovf LED2,0call Table3banksel PORTCmovwf PORTCcall delay2908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951banksel PORTAmovlw b '11111011'movwf PORTAmovf LED3,0call Table3banksel PORTCmovwf PORTCcall delay2banksel PORTAmovlw b '11110111'movwf PORTAmovf LED4,0call Table3banksel PORTCmovwf PORTCcall delay2return;----------------------;Table 真值表;952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 Table1 ;PORTB 、TRISB 扫描配置信息ADDWF PCL,fRETLW B '11111111'RETLW B '11101111'RETLW B '11111011'RETLW B '11111101'Table3 ;PORTC 设置,数码管真值表ADDWF PCL,f; RETLW B '01001001' ;三条横线RETLW B '10111111' ;0RETLW B '00000110' ;1RETLW B '01011011' ;2RETLW B '01001111' ;3RETLW B '01100110' ;4RETLW B '01101101' ;5RETLW B '01111101' ;6RETLW B '00000111' ;7RETLW B '01111111' ;8RETLW B '01101111' ;9RETLW B '00000000' ;黑屏end长按效果——3、4位数码管计数一直加,1位数码管熄灭,2位数码管显示按键编号;双击效果——3、4位数码管计数增加2,2位数码管熄灭,1位数码管显示按键编号;单击效果——1、2数码管显示按键编号,3、4位数码管计数增加1。

PIC单片机实验指导书

PIC单片机实验指导书

实验一MPLAB IDE系统使用向导一、启动MPLAB IDE启动MPLAB IDE有两种方式:(1)Start>Programs>Microchip>MPLAB IDE 7.41>MPLAB IDE。

(不同版本的MPLAB IDE软件可能路径名称会略有不同。

)(2)双击桌面上的MPLAB IDE 图标二、创建源文件选择File(文件)>new…(新建),出现一个文本编辑窗口,在该窗口中输入以下汇编语言源程序先创建文件夹F:\myprj,然后将上面输入的源程序保存该文件夹,注意文件的扩展名为asm,这里我们将它保存为exam1.asm:文件保存后,我们发现源程序编辑窗口中的程序被着上了各种颜色,这些颜色能帮助我们更好地阅读源程序,快速发现输入有误的指令:三、创建项目项目是将文件组织起来以便进行编译和汇编的方式。

选择Project(项目)>new…(新建),出现New Project(新项目)对话框:在New Project(新项目)对话框中,我们将这个示例项目命名为MyPrj,使用Browse 按钮,将项目放在名为D:\myprj的文件夹中。

单击OK按钮,在MPLAB IDE 界面上我们会看到已创建项目的的项目窗口,如下图:四、给项目节点添加文件源文件是必须添加的。

其他文件,如头文件、库文件、链接描述文件,视项目的具体情况可加可不加。

在本实例中,只添加一个源文件exam1.asm,在左边的项目窗口中找到Source Files节点,在其上点鼠标右键,在弹出的快捷菜单中选Add Files(如上图所示)。

双击要添加的文件exam1.asm,或单击要添加的文件exam1.asm,然后点“打开”按纽:文件添加成功后的项目窗口如下,Source Files节点下已经添加了文件 exam1.asm五、编译文件选择Project>Build All 或在项目窗口中的项目名称上点击右键,并从弹出菜单中选择“Build All”。

单片机按键扫描数码管显示C语言程序

单片机按键扫描数码管显示C语言程序

单片机按键扫描数码管显示C语言程序按键扫描数码管显示程序共定义了6个键的功能:K1、K2、K3、K4以及K5、K8组成的一对复合键,其中K2,K3为连击键,K5为上档键。

在正常工作模式下按K1则切换至状态,在设定模式下按K1键循环选择4个数码管中的某个,被选中的数码管闪烁,此时单按K2键显示数值加1;常按K2显示数值以一定速度递增,同时数码管停止闪烁,当K2松开,数码管恢复闪烁,显示数值停留在K2松开前的值上。

K3完成的功能和K2类似。

其完成减操作。

这2个键只有在设定状态才有效,可以有效防止误操作。

K4为确认键,按下该键回到正常显示状态,所有指示灯熄灭,数码管显示刚刚设定的数值。

K5+K8这对复合键执行复位操作,任何情况下同时按下K5和K8或先按下K5再按下K8,所有数码管的显示全为0,指示灯全灭,进入正常显示状态。

同时程序还对如下几个异常操作进行了处理:1. 2个或多个功能键同时按下2. 一个功能键按下未释放,又按另一个功能键,然后再松开其中一个功能键3. 先按下功能键再按下上档键4. 多个上档键和一个功能键同时按下,此时不做处理。

等到松开其他上档键,只剩下一个上5. 档键和一个功能键时才执行这对复合键;或松开所有上档键,处理单一功能键。

/****************************************************************************** */#include <iom8v.h>#include <macros.h>#define uchar unsigned char#define uint unsigned int#define RCtrl 0x20 //定义上挡键第5键#define RConti 0xfe //定义连击键第6键#define N 2 //去抖年龄下限#define MaxRate 50 //重复前的延迟值 600ms#define MinRate 20 //重复速度 240ms#define leddark 83 //闪烁时灭时间1s#define ledshow 83 //闪烁时亮时间1s#define decimal 0x80 //小数点的段数#define KEY_DDR DDRC#define KEY_PORTO PORTC#define KEY_PORTI PINC#define OUT 0x3f#define IN 0xc0#define KeyValue 0x3f#define LEDD_DDR DDRB#define LEDD_PORTO PORTB#define LEDS_DDR DDRD#define LEDS_PORTO PORTD#define LEDS_MASK 0xfc#define LEDS_NUM 0x06#define TRUE 1#define FALSE 0/*定义键盘扫描程序返回数据类型*/typedef struct{uchar shiftcnt; //上档键的个数值uchar funcnt; //功能键的个数值uchar shiftval; //最后扫描到的上档键的值uchar funval; //最后扫描到的功能键的值} keyret;/*定义显示字符段码*/uchar const led_stroke[19] ={//0,1,2,3,4,5,6,7,8,90x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F,//a,b,C,d,e,F,P,0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71, 0x73,//all on all off0xff, 0x00};/*定义位选码*/uchar const led_cs[LEDS_NUM] ={0xfb, //111110110xf7, //111101110xef, //111011110xdf, //110111110xbf, //101111110x7f //01111111};uchar led_buf[LEDS_NUM] ={0x73, 0x81, 0x82, 0x83, 0x84,0x85};uchar *pb = &led_buf[1]; //定义指向数码管数据缓冲区的指针/*定义全局变量*/uchar task, state; //task:按键状态,0:去抖 1,重复的延迟 2,重复//state:显示位置变量uchar keydone, keyprocess; //keydone: 按键任务完成标志,为1表示已完成//keyprocess: 按键有效标志,为1时表示对按键执行uchar keypre[2] ={0x00, 0x00}; //存放上次功能键和上档键的键值//keypre0存放功能键uchar blink, ledtime; //blink:闪烁控制寄存器,某位为1时闪烁//d7d6d5d4d3d2d1d0//xxxx1111//ledtime:累计闪烁时已点亮和已熄灭的时间uchar ledtask; //ledtask: 当前的闪烁状态,0代表亮uchar keymark; //keymark:只是当前工作状态,为1时处于设定状态,为0时正常工作uchar enflash; //enflash:闪烁使能标志,1闪烁#define shut_dis() LEDS_PORTO|=LEDS_MASK; //shut display/****************************************************************************** **函数原型: uchar _crol_(uchar data,uchar shiftbit);*功能:字节左移shiftbit*参数:*说明:****************************************************************************** */uchar _crol_(uchar data,uchar shiftbit){data &=0xff;if(shiftbit>8)return 0;return ((~data)<<shiftbit);}/****************************************************************************** **函数原型: uchar _cror_(uchar data,uchar shiftbit);*功能:字节右移shiftbit*参数:*说明:****************************************************************************** */uchar _cror_(uchar data,uchar shiftbit){data &=0xff;if(shiftbit>8)return 0;return ((~data)>>shiftbit);}/****************************************************************************** **函数原型: void send_shift(uchar d);*功能: 将显示数据由B口送出****************************************************************************** */void send_shift(uchar data){LEDD_PORTO = data;}/****************************************************************************** **函数原型: void lflash();*功能:闪烁处理。

用PIC单片机驱动按键控制8个数码管的显示的C程序

用PIC单片机驱动按键控制8个数码管的显示的C程序

用PIC16F877A单片机驱动按键控制8个数码管的显示的C程序经典按键控制数码管C程序#include <htc.h>#define HC595_SER RB7#define HC595_SCK RB6#define HC595_RCK RB5#define key_164_data RB3#define key_164_clk RB2#define key_com1 RB1#define key_com0 RB0#define TURE 1bit key_finish; //定义的位变量,这是PICmate仿真软件环境的特有的地方unsigned int sample_key;unsigned int sample_keyBuf[2];unsigned int key_value;unsigned char key_row_sel;unsigned char key_number;//键号unsigned int T100ms;unsigned char disbuf[8];const unsigned char seven_seg[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5 e,0x79,0x71};//----------------------------------------------void disbuf_update(void){if(key_number>=16){disbuf[0]=0xff;disbuf[1]=0xff;disbuf[2]=0xff;disbuf[3]=0xff;disbuf[4]=0xff;disbuf[5]=0xff;disbuf[6]=0xff;disbuf[7]=0xff;return;}disbuf[0]=seven_seg[key_number];disbuf[1]=seven_seg[key_number];disbuf[2]=seven_seg[key_number];disbuf[3]=seven_seg[key_number];disbuf[4]=seven_seg[key_number];disbuf[5]=seven_seg[key_number];disbuf[6]=seven_seg[key_number];disbuf[7]=seven_seg[key_number];}//----------------------------------------------void inite_time0(void) //对timer0中断进行初始化{PSA=0;T0CS=0;T0IF=0;GIE=1;T0IE=1;TMR0=0xf0;PS0=1;PS1=1;PS2=1;}//----------------------------------------------//发送一个字节void s_pData(unsigned char key) //形参key对应着实参disbuf[i]{unsigned char i;for(i=0;i<8;i++){if(0x80&(key<<i))HC595_SER=1;else HC595_SER=0;HC595_SCK=0;HC595_SCK=1;}}//----------------------------------------------//发送一个字节void Key_s_pData(unsigned char key){unsigned char i;for(i=0;i<8;i++){if(0x80&(key<<i))key_164_data=1;elsekey_164_data=0;key_164_clk=0;key_164_clk=1;}}//---------------------------------------------- void display (void){unsigned char i;for(i=0;i<8;i++)s_pData(disbuf[i]);HC595_RCK=0;HC595_RCK=1;}//---------------------------------------------- void key_process(void){unsigned char i;for(i=0;i<16;i++){if( (key_value&(0x0001<<i)) ){key_number=i;return;}}}//---------------------------------------------- //主程序int main(void){PORTB=0;TRISB=0x03;inite_time0();key_number=0xff;while(1){if(key_finish==TURE){//按键扫描成功key_process();key_finish=0;}if(T100ms<10)continue;T100ms=0;disbuf_update();display();}}//---------------------------------------------- void scan_key(void){sample_key =sample_key<<1;if(key_com1)sample_key |=0x0001;sample_key =sample_key<<1;if(key_com0)sample_key |=0x0001;key_row_sel++;if(key_row_sel<8){Key_s_pData(1<<key_row_sel);return;}key_row_sel=0;Key_s_pData(1<<key_row_sel);sample_keyBuf[0]=sample_key;if(sample_keyBuf[1]!=sample_keyBuf[0]){sample_keyBuf[1]=sample_keyBuf[0];return;}key_value=sample_keyBuf[0];if(key_value!=0)key_finish=TURE;}//-------------------------------------------- //2ms中断interruptvoid time_int(void){if(T0IF==1){T0IF=0;TMR0=0xf0;T100ms++;scan_key();}}它的电路图可以参考用PIC16F877A单片机驱动按键控制8个数码管的显示电路图.。

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(;;)//无限循环{}}。

PIC单片机数码管流水灯代码

PIC单片机数码管流水灯代码

PIC单片机数码管(流水灯)代码#INCLUDE p16f886.inc__config _CONFIG1, _INTOSCIO & _WDT_OFF CONTEXT_SAVING UDATA_SHROFFSET RES 1RESET CODE 0x0PAGESEL INITGOTO INITCODEINITBANKSEL TRISCCLRF TRISCBANKSEL PORTCMOVLW B'11111111'MOVWF PORTCBANKSEL TRISACLRF TRISABANKSEL PORTACLRF PORTABANKSEL ANSELCLRF ANSELPAGESEL MAINGOTO MAIN ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;这里是函数区;;;;;;;;;;;;;;;;; SELECT1:BANKSEL PORTCMOVLW B'11111111'MOVWF PORTCBCF PORTC,0RETURNSELECT2:BANKSEL PORTCMOVLW B'11111111'MOVWF PORTCBCF PORTC,1RETURNSELECT3:BANKSEL PORTCMOVLW B'11111111'MOVWF PORTCBCF PORTC,2RETURNSELECT4:BANKSEL PORTCMOVLW B'11111111'MOVWF PORTCBCF PORTC,3RETURNWRITE:BANKSEL PORTACLRF PORTAMOVLW LOW TABLE ;获得TABLE的低8位ADDWF OFFSET,F;TABLE值加上偏移量MOVLW HIGH TABLE;获得TABLE的高5位BTFSC STATUS,C;检测是否翻页ADDLW 1;翻页则在TABLE的高5位加一MOVWF PCLATH;将TABLE的高5位写入PCLATH MOVF OFFSET,W;将需要调用的信号的地址写入W CALL TABLE;XORWF B'00000000',WMOVWF PORTARETURNTABLE:MOVWF PCL;转到偏移的地址RETLW B'00111111';0;;;;;;;;;;;;3FRETLW B'00000110';1RETLW B'01011011';2;;;;;;;;;;;;5BRETLW B'01001111';3RETLW B'01100110';4RETLW B'01101101';5RETLW B'01111101';6RETLW B'00000111';7RETLW B'01111111';8RETLW B'01101111';9;;;;;;;;;;函数区到此为止;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; MAINLOOPCALL SELECT1BANKSEL OFFSETMOVLW D'3'MOVWF OFFSETCALL WRITE ;;;;;;;;;;;;;;;;;;;;;;;;;;CALL SELECT2BANKSEL OFFSETMOVLW D'1'MOVWF OFFSETCALL WRITE ;;;;;;;;;;;;;;;;;;;;;;;;;;;;CALL SELECT3BANKSEL OFFSETMOVLW D'1'MOVWF OFFSETCALL WRITE ;;;;;;;;;;;;;;;;;;;;;;;;;;;;CALL SELECT4BANKSEL OFFSETMOVLW D'4'MOVWF OFFSETCALL WRITEGOTO LOOPEND ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;显示2003#INCLUDE p16f886.inc__config _CONFIG1, _INTOSCIO & _WDT_OFF CONTEXT_SAVING UDATA_SHRW_TMP RES 1S_TMP RES 1OFFSET RES 1NUM RES 1CNUM RES 1COFFSET RES 1LP0 RES 1LP1 RES 1RESET CODE 0x0PAGESEL INITGOTO INIT;ISR CODE 0x04;MOVWF W_TMP;SWAPF STATUS,W;MOVWF S_TMP; NOP;SWAPF S_TMP,W;MOVWF STATUS;SWAPF W_TMP,F;SWAPF W_TMP,W;RETFIECODEINITBANKSEL TRISCCLRF TRISCBANKSEL PORTCMOVLW B'11111111'MOVWF PORTCBANKSEL TRISACLRF TRISABANKSEL PORTACLRF PORTABANKSEL OFFSETCLRF OFFSETBANKSEL OSCCONMOVLW B'00000011'MOVWF OSCCON ;;;;;;;;;;;;;;;;;;;;;;振荡器设置为310KHz,内部振荡器;BANKSEL NUM;CLRF NUMBANKSEL COFFSETMOVLW D'10'MOVWF COFFSETBANKSEL CNUMMOVLW D'4'MOVWF CNUMPAGESEL MAINGOTO MAIN ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;这里是函数区;;;;;;;;;;;;;;;;; SELECT:BANKSEL PORTCMOVLW LOW STABLE ;获得TABLE的低8位ADDWF NUM,F;TABLE值加上偏移量MOVLW HIGH STABLE;获得TABLE的高5位BTFSC STATUS,C;检测是否翻页ADDLW 1;翻页则在TABLE的高5位加一MOVWF PCLATH;将TABLE的高5位写入PCLATH MOVF NUM,W;将需要调用的信号的地址写入W CALL STABLE;MOVWF PORTCRETURN;ORG 0x9FDSTABLE:MOVWF PCL;转到偏移的地址RETLW B'11111110';1RETLW B'11111101';2RETLW B'11111011';3RETLW B'11110111';4WRITE:MOVLW LOW TABLE ;获得TABLE的低8位ADDWF OFFSET,F;TABLE值加上偏移量MOVLW HIGH TABLE;获得TABLE的高5位BTFSC STATUS,C;检测是否翻页ADDLW 1;翻页则在TABLE的高5位加一MOVWF PCLATH;将TABLE的高5位写入PCLATH MOVF OFFSET,W;将需要调用的信号的地址写入W CALL TABLE;MOVWF PORTARETURN;ORG 0x9FDTABLE:MOVWF PCL;转到偏移的地址RETLW B'00000110';1RETLW B'01011011';2RETLW B'01001111';3 RETLW B'01100110';4 RETLW B'01101101';5 RETLW B'01111101';6 RETLW B'00000111';7 RETLW B'01111111';8 RETLW B'01101111';9 RETLW B'00111111';0 DELAY:MOVLW 01FHMOVWF LP0L0 MOVLW 01FH MOVWF LP1L1 DECFSZ LP1,F GOTO L1DECFSZ LP0,FGOTO L0RETURN SETCNUM:MOVLW D'4'MOVWF CNUM RETURNSETCOFFSET:MOVLW D'10'MOVWF COFFSETRETURN;;;;;;;;;;函数区到此为止;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; MAIN;ORG 0x80BANKSEL ANSELCLRF ANSELLOOPMOVF COFFSET,WMOVWF OFFSETMOVF CNUM,WMOVWF NUMCALL SELECTCALL WRITEDECF COFFSETBTFSC STATUS,ZCALL SETCOFFSETDECF CNUMBTFSC STATUS,ZCALL SETCNUMCALL DELAYGOTO LOOPEND ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;98765432 10单数字滚动显示#INCLUDE p16f886.inc__config _CONFIG1, _INTOSCIO & _WDT_OFF CONTEXT_SAVING UDATA_SHRW_TMP RES 1S_TMP RES 1OFFSET RES 1COFFSET RES 1NUM RES 1CNUM RES 1PA RES 1CNT RES 1LP0 RES 1LP1 RES 1ISBLACK RES 1RESET CODE 0x0PAGESEL INITGOTO INITISR CODE0x04;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;MOVWF W_TMPSWAPF STATUS,WMOVWF S_TMP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;BANKSEL INTCONBCF INTCON,2 ;;;;;;;;;;;;;清除TMR0中断标志位COMF ISBLACKBTFSS ISBLACK,0CALL DECRESE_COFFSETBTFSC ISBLACK,0CALL BLACKBANKSEL TMR0CLRF TMR0 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;SWAPF S_TMP,WMOVWF STATUSSWAPF W_TMP,FSWAPF W_TMP,W RETFIE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CODEINITBANKSEL TMR0CLRF TMR0BANKSEL OPTION_REGMOVLW B'00000111'MOVWF OPTION_REG ;;;;;;;;;;;;;;;;;;;;;TMR0设置为256分频BANKSEL INTCONBSF INTCON,GIEBSF INTCON,T0IE ;;;;;;;;;;;;;;;;;;;;;总中断使能,TMR0中断使能BANKSEL TRISCCLRF TRISCBANKSEL PORTCMOVLW B'11111111'MOVWF PORTCBANKSEL TRISACLRF TRISABANKSEL PORTACLRF PORTABANKSEL ANSELCLRF ANSELBANKSEL OSCCONMOVLW B'00010011'MOVWF OSCCON ;;;;;;;;;;;;;;;;;;;;;;振荡器设置为125KHz,内部振荡器BANKSEL COFFSETMOVLW D'10'MOVWF COFFSET;;;;;;;;;;;;;;;;;;;;10个数字BANKSEL CNUMMOVLW D'1'MOVWF CNUM;;;;;;;;;;;;;;;;;;;;;;;;;4个数码管MOVF COFFSET,WMOVWF PA;;;;;;;;;;;;;;;;;;;;;;;;;;;PA暂时存储COFFSETMOVLW D'4'MOVWF CNT;;;;;;;;;;;;;;;;;;;;;;;;;;计数四次CLRF ISBLACKPAGESEL MAINGOTO MAIN ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;这里是函数区;;;;;;;;;;;;;;;;; SELECT:BANKSEL PORTACLRF PORTABANKSEL PORTCMOVLW B'11111111'MOVWF PORTCMOVLW LOW STABLE ;获得TABLE的低8位ADDWF NUM,F;TABLE值加上偏移量MOVLW HIGH STABLE;获得TABLE的高5位BTFSC STATUS,C;检测是否翻页ADDLW 1;翻页则在TABLE的高5位加一MOVWF PCLATH;将TABLE的高5位写入PCLATH MOVF NUM,W;将需要调用的信号的地址写入W CALL STABLE;MOVWF PORTCRETURNSTABLE:MOVWF PCL;转到偏移的地址RETLW B'11111110';1RETLW B'11111101';2RETLW B'11111011';3RETLW B'11110111';4WRITE:MOVLW LOW TABLE ;获得TABLE的低8位ADDWF OFFSET,F;TABLE值加上偏移量MOVLW HIGH TABLE;获得TABLE的高5位BTFSC STATUS,C;检测是否翻页ADDLW 1;翻页则在TABLE的高5位加一MOVWF PCLATH;将TABLE的高5位写入PCLATH MOVF OFFSET,W;将需要调用的信号的地址写入W CALL TABLE;MOVWF PORTARETURNTABLE:MOVWF PCL;转到偏移的地址RETLW B'01101111';9RETLW B'01111111';8RETLW B'00000111';7RETLW B'01111101';6RETLW B'01101101';5 RETLW B'01100110';4 RETLW B'01001111';3 RETLW B'01011011';2 RETLW B'00000110';1 RETLW B'00111111';0 SETORIGIN:MOVLW D'1'MOVWF CNUMMOVLW D'4'MOVWF CNTMOVF COFFSET,W MOVWF PARETURNSETPA:MOVLW D'10' MOVWF PARETURN SETCOFFSET: MOVLW D'10' MOVWF COFFSET RETURNDELAY:MOVLW 03FHMOVWF LP0L0 MOVLW 03FHMOVWF LP1L1 DECFSZ LP1,FGOTO L1DECFSZ LP0,FGOTO L0RETURNDECRESE_COFFSET:DECF COFFSETBTFSC STATUS,ZCALL SETCOFFSETRETURNBLACK:BANKSEL PORTACLRF PORTACALL DELAYRETURN;;;;;;;;;;函数区到此为止;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAINLOOPMOVF CNUM,WMOVWF NUM;数码管MOVF PA,WMOVWF OFFSET;图案CALL SELECT;;;;;;;;;;;;;;;;;;;;;;;;;数码管CALL WRITE;;;;;;;;;;;;;;;;;;;;;;;;;;图案DECF PABTFSC STATUS,Z;;;;;;;;;;;;;;;;;;;;;;CALL SETPA;;;;;;;;;;;;;;;;;;;;;;;;;;INCF CNUMDECF CNTBTFSC STATUS,ZCALL SETORIGINGOTO LOOPEND ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;显示0-9,闪烁一次#INCLUDE p16f886.inc__config _CONFIG1, _INTOSCIO & _WDT_OFF CONTEXT_SAVING UDATA_SHRW_TMP RES 1S_TMP RES 1OFFSET RES 1COFFSET RES 1NUM RES 1CNUM RES 1PA RES 1CNT RES 1RESET CODE 0x0PAGESEL INITGOTO INITISR CODE 0x04MOVWF W_TMPSWAPF STATUS,WMOVWF S_TMP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;以上保存现场PB_INTBTFSC INTCON,RBIFCALL PORTB_INTTM0_INTBTFSC INTCON,T0IFCALL TMR0_INT ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;以下恢复现场SWAPF S_TMP,WMOVWF STATUSSWAPF W_TMP,FSWAPF W_TMP,WRETFIECODEINIT ;;;;;;;;;;;;;;;;;;;;;;中断设置;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;BANKSEL INTCONBSF INTCON,GIEBSF INTCON,T0IE ;;;;;;;;;;;;;;;;;;;;;总中断使能,TMR0中断使能BSF INTCON,RBIE;;;;;;;;;;;;;;;;;;;;;;PORTB电平变化中断使能BANKSEL TMR0CLRF TMR0BANKSEL INTCONBCF INTCON,2 ;;;;;;;;;;;;;清除TMR0中断标志位BANKSEL OPTION_REGMOVLW B'00000111'MOVWF OPTION_REG ;;;;;;;;;;;;;;;;;;;;;TMR0设置为256分频BANKSEL PORTBBCF PORTB,4BANKSEL INTCONBCF INTCON,RBIF;;;;;;;;;;;;;;;;;;;;;;;;;;PORTB中断标志清除;;;;;;;;;;;;;;;;;;;;振荡器设置;;;;;;;;;;;;;;;;;;;;;;;;;;;;;BANKSEL OSCCONMOVLW B'00010011'MOVWF OSCCON ;;;;;;;;;;;;;;;;;;;;;;振荡器设置为125KHz,内部振荡器;;;;;;;;;;;;;;;;;;;;;;;;;;输入输出设置;;;;;;;;;;;;;;;;;;;;;;;;;;;BANKSEL TRISCCLRF TRISCBANKSEL PORTCMOVLW B'11111111'MOVWF PORTCBANKSEL TRISACLRF TRISABANKSEL PORTACLRF PORTABANKSEL ANSELCLRF ANSELBANKSEL TRISBMOVLW B'00100000'MOVWF TRISBBANKSEL IOCBMOVLW B'00100000'MOVWF IOCBBANKSEL PORTBCLRF PORTBBANKSEL WPUBMOVLW B'00100000'MOVWF WPUB ;;;;;;;;;;;;;;;;;;其他初始化;;;;;;;;;;;;;;;;;;;;;;;;; BANKSEL COFFSETMOVLW D'10'MOVWF COFFSET;;;;;;;;;;;;;;;;;;;;10个数字BANKSEL CNUMMOVLW D'1'MOVWF CNUM;;;;;;;;;;;;;;;;;;;;;;;;;4个数码管MOVF COFFSET,WMOVWF PA;;;;;;;;;;;;;;;;;;;;;;;;;;;PA暂时存储COFFSETMOVLW D'4'MOVWF CNT;;;;;;;;;;;;;;;;;;;;;;;;;;计数四次PAGESEL MAINGOTO MAIN ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;这里是函数区;;;;;;;;;;;;;;;;; SELECT:BANKSEL PORTACLRF PORTABANKSEL PORTCMOVLW B'11111111'MOVWF PORTCMOVLW LOW STABLE ;获得TABLE的低8位ADDWF NUM,F;TABLE值加上偏移量MOVLW HIGH STABLE;获得TABLE的高5位BTFSC STATUS,C;检测是否翻页ADDLW 1;翻页则在TABLE的高5位加一MOVWF PCLATH;将TABLE的高5位写入PCLATH MOVF NUM,W;将需要调用的信号的地址写入W CALL STABLE;MOVWF PORTCRETURNSTABLE:MOVWF PCL;转到偏移的地址RETLW B'11111110';1RETLW B'11111101';2RETLW B'11111011';3RETLW B'11110111';4WRITE:MOVLW LOW TABLE ;获得TABLE的低8位ADDWF OFFSET,F;TABLE值加上偏移量MOVLW HIGH TABLE;获得TABLE的高5位BTFSC STATUS,C;检测是否翻页ADDLW 1;翻页则在TABLE的高5位加一MOVWF PCLATH;将TABLE的高5位写入PCLATH MOVF OFFSET,W;将需要调用的信号的地址写入WCALL TABLE;MOVWF PORTARETURNTABLE:MOVWF PCL;转到偏移的地址RETLW B'01101111';9 RETLW B'01111111';8 RETLW B'00000111';7 RETLW B'01111101';6 RETLW B'01101101';5 RETLW B'01100110';4 RETLW B'01001111';3 RETLW B'01011011';2 RETLW B'00000110';1 RETLW B'00111111';0 SETORIGIN:MOVLW D'1'MOVWF CNUMMOVLW D'4'MOVWF CNTMOVF COFFSET,WMOVWF PARETURNSETPA:MOVLW D'10'MOVWF PARETURNSETCOFFSET:MOVLW D'10'MOVWF COFFSETRETURNTMR0_INT:BANKSEL INTCONBCF INTCON,2 ;;;;;;;;;;;;;清除TMR0中断标志位DECF COFFSETBTFSC STATUS,ZCALL SETCOFFSET ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;COFFSET减一BANKSEL TMR0CLRF TMR0RETURNPORTB_INT:BANKSEL PORTBBCF PORTB,4BANKSEL INTCONBCF INTCON,RBIF;;;;;;;;;;;;;;;;;;;;;;;;;;PORTB中断标志清除MOVLW D'10'MOVWF COFFSETBANKSEL INTCONBCF INTCON,2 ;;;;;;;;;;;;;清除TMR0中断标志位BANKSEL TMR0CLRF TMR0RETURN;;;;;;;;;;函数区到此为止;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; MAINLOOPMOVF CNUM,WMOVWF NUM;数码管MOVF PA,WMOVWF OFFSET;图案CALL SELECT;;;;;;;;;;;;;;;;;;;;;;;;;数码管CALL WRITE;;;;;;;;;;;;;;;;;;;;;;;;;;图案DECF PABTFSC STATUS,Z;;;;;;;;;;;;;;;;;;;;;;CALL SETPA;;;;;;;;;;;;;;;;;;;;;;;;;;INCF CNUMDECF CNTBTFSC STATUS,ZCALL SETORIGINGOTO LOOPEND ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;含电平触发中断的数码管滚动显示-0-9#INCLUDE p16f886.inc__config _CONFIG1, _INTOSCIO & _WDT_OFF CONTEXT_SAVING UDATA_SHRW_TMP RES 1S_TMP RES 1OFFSET RES 1COFFSET RES 1NUM RES 1CNUM RES 1PA RES 1CNT RES 1RESET CODE 0x0PAGESEL INITGOTO INITISR CODE 0x04MOVWF W_TMPSWAPF STATUS,WMOVWF S_TMP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; BANKSEL INTCONBCF INTCON,2 ;;;;;;;;;;;;;清除TMR0中断标志位DECF COFFSETBTFSC STATUS,ZCALL SETCOFFSET ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;COFFSET减一BANKSEL TMR0CLRF TMR0 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;SWAPF S_TMP,WMOVWF STATUSSWAPF W_TMP,FSWAPF W_TMP,WRETFIECODEINITBANKSEL TMR0CLRF TMR0BANKSEL OPTION_REGMOVLW B'00000111'MOVWF OPTION_REG ;;;;;;;;;;;;;;;;;;;;;TMR0设置为256分频BANKSEL INTCONBSF INTCON,GIEBSF INTCON,T0IE ;;;;;;;;;;;;;;;;;;;;;总中断使能,TMR0中断使能BANKSEL TRISCCLRF TRISCBANKSEL PORTCMOVLW B'11111111'MOVWF PORTCBANKSEL TRISACLRF TRISABANKSEL PORTACLRF PORTABANKSEL ANSELCLRF ANSELBANKSEL OSCCONMOVLW B'00010011'MOVWF OSCCON ;;;;;;;;;;;;;;;;;;;;;;振荡器设置为125KHz,内部振荡器BANKSEL COFFSETMOVLW D'10'MOVWF COFFSET;;;;;;;;;;;;;;;;;;;;10个数字BANKSEL CNUMMOVLW D'1'MOVWF CNUM;;;;;;;;;;;;;;;;;;;;;;;;;4个数码管MOVF COFFSET,WMOVWF PA;;;;;;;;;;;;;;;;;;;;;;;;;;;PA暂时存储COFFSETMOVLW D'4'MOVWF CNT;;;;;;;;;;;;;;;;;;;;;;;;;;计数四次PAGESEL MAINGOTO MAIN ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;这里是函数区;;;;;;;;;;;;;;;;;SELECT:BANKSEL PORTACLRF PORTABANKSEL PORTCMOVLW B'11111111'MOVWF PORTCMOVLW LOW STABLE ;获得TABLE的低8位ADDWF NUM,F;TABLE值加上偏移量MOVLW HIGH STABLE;获得TABLE的高5位BTFSC STATUS,C;检测是否翻页ADDLW 1;翻页则在TABLE的高5位加一MOVWF PCLATH;将TABLE的高5位写入PCLATH MOVF NUM,W;将需要调用的信号的地址写入W CALL STABLE;MOVWF PORTCRETURNSTABLE:MOVWF PCL;转到偏移的地址RETLW B'11111110';1RETLW B'11111101';2RETLW B'11111011';3RETLW B'11110111';4WRITE:MOVLW LOW TABLE ;获得TABLE的低8位ADDWF OFFSET,F;TABLE值加上偏移量MOVLW HIGH TABLE;获得TABLE的高5位BTFSC STATUS,C;检测是否翻页ADDLW 1;翻页则在TABLE的高5位加一MOVWF PCLATH;将TABLE的高5位写入PCLATH MOVF OFFSET,W;将需要调用的信号的地址写入W CALL TABLE;MOVWF PORTARETURNTABLE:MOVWF PCL;转到偏移的地址RETLW B'01101111';9RETLW B'01111111';8RETLW B'00000111';7RETLW B'01111101';6RETLW B'01101101';5RETLW B'01100110';4RETLW B'01001111';3RETLW B'01011011';2RETLW B'00000110';1RETLW B'00111111';0SETORIGIN:MOVLW D'1'MOVWF CNUMMOVLW D'4'MOVWF CNTMOVF COFFSET,WMOVWF PARETURNSETPA:MOVLW D'10'MOVWF PARETURNSETCOFFSET:MOVLW D'10'MOVWF COFFSETRETURN;;;;;;;;;;函数区到此为止;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; MAINLOOPMOVF CNUM,WMOVWF NUM;数码管MOVF PA,WMOVWF OFFSET;图案CALL SELECT;;;;;;;;;;;;;;;;;;;;;;;;;数码管CALL WRITE;;;;;;;;;;;;;;;;;;;;;;;;;;图案DECF PABTFSC STATUS,Z;;;;;;;;;;;;;;;;;;;;;;CALL SETPA;;;;;;;;;;;;;;;;;;;;;;;;;;INCF CNUMDECF CNTBTFSC STATUS,ZCALL SETORIGINGOTO LOOPEND ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;滚动显示0-9,一秒滚一次每次显示四个数字#INCLUDE p16f886.inc__config _CONFIG1, _INTOSCIO & _WDT_OFFCONTEXT_SAVING UDATA_SHRW_TMP RES 1S_TMP RES 1OFFSET RES 1COFFSET RES 1NUM RES 1CNUM RES 1PA RES 1CNT RES 1LP0 RES 1LP1 RES 1ISBLACK RES 1RESET CODE 0x0PAGESEL INITGOTO INITISR CODE0x04;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;MOVWF W_TMPSWAPF STATUS,WMOVWF S_TMP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;BANKSEL INTCONBCF INTCON,2 ;;;;;;;;;;;;;清除TMR0中断标志位COMF ISBLACKBTFSS ISBLACK,0CALL DECRESE_COFFSETBTFSC ISBLACK,0CALL BLACKBANKSEL TMR0MOVLW B'11000000'MOVWF TMR0 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;SWAPF S_TMP,WMOVWF STATUSSWAPF W_TMP,FSWAPF W_TMP,W RETFIE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CODEINITBANKSEL TMR0CLRF TMR0BANKSEL OPTION_REGMOVLW B'00000111'MOVWF OPTION_REG ;;;;;;;;;;;;;;;;;;;;;TMR0设置为256分频BANKSEL INTCONBSF INTCON,GIEBSF INTCON,T0IE ;;;;;;;;;;;;;;;;;;;;;总中断使能,TMR0中断使能BANKSEL TRISCCLRF TRISCBANKSEL PORTCMOVLW B'11111111'MOVWF PORTCBANKSEL TRISACLRF TRISABANKSEL PORTACLRF PORTABANKSEL ANSELCLRF ANSELBANKSEL OSCCONMOVLW B'00010011'MOVWF OSCCON ;;;;;;;;;;;;;;;;;;;;;;振荡器设置为125KHz,内部振荡器BANKSEL COFFSETMOVLW D'22'MOVWF COFFSET;;;;;;;;;;;;;;;;;;;;10个数字BANKSEL CNUMMOVLW D'1'MOVWF CNUM;;;;;;;;;;;;;;;;;;;;;;;;;4个数码管MOVF COFFSET,WMOVWF PA;;;;;;;;;;;;;;;;;;;;;;;;;;;PA暂时存储COFFSETMOVLW D'4'MOVWF CNT;;;;;;;;;;;;;;;;;;;;;;;;;;计数四次CLRF ISBLACKPAGESEL MAINGOTO MAIN ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;这里是函数区;;;;;;;;;;;;;;;;; SELECT:BANKSEL PORTACLRF PORTABANKSEL PORTCMOVLW B'11111111'MOVWF PORTCMOVLW LOW STABLE ;获得TABLE的低8位ADDWF NUM,F;TABLE值加上偏移量MOVLW HIGH STABLE;获得TABLE的高5位BTFSC STATUS,C;检测是否翻页ADDLW 1;翻页则在TABLE的高5位加一MOVWF PCLATH;将TABLE的高5位写入PCLATH MOVF NUM,W;将需要调用的信号的地址写入W CALL STABLE;MOVWF PORTCRETURNSTABLE:MOVWF PCL;转到偏移的地址RETLW B'11111110';1RETLW B'11111101';2RETLW B'11111011';3RETLW B'11110111';4WRITE:MOVLW LOW TABLE ;获得TABLE的低8位ADDWF OFFSET,F;TABLE值加上偏移量MOVLW HIGH TABLE;获得TABLE的高5位BTFSC STATUS,C;检测是否翻页ADDLW 1;翻页则在TABLE的高5位加一MOVWF PCLATH;将TABLE的高5位写入PCLATH MOVF OFFSET,W;将需要调用的信号的地址写入W CALL TABLE;MOVWF PORTARETURNTABLE:MOVWF PCL;转到偏移的地址RETLW B'01101111';9RETLW B'01111111';8RETLW B'00000111';7RETLW B'01111101';6RETLW B'01101101';5RETLW B'01100110';4RETLW B'01001111';3RETLW B'01011011';2RETLW B'00000110';1RETLW B'00111111';0RETLW B'00000000';NULL&mdash;&mdash;11 RETLW B'00000000';NULL&mdash;&mdash;12 RETLW B'00000000';NULL&mdash;&mdash;13 RETLW B'00000000';NULL&mdash;&mdash;14 RETLW B'01011110';d&mdash;&mdash;15RETLW B'01111001';E&mdash;&mdash;16RETLW B'01111001';E&mdash;&mdash;&mdash;&mdash;17 RETLW B'01101101';S&mdash;&mdash;18RETLW B'00000000';NULL&mdash;&mdash;19RETLW B'00000000';NULL&mdash;&mdash;20RETLW B'00000000';NULL&mdash;&mdash;21RETLW B'00000000';NULL&mdash;&mdash;22 SETORIGIN:MOVLW D'1'MOVWF CNUMMOVLW D'4'MOVWF CNTMOVF COFFSET,WMOVWF PARETURNSETPA:MOVLW D'10'MOVWF PARETURNSETCOFFSET:MOVLW D'10'MOVWF COFFSETRETURNDELAY:MOVLW 00FHMOVWF LP0L0 MOVLW 00FHMOVWF LP1L1 DECFSZ LP1,FGOTO L1DECFSZ LP0,FGOTO L0RETURNDECRESE_COFFSET:DECF COFFSETBTFSC STATUS,ZCALL SETCOFFSETRETURNBLACK:BANKSEL PORTACLRF PORTACALL DELAYRETURN;;;;;;;;;;函数区到此为止;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; MAINLOOPMOVF CNUM,WMOVWF NUM;数码管MOVF PA,WMOVWF OFFSET;图案CALL SELECT;;;;;;;;;;;;;;;;;;;;;;;;;数码管CALL WRITE;;;;;;;;;;;;;;;;;;;;;;;;;;图案DECF PABTFSC STATUS,Z;;;;;;;;;;;;;;;;;;;;;;CALL SETPA;;;;;;;;;;;;;;;;;;;;;;;;;;INCF CNUMDECF CNTBTFSC STATUS,ZCALL SETORIGINGOTO LOOPEND ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;加开机画面SEEd#INCLUDE p16f886.inc__config _CONFIG1, _INTOSCIO & _WDT_OFF CONTEXT_SAVING UDATA_SHRW_TMP RES 1S_TMP RES 1OFFSET RES 1COFFSET RES 1NUM RES 1CNUM RES 1PA RES 1CNT RES 1LP0 RES 1LP1 RES 1ISBLACK RES 1RESET CODE 0x0PAGESEL INITGOTO INITISR CODE0x04;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;SWAPF STATUS,WMOVWF S_TMP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;PB_INTBTFSC INTCON,RBIFCALL PORTB_INTTM0_INTBTFSC INTCON,T0IFCALL TMR0_INT;;;;;;;;;;;;;;;;;;;;;COMF ISBLACKBTFSS ISBLACK,0CALL DECRESE_COFFSETBTFSC ISBLACK,0CALL BLACKBANKSEL INTCONBCF INTCON,2 ;;;;;;;;;;;;;清除TMR0中断标志位BANKSEL TMR0MOVLW B'01111111'MOVWF TMR0 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;SWAPF S_TMP,WSWAPF W_TMP,FSWAPF W_TMP,W RETFIE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CODEINITBANKSEL TMR0MOVLW B'01111111'MOVWF TMR0BANKSEL OPTION_REGMOVLW B'00000111'MOVWF OPTION_REG ;;;;;;;;;;;;;;;;;;;;;TMR0设置为256分频BANKSEL INTCONBSF INTCON,GIEBSF INTCON,T0IE ;;;;;;;;;;;;;;;;;;;;;总中断使能,TMR0中断使能BSF INTCON,RBIE;;;;;;;;;;;;;;;;;;;;;;PORTB电平变化中断使能BANKSEL TRISCCLRF TRISCBANKSEL PORTC MOVLW B'11111111' MOVWF PORTC BANKSEL TRISA CLRF TRISA BANKSEL PORTA CLRF PORTA BANKSEL ANSEL CLRF ANSEL BANKSEL TRISB MOVLW B'00100000' MOVWF TRISB BANKSEL IOCB MOVLW B'00100000' MOVWF IOCB BANKSEL PORTB CLRF PORTB BANKSEL WPUB MOVLW B'00100000' MOVWF WPUB BANKSEL OSCCON MOVLW B'00010011'。

pic单片机汇编语言程序设计实例

pic单片机汇编语言程序设计实例

PIC单片机汇编语言程序设计实例介绍在计算机科学领域中,汇编语言是一种低级语言,用于编写机器指令的文本形式。

汇编语言程序设计是一门重要的技能,特别是在嵌入式系统开发中。

PIC (Peripheral Interface Controller)单片机是一种常见的微控制器,广泛应用于各种电子设备中。

本文将介绍PIC单片机汇编语言程序设计的实例,旨在帮助读者更好地理解和应用汇编语言编程。

PIC单片机简介PIC单片机是由美国微芯科技公司(Microchip Technology Inc.)设计和生产的一种微控制器。

它具有高性能、低功耗和丰富的外设接口,适用于各种应用领域,如家电、汽车电子、医疗设备等。

PIC单片机的指令集是基于汇编语言的,因此掌握汇编语言编程对于理解和应用PIC单片机至关重要。

PIC单片机汇编语言基础在开始编写PIC单片机汇编语言程序之前,我们首先需要了解一些基本概念和语法。

以下是一些常用的指令和语法:1. 数据寄存器PIC单片机有多个数据寄存器,用于存储数据和中间结果。

例如,W寄存器是一个通用寄存器,用于存储临时数据。

另外,还有一些特定功能的寄存器,如PORTA寄存器用于控制输入输出。

2. 指令集PIC单片机的指令集包含了各种操作指令,如算术运算、逻辑运算、位操作等。

每个指令都有特定的操作码和操作数,用于执行相应的操作。

3. 标志寄存器PIC单片机的标志寄存器用于存储一些状态信息,如进位标志、零标志等。

这些标志位可以用于条件分支和循环控制。

4. 中断PIC单片机支持中断机制,可以在特定条件下中断当前程序的执行,执行中断服务程序。

中断可以提高系统的响应速度和实时性。

PIC单片机汇编语言程序设计实例下面将通过几个实例来演示PIC单片机汇编语言程序的设计和实现。

实例1:LED闪烁步骤:1.初始化端口为输出模式。

2.设置LED引脚为高电平,使LED熄灭。

3.延时一段时间。

4.设置LED引脚为低电平,使LED亮起。

PIC单片机数码管程序

PIC单片机数码管程序

PIC单片机数码管程序#INCLUDE&quot;P16F877.inc&quot;ORG 000HGOTO A1ORG 0CHA1 MOVLW 1;位1显示数MOVWF 50H;MOVLW 2;位2显示数MOVWF 51H;MOVLW 3;位3显示数MOVWF 52H;MOVLW 4;位4显示数MOVWF 53H;MOVLW 4;显示位数MOVWF 40H;MOVLW B'00000001';位码MOVWF 41H;MOVLW 50H;MOVWF FSR ;间接寻址A2 BSF STATUS,RP0;体1BCF STATUS,RP1;MOVLW 0;MOVWF TRISB;RB口设为输出口MOVWF TRISD;RD口设为输出口BCF STATUS,RP0;体0BCF STATUS,RP1;MOVLW 0FFH;MOVWF PORTB;RB口输出高电平MOVLW 0MOVWF PORTD;RD口输出低电平起清屏作用MOVFW INDF;间接寻址显示数据CALL Q1;查数据表MOVWF PORTB;显示断码输出到RB口INCF FSR,1;间接寻址地址加1MOVFW 41H ;位码MOVWF PORTD;位码输出到RD口RLF 41H,0;处理CRLF 41H,1;左移位码CALL M001;延时DECFSZ 40H,1;判断是否显示完4位GOTO A2;否则继续显示GOTO A1;是返回;********************************************* ; 延时子程序;********************************************* M001MOVLW 2MOVWF 30HM002 MOVLW 250MOVWF 31HDECFSZ 31H,1GOTO $-1DECFSZ 30H,1GOTO M002RETURN;******************************************** ; 数据表;******************************************** Q1 ADDWF PCL,1RETLW 00C0H ;0RETLW 00F9H ;1RETLW 00A4H ;2RETLW 00B0H ;3RETLW 0099H ;4 RETLW 0092H ;5 RETLW 0082H ;6 RETLW 00F8H ;7 RETLW 0080H ;8 RETLW 0090H ;9 RETLW 0088H ;A RETLW 0083H ;B RETLW 00C6H ;C RETLW 00A1H ;D RETLW 0086H ;E RETLW 008EH ;F END。

PIC单片机C语言程序设计实例之C语言if语句与LED数码管显示

PIC单片机C语言程序设计实例之C语言if语句与LED数码管显示

PIC单片机C语言程序设计实例之C语言if语句与LED数码管显示if 语句也称为条件语句,是C 语言中转移语句之一。

在设计C 语言程序时,常常要根据某些条件以决定程序运行的流向,这时就需要if 语句来实现。

任何if语句(包括else 部分),都可当作一条C 语句使用。

格式:if(表达式)语句1else 语句2其中else 为选择项;即可有、可无的。

所以条件语句,可分为两种;if 语句和if—else 语句。

式中的表达式为关系表达式或逻辑表达式以及由条件运算符(有关运算符将在后文介绍)构成的一种表达式。

功能:先计算if 中的条件表达式,其值为真(满足条件时),执行语句1 ;其值为假(不满足条件时),若有else,就执行语句2。

If 语句常用有几种形式:⑴if(条件表达式)语句该形式无选择项else。

例1 :if(a>b)c=b ;∥满足条件a>b,将b 赋值给c例2 :i f (t t r = = 9 9 9 9 )ttr=0 ;∥满足运算条件ttr==9999 ;将0 赋值给ttr⑵if(条件表达式)语句1else 语句2例1 :if(a>b)c=b ;∥满足a>b,将b 赋值给celse c=a ;∥不满足a>b 时,将a 赋值给c例2:若比较两个整量a、b,要求其大者送x,即可用if 语句实现;⑶表达式赋值(简化式)的条件语句。

读者在阅读一些书籍上的单片机 C 语言程序时,会遇到条件语句的一种简化形式,其格式如下:表达式1 ?表达式2 ;表达式3如以上if 语句的形式⑵中的例2,即可简化为条件表达式的赋值语句;If 语句尚有一些其他格式,这里暂略去。

3.LED数码管显示的硬件电路在电子技术中,数码管显示(0~9)是最常见的显示技术。

数码管显示时,可用LCD(液晶),也可用LED 数码管显示0~9 的数。

这里首先介绍用PIC16F84A控制的数码管LED 的显示电路,如图3 所示。

单片机数码管秒表程序

单片机数码管秒表程序

单片机数码管秒表程序
数码管秒表是一种常见的计时工具,它利用单片机控制数码管的显示来实现计时功能。

下面我将为大家介绍一种基于单片机的数码管秒表程序。

程序的实现思路如下:首先,我们需要使用单片机的定时器来实现时间的计数。

通过设置定时器的计数周期和中断处理函数,我们可以在每个固定的时间间隔内进行一次计数。

然后,我们需要将计数的结果通过数码管进行显示。

为了方便显示,我们可以将计数结果分为小时、分钟和秒三个部分,分别显示在数码管的不同位上。

程序的具体实现步骤如下:
1. 初始化单片机的定时器,并设置计数周期为1秒。

2. 设置一个全局变量来保存计数的结果,初始值为0。

3. 在定时器的中断处理函数中,每次中断时将计数结果加1。

4. 在主函数中,设置一个循环来不断检测计数结果的变化,并将其转换为时、分、秒的形式。

5. 将转换后的时、分、秒分别显示在数码管的不同位上,通过控制数码管的引脚来实现。

通过以上步骤,我们就可以实现一个简单的数码管秒表程序。

当程序运行时,数码管会不断地显示计时结果,从0开始递增,以秒为单位。

当需要停止计时时,可以通过外部按键等方式来暂停或重置计数结果。

这种数码管秒表程序可以广泛应用于各种计时场景,比如运动比赛、实验计时等。

它的实现简单、成本低廉,并且可以精确地显示时间,非常实用。

希望通过以上介绍,大家对基于单片机的数码管秒表程序有了更深入的了解。

希望这个简单的程序能够帮助大家更好地实现计时功能,提高工作和学习的效率。

谢谢大家!。

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