当前位置:首页 > 单片机 > 单片机
[导读] listp=16f876A;编驿参数#include;预定义头文件errorlevel0,-302;错误输出级别;配置字__CONFIG_XT_OSC&_CP_OFF&_WDT_OFF&_BODEN_OFF&_PWRTE_ON&_WRT_OFF&_LVP_OFF&_CPD_OFF;***************************

listp=16f876A;编驿参数
#include;预定义头文件
errorlevel0,-302;错误输出级别


;配置字
__CONFIG_XT_OSC&_CP_OFF&_WDT_OFF&_BODEN_OFF&_PWRTE_ON&_WRT_OFF&_LVP_OFF&_CPD_OFF

;******************************************************************************
;**
;*全局公共变量定义*
;**
;******************************************************************************
cbLOCk0x70
w_temp:1;中断时的现场保护W寄存器暂存单元
status_temp:1;中断时的现场保护STATUS寄存器暂存单元
pclath_temp:1;中断时的现场保护PCLATH寄存器暂存单元

AX:1;通用寄存器AX
BX:1;通用寄存器BX
CX:1;通用寄存器CX

delay_cnt:2;延时专用计数单元,2个字节

endc

;******************************************************************************
;**
;*在BANK1中定义的变量*
;**
;******************************************************************************
cblock0x20
base_ptr:2;显示内容基准地址指针
CTRl_byte:1;内容显示控制字
;bit<0>=红色
;bit<1>=绿色
;bit<2:4>=显示方式,0:静止,居左
;1:向左滚动,循环显示
;bit<5:7>=保留
row_bytes:1;每一行的字节总数

cur_ptr:2;当前取数据指针
row_cnt:1;行显示计数器
col_cnt:1;列显示计数器
col_offset:1;当前显示列偏移(与curr_ptr一起决定列的起点)

endc

;******************************************************************************
;**
;*单片机复位执行入口*
;**
;******************************************************************************
org0x000;

nop;预留ICD调试用
gotoMAIN;转入主执行程序入口

;******************************************************************************
;**
;* 单片机 中断执行入口*
;**
;******************************************************************************
org0x004;

MOV wfw_temp;保护现场
MOV fSTATUS,w
MOV wfstatus_temp
MOV fPCLATH,w
MOV wfpclath_temp

;此处编写自已的中断处理程序

MOV fpclath_temp,w;恢复现场
MOV wfPCLATH
MOV fstatus_temp,w
MOV wfSTATUS
swapfw_temp,f
swapfw_temp,w
retfie

;******************************************************************************
;**
;*主程序执行入口*
;**
;******************************************************************************
MAIN:
callINIT_PORT;初始化PORTA,PORTB,PORTC口寄存器
MAIN_1:
bankselbase_ptr
MOV lwlow(Hz_TABLE_1);置显示数据基准指针
MOV wfbase_ptr
MOV lwhigh(HZ_TABLE_1)
MOV wfbase_ptr+1
MOV lw0x03;置显示控制字,红绿色,静止,居左显示
MOV wfctrl_byte
MOV lw0x08;置总显示列宽度,4个汉字,8个字节
MOV wfrow_bytes
MAIN_2:
MOV lw0x00;置显示列偏移值为0
MOV wfcol_offset
MOV lw0x00;置起启显示行从Y0..Y15循环
MOV wfrow_cnt
MOV fbase_ptr,w
MOV wfcur_ptr
MOV fbase_ptr+1,w
MOV wfcur_ptr+1
MAIN_3:
MOV fwrow_bytes
MOV wfcol_cnt
MAIN_4:
callGET_DATA;获得一个字节数据

MOV wfAX
MOV fcol_offset,w
MOV wfBX
MOV lw0x08
MOV wfCX
callSHIFT_BYTE

decfszcol_cnt,f
gotoMAIN_4

callLATCH_REGISTER

bankselPORTB
MOV frow_cnt,w
MOV wfPORTB

callSLEEP_MS

incfrow_cnt,f
btfssrow_cnt,4
gotoMAIN_3
MAIN_5:
gotoMAIN_2
;******************************************************************************
;**
;*初始化PORT寄存器*
;**
;******************************************************************************
INIT_PORT:
BANKSELTRISB
clrfTRISB;PORTB寄存器的bit<0:3>用于行计数输出
BANKSELPORTB
MOV lw0x10;PORTB的BIT4=1,关闭所有LED显示
MOV wfPORTB

BANKSELADCON1;设置PORTA寄存器为数字I/O
MOV lw0x10
MOV wfADCON1
BANKSELTRISA;设置PORTA为数字输出寄存器
clrfTRISA;bit<0>用于红色移位数据输出,bit<1>用于绿色.bit<2>为移位脉冲,bit<3>为锁存脉冲

return;返回

