⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ht1621.txt

📁 ht1621LCD显示驱动程序!汇编语言!
💻 TXT
📖 第 1 页 / 共 2 页
字号:
;刷新显示子程序
;名称:BrushLcd
;描述:把显示缓冲区DISBUFFER共16个单元的内容送到1621中
BrushLcd:
PUSH LCDBYTECNT
PUSH LCDADR
MOV LCDBYTECNT,#16 ;发送16个数据
MOV LCDADR,#DISBUFFER ;指向显示缓冲区
DISPLAY0:
LCALL SEND1621DATA ;调用发送数据子程序,从SEG0段开始
POP LCDADR
POP LCDBYTECNT
RET 
;函数名:DISDPTR
;功能: 把DPTR指向的程序存贮器的16个字节内容直接送到1621的显示缓冲区内
;参数: DPTR-缓冲区指针
;返回值:无
DISDPTR:
PUSH 07H
PUSH 00H
PUSH 06H
PUSH ACC
MOV R7,#10H ;设置各指针及变量初值
MOV R0,#DISBUFFER ;先把数据读入显示缓冲区
MOV R6,#00
ICERRORCON:
MOV A,R6
MOVC A,@A+DPTR ;读取程序区的数据
MOV @R0,A ;放入显示缓冲区
INC R0
INC R6
DJNZ R7,ICERRORCON 
ACALL BrushLcd ;输出显示
POP ACC
POP 06H
POP 00H
POP 07H
RET
;*******************************************************************
; 子程序
;用启尽量不要单独的调用这此子程序
;***********************************************
;************************************************
;发送数据程序
;名称: Send1621Data
;描述: 向HT1621B发送BYTECNT个数据(从SEG0开始发送)
; 数据在发送缓冲区中,缓冲区指针lcdadr.
;-----------------------------------------------
Send1621Data:
PUSH ACC
PUSH LCDBITCNT
PUSH LCDBYTECNT
PUSH LCDADR
ACALL INTI
MOV LCDBITCNT,#01H ;发送写1621RAM命令
MOV A,#80H ;发送1位数据
ACALL SENDB0
MOV A,#40H ;1621RAM地址设置为00H
ACALL SEND1621BYTE 
MOV R1,LCDADR
SENDNEXT1:
MOV A,@R1 ;读取数据
ACALL SEND1621BYTE ;发送数据
INC R1
DJNZ LCDBYTECNT,SENDNEXT1
SETB WRITE
SETB CS
SETB SDATA
POP LCDADR
POP LCDBYTECNT
POP LCDBITCNT
POP ACC
RET
;************************************************
;1621初始化子程序
;即起动1621
;-----------------------------------------------
INTI:
CLR CS
SETB WRITE
NOP
CLR WRITE
NOP
RET

;******************************************************************
;发送字节数据子程序
;名称: Send1621Byte
;描述: 向HT1621B发送一个字节数据,数据在A中
;-----------------------------------------------
Send1621Byte:
PUSH LCDBITCNT
MOV lcdbitcnt,#08h ;发送8位数据位
ACALL SENDB0 ;调用发送数据位子程序
POP LCDBITCNT
RET
;******************************************************************
;发送位数据子程序
;名称: sendb0
;描述: 向HT1621B发送N位数据,数据在A中,N在LCDBITCNT中,从高位开始发送
;-----------------------------------------------
SENDB0:
PUSH ACC
PUSH PSW
PUSH LCDBITCNT
SENDB01:
RLC A
MOV SDATA,C ;先发送高位数据
SETB WRITE ;产生WR信号
NOP
NOP
CLR WRITE
NOP
NOP
DJNZ LCDBITCNT,SENDB01 ;未发送完,继续
POP LCDBITCNT
POP PSW
POP ACC
RET
;========================================================
;表格区
;ZY886C型LCD数字显示表(0-F),供用户转换使用。(以上程序不用此表)
LCDData:
DB 0FCH,60H,0DAH,0F2H,066H,0B6H,0BEH,0E0H,0FEH,0F6H,0EEH,3EH,1AH,7AH,9EH,8EH
;===============================================================
;
;以上程序是HT1621的通用程序,对不同的LCD只是其字模不一样而以。










ht1621 c源代码

/********************************************************************************
*program name:lcdht1621.c
*function: TEST TO HT1621(drive)
*Design: Zhengyingjun
*Date:2005-06-28
*********************************************************************************/
#include<msp430x14x.h>
#include<intrinsics.h>

#define uchar unsigned char 
#define uint unsigned int

/*********************************************************
* 接口定义:DATA<--->P2.5; CS<--->P2.6; WR<--->P2.7 *
**********************************************************/