;******************************************************************************
;**
;*将一个字节移入列寄存器*
;**
;*入口参数:*
;*AX中为移位数据*
;*BX中为起始位0=D7,1=D6,...*
;*CX中为移动计数*
;*出口参数:*
;*无*
;**
;******************************************************************************
SHIFT_BYTE:
MOV fBX,f;是从D7开如写入列寄存器?
skpnz
gotoSHIFT_BYTE_2
SHIFT_BYTE_1:
rlfAX,f;从AX中移去多余的数据位
decfszBX,f
gotoSHIFT_BYTE_1

SHIFT_BYTE_2:
BANKSELPORTA;选择端口A的所在页面
SHIFT_BYTE_3:
MOV lw0x03;预置,红、绿都为亮
rlfAX,f
skpc
MOV lw0x00;红、绿都为灭
andwfctrl_byte,w;确定显示的颜色
andlw0x03;屏蔽多余的位
MOV wfPORTA;数据输出到移位总线上,PORTA的BIT<0:1>

nop
nop
nop
iorlw0x04;在PORTA的BIT<2>上生成一个上升沿移位脉冲,将数据移入列寄存器
MOV wfPORTA;置PORTA的BIT<2>为高电平
nop
nop
nop
andlw0x03
MOV wfPORTA;置PORTA的BIT<2>为低电平
nop;完成移位脉冲输出
nop
nop

decfszCX,f;是否输出了所有的数据位
gotoSHIFT_BYTE_2;继续下一位输出

return;完成一个字节的移位输出,返回

;******************************************************************************
;**
;*将列寄存器的内容输出显示*
;**
;*入口参数:*
;*无*
;*出口参数:*
;*无*
;**
;******************************************************************************
LATCH_REGISTER:
BANKSELPORTA;选择端口A的所在页面

MOV lw0x00;在PORTA的BIT<3>上生成一个↑上升沿锁存脉冲,将移位数据打入锁存器
MOV wfPORTA
nop
nop
nop
MOV lw0x08;置PORTA的BIT<3>为高电平
MOV wfPORTA
nop
nop
nop
MOV lw0x00;置PORTA的BIT<3>为低电平
MOV wfPORTA
nop
nop
nop

return;完成脉冲输出,返回

;******************************************************************************
;**
;*廷时子程序*
;**
;*入口参数:*
;*无*
;*出口参数:*
;*无*
;**
;******************************************************************************
SLEEP_MS
MOV lw.2
MOV wfdelay_cnt+1
SLEEP_MS_1
MOV lw.199
MOV wfdelay_cnt
SLEEP_MS_2
nop
decfszdelay_cnt,f
gotoSLEEP_MS_2
decfszdelay_cnt+1,f
gotoSLEEP_MS_1

return

DELAY_NOP:
nop
nop
nop
nop
nop
return

;******************************************************************************
;**
;*查表获得数据*
;**
;*入口参数:*
;*cur_ptr中为查表指针*
;*出口参数:*
;*W中为值*
;*说明:*
;*本程序先将指针加一,再取数据*
;**
;******************************************************************************
GET_DATA:
incfcur_ptr,f
skpnz
incfcur_ptr+1,f
MOV fcur_ptr+1,w
MOV wfPCLATH
MOV fcur_ptr,w
MOV wfPCL

;******************************************************************************
;**
;*显示数据定义*
;**
;******************************************************************************
HZ_TABLE_1:dt0x00;占位节字
dt0x00,0x80,0x00,0x00,0x01,0x00,0x10,0x80
dt0x00,0x80,0x41,0x84,0x21,0x08,0x10,0x80
dt0xFC,0x80,0x26,0x7E,0x11,0x0C,0x51,0x04
dt0x04,0xFC,0x14,0x44,0x09,0x10,0x51,0xFE
dt0x45,0x04,0x04,0x44,0x09,0x20,0x52,0x00
dt0x46,0x48,0x04,0x44,0x01,0x04,0x54,0x80
dt0x28,0x40,0xF4,0x44,0xFF,0xFE,0x58,0x60
dt0x28,0x40,0x14,0xC4,0x04,0x40,0x50,0x24
dt0x10,0x40,0x15,0x44,0x04,0x40,0x57,0xFE
dt0x28,0x40,0x16,0x54,0x04,0x40,0x54,0x44
dt0x24,0xA0,0x14,0x48,0x04,0x40,0x54,0x44
dt0x44,0xA0,0x10,0x40,0x08,0x40,0x54,0x44
dt0x81,0x10,0x10,0x40,0x08,0x42,0x54,0x44
dt0x01,0x08,0x28,0x40,0x10,0x42,0x14,0x44
dt0x02,0x0E,0x47,0xFE,0x20,0x3E,0x17,0xFC
dt0x0C,0x04,0x00,0x00,0x40,0x00,0x14,0x04




;******************************************************************************
;**
;*源程序结束*
;**
;******************************************************************************
END

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