#define BIAS 0X52 /*定义1 3 偏压4 背极*/
#define XTAL32 0X28 /*使用外部晶振*/
#define RC256 0X30 /*使用内部256KRC 振荡器*/
#define SYSEN 0X02 /*打开振荡发生器*/
#define LCDON 0X06 /*打开LCD*/
#define SYSDIS 0X00 /*关闭振荡发生器*/
#define LCDOFF 0X04 /*显示关闭*/
#define TONE4 0X80 /*设置BZ 输出频率为4K*/
#define TONEON 0X12 /*打开BZ 音频输出*/
#define TONEOFF 0X10 /*关闭BZ 音频输出*/
#define CLRWDT 0X1c /*清零WDT*/
#define F1 0X40 /*WDT设置为4 秒溢出*/
#define IRQEN 0X10 /*IRQ 输出禁止*/
#define IRQDIS 0X00 /*IRQ 输出允许*/
#define WDTEN 0X0e /*打开WDT*/
#define WDTDIS 0X0a /*关闭WDT*/
#define TIMERDIS 0X08 /*关闭时基输出*/
uchar table[32]={ 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67,0xbf,0x86,0xdb,0xcf,0xe6,0xed,
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67,0xbf,0x86,0xdb,0xcf,0xe6,0xed };
void Start_spi(void);
void Delay(void);
void Delay1s(void);
void SENDCOMA(uchar com);
void SENDCOMB(uchar adr);
void SENDCOMC(uchar com);
void disp(uchar dat);
void DISP_ALL(uchar data);
void SendByte(uchar dat);
void SendBit(uchar dat,uchar bitcnt);


/**********************************************************************
延时函数
***********************************************************************/
void Delay(void)
{
uchar i;
for(i=0;i<10;i++); /*用于调整CLK 脉冲宽度*/
}

/**********************************************************************
长延时函数
***********************************************************************/
void Delay1s(void)
{
uchar i;
uint j;

for(i=0;i<100;i++)
for(j=0;j<1300;j++);
}

/*********************************************************************
发送命令函数A类
发送HT1621 命令时要先发送ID 值,及命令字用于设置HT1621.
*********************************************************************/
void SENDCOMA(uchar com)
{
Start_spi();
SendBit(0X80,4); /*发送设置命令ID=100 0*/
SendByte(com); /*发送命令字*/
}

/*********************************************************************
发送命令函数B 类
发送HT1621 命令时要先发送ID 值,后发送要写入数据起始地址,
用于对RAM 写操作(调用此函数后即可发送数据) adr 是高5 位有效
*********************************************************************/
void SENDCOMB(uchar adr)
{
Start_spi();
SendBit(0XA0,4); /*发送写显示RAM 命令ID=101 0*/
SendBit(adr,5); /*指定写入地址*/
}


/*********************************************************************
发送命令函数(C 类)
发送HT1621 命令时要先发送ID 值.然后发送C 类的命令字
*********************************************************************/
void SENDCOMC(uchar com)
{
Start_spi();
SendBit(0X90,4); /*发送命令ID=100 1*/
SendByte(com); /*发送命令字*/
}

/**********************************************************************
向显示缓冲区填充,以最简便的形式显示数据
**********************************************************************/
void disp(uchar dat)
{
uchar i;
SENDCOMB(0x00); /*把数据指针指回0 接着写入数据*/
for(i=0;i<16;i++) /*写入16 字节数据*/
{
SendByte(dat); /*写入数据*/
}
}

/******************************************************
全显示
******************************************************/
void DISP_ALL(uchar data)
{
SENDCOMA(BIAS); /*设置偏压,背极数*/
SENDCOMA(RC256); /*设为内晶振256K*/
SENDCOMA(SYSEN); /*启动振荡器*/

SENDCOMA(LCDON); /*显示使能*/
SENDCOMA(TIMERDIS); /*禁止时基输出*/
disp(data); /*输出全显数据*/
}


/**********************************************************************
主函数
**********************************************************************/
void main()
{
uchar i,temp;
WDTCTL=WDTPW+WDTHOLD;
P2DIR|=BIT5+BIT6+BIT7;
while(1)
{
for(i=0;i<1;i++)
{
temp=0x88;//table[i];
DISP_ALL(temp); /*全显示测量*/
// Delay1s(); 
}
}
}


/************************************************************************
名称: 发送数据位
************************************************************************/


void SendBit(uchar dat,uchar bitcnt)
{
uchar i;
for(i=0;i<bitcnt;i++)
{
if(( dat & 0X80 ) == 0)
P2OUT&=~BIT5;//SDA_PORT = 0;
else
P2OUT|=BIT5;//SDA_PORT = 1; /*发送数据由高位到低位传送*/
Delay();
P2OUT|=BIT7;//CLK_PORT = 1; /*置时钟线为高通知被控器开始接收数位*/
Delay();
P2OUT&=~BIT7;//CLK_PORT = 0; /*钳住总线准备下一个数据位*/
dat=dat<<1; /*发送数据左移一位*/
}
}

/**********************************************************************
起动ht1621
**********************************************************************/
void Start_spi(void)
{
P1OUT|=BIT6;//CS_PORT=1;
P1OUT|=BIT7;//CLK_PORT=1;
P1OUT|=BIT5;//SDA_PORT=1;
Delay();
P1OUT&=~BIT6;//CS_PORT=0; 
P1OUT&=~BIT6;//CS_PORT=0; 
P1OUT&=~BIT7;//CLK_PORT=0; 
P1OUT&=~BIT7;//CLK_PORT=0; 
}

/************************************************************************
发送字节函数,向ht1621 发送字节数据数据单元dat
************************************************************************/
void SendByte(uchar dat)
{
SendBit(dat,8); /*发送字节*/
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -