STC单片机驱动段码式液晶显示屏程序STC12C5612 HT1621B
HT1621驱动段码液晶屏
第十七节:液晶屏第三大类定律—任意位置显示一个点(HT1621驱动段码液晶屏)(1)? ?? ???开场白:段码液晶屏往往应用在出货量比较大的家用消费类电子,比如空调遥控器,小时候带的电子手表等,都是段码屏。
段码屏是非标屏,都是客户定做的,第一次开模费大概一两千元,厂家一般都会有起订量的要求,除此之外,它的单位成本相对要比点阵屏要便宜,而且我个人认为显示的效果要比点阵屏漂亮。
段码屏的驱动程序跟数码管的静态驱动程序一样,只要我们弄懂了怎样显示一个基本单位,根据此基本单位编(2)功能需求:? ?? ?? ?? ? 在COM和SEG组成的4X32表格中,显示第二行的第3和第4两个点。
(3)? ?? ???硬件原理:用单片机的3个IO口分别跟HT1621的CS,WR,DATA连接。
(4)源码适合的单片机:STC11F04E,晶振为11.0592MHz。
(5)源代码讲解如下:#include "REG52.H"#include "absacc.h"#include "intrins.h"?#include "stdio.h"#define? ???BIAS? ?? ?? ?0X52? ?//此处千万小心,鸿哥在上个月的一个项目中就是在这里被卡了7天。
的最底层部分? ?void write_com(unsigned char cmdcode);??//写命令到LCDvoid init_lcd();??//--初始化LCD屏void seg_display(unsigned char col, unsigned char pag); //显示基本单位点? ?? ?? ?? ?? ?? ?void screen_clear ();??//清空屏幕的内容//补充说明:吴坚鸿程序风格是这样的,凡是输出IO后缀都是_dr,凡是输入的//IO后缀都//是_srsbit ht162x_data_dr=P3^1;sbit ht162x_cs_dr=P3^6;sbit ht162x_wr_dr=P3^0;}//发送一个字节中的N位到HT1621里,驱动程序的最底层部分void SendBitToHT1621(unsigned char nbit,unsigned char n)? ???unsigned char i;???for(i=0;i<n;i++)??{? ? ht162x_wr_dr=0;? ? if(nbit>=0x80)? ?? ?//判断最高位??}//------------------写命令到LCD,,驱动液晶程序的一部分------------------------------ void write_com(unsigned char cmdcode){??ht162x_cs_dr=0;? ?? ?? ?//选通HT1621??_nop_();??SendBitToHT1621(0x80,4);??SendBitToHT1621(cmdcode,8);??_nop_();? ?write_com(RC256);? ???//启动内部256KRC 振荡器? ?write_com(BIAS);? ?? ?// 1/3 bais . 4 duty? ?? ?write_com(LCDON);? ???//开启LCD}//显示基本单位点,本节的核心内容。
HT1621B驱动液晶LCD连接及程序
//HT1621控制位(液晶模块接口定义,根据自已的需要更改)
_Bool PB_ODR_ODR7 @PB_ODR:7;//CS
_Bool PB_ODR_ODR5 @PB_ODR:5;//WR
_Bool PB_ODR_ODR6 @PB_ODR:6;//DATA
#define CLS_HT_WR PB_ODR_ODR5 = 0 //拉彳氐
//0b10000000 0100关LCD偏压
#define LCDON 0X06
//0b10000000 0110打开LCD偏 压
#define XTAL 0x28
//0b10000010 1000外部接时钟
#define RC256 0X30
//0b10000011 0000内部时钟RC256K
DelayMS(20); //延时一段时间
Ht1621WrAllData();
}
void main()
{
uchar i=0x1d;
CLK_ICKR |= 0x01; //打开内部高速RC
〃CLK_CKDIVR = 0x1B;〃fcpu=2M fmaster=2/8=0.25M〃CLK_CKDIVR = 0x1a; //fcpu=2M fmaster=2/4=0.5M〃CLK_CKDIVR = 0x18; //fcpu=2M fmaster=2/1=2M // port_init();
//PD_CR2 = 0x0;
PE_DDR= 0x20;//PE5---output
PE_CR1= 0x20;
PE_CR2=0x00;
}
//
//函数名称:Ht1621Wr_Data()
STC12C5A60S2 1602驱动程序
功 能: 初始化MCU串口(带1位奇校验)
参 数: 无
返回值 : 无
********************************************************************/
void UART1_INIT(void)
函数名称: IRQ_INIT
功 能: 中断初始化
参 数: 无
返回值 : 无
********************************************************************/
void IRQ_INIT(void)
{
// EX0 = 1; //开外部中断0
函数名称: Delay_nop
功 能: 延迟指定CPU cycle
参 数: dwTime - 延迟的CPU周期数
返回值 : 无
********************************************************************/
void Delay_nop (unsigned int dwTime)
ES = 1; //开UART1中断
IE2 |= 0x01; //开UART2中断
// IE2 |= 0x02; //开SPI中断
EADC = 1; //开ADC中断
EA = 1; //开总中断
}
/********************************************************************
#define NONE_PARITY 0 //无校验位
HT1621B 通用程序集锦
/********************************************************************* *****************AT89C51单片机控制HT1621B驱动LCD********************* ***************** (全显示程序)******************************************************************************************/ #include <reg51.h>#include <intrins.h>#define BIAS 0X50 //1/2偏压,4背极//#define RC256 0X30 //系统时钟选择为片内RC振荡器#define RC256 0X38#define WDTDIS1 0X0A //禁止WDT溢出标志输出#define TIMERDIS 0X08 //时基输出禁能#define SYSEN 0X02 //打开系统时钟#define LCDON 0X06 //打开偏压发生器#define SYSDIS 0X00 //关闭系统时钟和偏压发生器#define _NOP() _nop_()sbit LED=P2^0;sbit CS=P2^7;sbit WRD=P2^6;sbit DATA=P2^5;#define uchar unsigned char#define uint unsigned intvoid SENDBYTE (uchar dat);void SENDBIT (uchar dat,uchar bitcnt);/***************************延时子函数******************************/void delay1s() //延时1S{uchar i;uint j;for(i=0;i<10;i++)for(j=0;j<1300;j++);}/**************************HT1621B初始化****************************/ void START_HT1621() //初始化HT1621{CS=1;WRD=1;DATA=1;//delay();_NOP();CS=0;CS=0;WRD=0;WRD=0;}/*************************发送命令子函数A***************************/ void SENDCOMA(uchar com) //发送命令A,ID=100+0{START_HT1621();SENDBIT(0X80,4);SENDBYTE(com);}/*************************发送命令子函数B***************************/ void SENDCOMB(uchar adr) //发送命令B,发送显示数据{START_HT1621(); //HT1621初始化SENDBIT(0XA0,4); //发送写数据ID:101+6位LCD之RAM地址第1位 SENDBIT(adr,5); //然后发送地址后5位}/*************************发送命令子函数C*************************** void SENDCOMC(uchar com) //发送命令C,ID=100+1{START_HT1621();SENDBIT(0X90,4);SENDBYTE(com);}/***********************按位发送数据子函数**************************/ void SENDBIT (uchar dat,uchar bitcnt) //按位发送数据{uchar i;for(i=0;i<bitcnt;i++){if((dat&0x80)==0X00) //从最高位发送DATA=0;elseDATA=1;//delay();_NOP();WRD=1; //在WRD的上升沿,数据写入HT1621B//delay();_NOP();WRD=0;dat=dat<<1;}}/*************************发送字节数据子函数************************/ void SENDBYTE (uchar dat) //发送字节数据{SENDBIT(dat,8);}/***************************LCD显示子函数***************************/ void display(uchar dat) //LCD显示{uchar i;SENDCOMB(0X00); //从RAM的0X00地址开始放入数据SENDBYTE(dat);SENDBYTE(dat);for (i=0;i<2;i++){SENDBYTE(dat); //从SEG0开始显示数据}}/*************************HT1621B初始化设置*************************/ void SETUP_HT1621() //HT1621偏压、背极、工作方式设置{SENDCOMA(BIAS);SENDCOMA(RC256);SENDCOMA(SYSEN);delay1s();SENDCOMA(LCDON);SENDCOMA(WDTDIS1);SENDCOMA(TIMERDIS);}/*******************************主函数******************************/ main() //主函数{LED=1;SETUP_HT1621();while(1){display(0XFF); //全显示}}各位大牛下午好,我用STC12C5204单片机控制1621驱动液晶程序调了几天都没进展,显示的不知道什么乱七八糟的东西,好像命令根本写不进去,COM0和com1是个1v不到的电平,com3为3点几V的电平,com4有时有波形刷我自己写的程序就是这个样子,SEGMENT一部分有波形,其余就是一个电平打电话咨询合泰技术,让我搞他们的范例,于是我修改了下,还是老样子大家帮我看看是什么问题,谢谢了下面的就是从合泰网上下的范例,我稍微修改了下,基本是原封不动的//STC12C5204AD单片机控制HT1621B驱动LCD#include <STC12C52XXAD.h>#include <stdio.h>#include <intrins.h>#define BIAS 0X52 //1/3偏压,4背极#define RC256K 0X30 //系统时钟选择为片内RC振荡器#define WDTDIS1 0X0A //禁止WDT溢出标志输出#define TIMERDIS 0X08 //时基输出禁止#define SYSEN 0X02 //打开系统时钟#define SYSDIS 0X00 //关闭系统时钟和偏压发生器#define LCDON 0X06 //打开LCD偏压发生器#define LCDOFF 0X04 //关闭LCD偏压发生器#define TONEON 0X12 //打开音频输出#define TONEOFF 0X10 //关闭音频输出#define CS P3_2#define WR P3_4#define DATA P3_5#define uchar unsigned char#define uint unsigned int/***************************延时子函数******************************/ void delay(uchar i) //j=12延时约4.3us {while(i--){uchar j=0;while(j<8)j++;}}void SendBit_1621(uchar dat ,uchar cnt) {uchar i;for(i =0; i <cnt; i ++){if((dat&0x80)==0)DATA=0;else DATA=1;WR=0;delay(2);WR=1;dat=dat<<1;}}void SendDataBit_1621(uchar dat,uchar cnt) {uchar i;for(i =0; i <cnt; i ++){if((dat&0x01)==0) DATA=0;else DATA=1;WR=0;delay(2);WR=1;dat=dat>>1;}}void SendCmd(uchar command){CS=0;_nop_();_nop_();SendBit_1621(0x80,4);SendBit_1621(command,8);CS=1;}void Write_1621(uchar addr,uchar dat){CS=0;_nop_();_nop_();SendBit_1621(0xa0,3);SendBit_1621(addr,6);SendDataBit_1621(dat,4);CS=1;}void WriteAll_1621(uchar addr,uchar *p,uchar cnt){uchar i;CS=0;_nop_();_nop_();SendBit_1621(0xa0,3);SendBit_1621(addr,6);for(i =0; i <cnt; i ++,p++){SendDataBit_1621(*p,8);}CS=1;}/*******************************主函数******************************/ main(){uchar a[10];a[0]=0xFF;a[1]=0xFF;a[2]=0xFF;a[3]=0xFF;a[4]=0xFF;a[5]=0xFF;a[6]=0xFF;a[7]=0xFF;a[8]=0xFF;a[9]=0xFF;a[10]=0xFF;a[11]=0xFF;a[12]=0xFF;a[13]=0xFF;a[14]=0xFF;a[15]=0xFF;SendCmd(BIAS);SendCmd(SYSEN);SendCmd(LCDON);// SendCmd(RC256K);WriteAll_1621(0,a,16);// SendCmd(LCDOFF);}LCD驱动程序适用于HT1621//=============================================================================#define Lcd_Delay _nop_();_nop_();_nop_();_nop_();_nop_();_nop_() void Lcd_Data(uchar Start,uchar cData)//将数据当中的字节与LCD上的进行同步// Start --要开始同页面地址,每个页面为4个有效位,总其为32X4字节// Length --要同步的页面数量{uchar i;LCD_CS=0;Lcd_Delay;Lcd_Delay;Lcd_Delay;//Send ID 101BLCD_CLK=0;Lcd_Delay;LCD_IO=1;Lcd_Delay;LCD_CLK=1;Lcd_Delay;LCD_CLK=0;Lcd_Delay;LCD_IO=0;Lcd_Delay;LCD_CLK=1;Lcd_Delay;LCD_CLK=0;Lcd_Delay;LCD_IO=1;Lcd_Delay;LCD_CLK=1;Lcd_Delay;//Send Address 6bitStart=Start*2;for(i=0;i<6;i++){if(Start&0x20) LCD_IO=1;else LCD_IO=0;Lcd_Delay;LCD_CLK=0;Lcd_Delay;Start=Start<<1;LCD_CLK=1;Lcd_Delay;}//Send data 8bitfor(i=0;i<8;i++){if(cData&0x01) LCD_IO=1;else LCD_IO=0;Lcd_Delay;LCD_CLK=0;Lcd_Delay;cData=cData>>1;LCD_CLK=1;Lcd_Delay;}LCD_CS=1;Lcd_Delay;}//=================================================================== ==========void Lcd_Command(uchar Command)//向指定的LCD当中写入一个命令//每个命令应以100三个位为起始,命令长度为9位,实际有效位为8位,因此在最后补一个0// LcdSelect--LCD的片选确定,取值为0,1,2// Command----要写入的8位命令{uchar i;LCD_CS=0;Lcd_Delay;Lcd_Delay;Lcd_Delay;//Send ID 100BLCD_CLK=0;Lcd_Delay;LCD_IO=1;Lcd_Delay;LCD_CLK=1;Lcd_Delay;LCD_CLK=0;Lcd_Delay;LCD_IO=0;Lcd_Delay;LCD_CLK=1;Lcd_Delay;LCD_CLK=0;Lcd_Delay;LCD_IO=0;Lcd_Delay;LCD_CLK=1;Lcd_Delay;for(i=0;i<8;i++){LCD_CLK=0;Lcd_Delay;if(Command&0x80) LCD_IO=1;else LCD_IO=0;Command=Command<<1;Lcd_Delay;LCD_CLK=1;Lcd_Delay;}///最后补一个0LCD_CLK=0;Lcd_Delay;LCD_IO=0;Lcd_Delay;LCD_CLK=1;Lcd_Delay;LCD_CS=1;Lcd_Delay;}//=================================================================== ==========void Lcd_Refresh(void) //重新对LCD进行刷屏{uchar i;for(i=0;i<LCD_BUFF_MAX;i++)Lcd_Data(i,lcd.buff[i]);}//=================================================================== ==========void Lcd_Cls(void) //清空LCD显示区{//功能: 清空LCD显示区//返值: 无//入口: cSelectIc LCD的片选,取值为0,1,2uchar i;for(i=0;i<LCD_BUFF_MAX;i++)lcd.buff[i]=0;Lcd_Refresh();}//=================================================================== ==========void Lcd_Init(void)//初始化LCD,二个屏都进行处理,同时进行清屏{LCD_CLK=1;Lcd_Delay;LCD_IO=1;Lcd_Delay;Lcd_Command(0x00); //控制器掉电(控制字)Lcd_Command(0x02); //控制器液晶关闭(控制字)Lcd_Command(0x18); //初始化LCD控制器Lcd_Command(0x01); //控制器上电(控制字)Lcd_Command(0x03); //控制器液晶显示(控制字)Lcd_Command(0x29); //控制器液晶模式1/3BAIS 1/4DUTY(控制字) Lcd_Cls();}。
HT1621液晶驱动芯片的51单片机程序
uchar code
Ht1621Tab[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00};
//delay us
void Delay(uchar us) //5,7,9
#define WDTDIS 0X0A //0b1000 0000 1010 禁止看门狗
//HT1621控制位(液晶模块接口定义,根据自已的需要更改)
sbit HT1621_DAT=P3^4; //HT1621数据引脚
sbit HT1621_CS=P3^2; //HT1621使能引脚
sbit HT1621_WR=P3^3; //HT1621时钟引脚
#define XTAL 0x28 //0b1000 0010 1000 外部接时钟
#define RC256 0X30 //0b1000 0011 0000 内部时钟
#define TONEON 0X12 //0b1000 0001 0010 打开声音输出
#define TONEOFF 0X10 //0b1000 0001 0000 关闭声音输出
HT1621液晶驱动芯片的51单片机程序
/********************************************************
功能描述: HT1621芯片测试程序
说 明:本测试程序能够测试HT1621的每一个字段,
依次点亮每一个字段
参数:
********************************************************/
HT1621B显示
uchar i;
for(i=0;i<bitcnt;i++)
{
if((dat&0x80)==0x00) //从最高位发送
DATA=0;
else
DATA=1;
_nop_();
wr=1; //在wr的上升沿,数据写入HT1621B
_nop_();
#include<stc12c5620ad.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit DATA=P1^0;
sbit wr =P1^1;
sbit rd =P1^2;
sbit cs =P1^3;
}
}
wr=0;
dat=dat<<1;
}
}
void sendbyte(uchar dat)
{
sendbit(dat,8);
}
void display(uchar dat) //LCD显示
{
uchar i;
sendcomb(0X00); //从RAM的0X00地址开始放入数据
void sendbit(uchar dat,uchar bitcnt);//按位发送数据
void sendbyte(uchar dat);
uint num;
void init_timer0()//定时器中断0初始化
{
TMOD=0x01;
TH0=(65536-1000)/256;
{
亲自调过的基于STC12C5A60S2的LCD1602显示屏程序
#include"STC12C5A60S2.h"
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
P0=dictate; //将数据送人p0口,写入指令或地址
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
E=0; //当E由高电平变成低电平时,液晶模块开始
}
/********
函数功能:指定字符显示的地址
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
E=0; //写指令时E为高脉冲,让E从0到1发生正跳变,所以应先置零
_nop_();
_nop_();
HT1621 LCD 驱动程序
HT1621 LCD 驱动程序用得最多的一款段码LCD驱动控制器HT1621的C51程序2009-04-17 10:30:59| 分类:单片机| 标签:|字号大中小订阅HT1621是台湾Holtek公司推出的段码LCD驱动控制芯片,带同步串行接口,最多可以控制128段驱动方式可选1/2、1/3、1/4 Duty 和1/2、1/3 Bias。
供电电压为2.4~5.2V,无需外部振荡电路。
简单易用。
以下是应用HT1621驱动的LCD模块串行模式的C51范例。
/*HT1621 for C51 */#include /* 8051 寄存器定义请修改为自己用的文件 */typedef unsigned char uchar;typedef unsigned int uint;sbit _CS =P2^0;sbit _WR =P2^1;sbit _DAT=P2^4;/*-----------------*/DELAY(int t) /**/{int i,j;for (i=0;ifor (j=0;j}/*-----------------*/WRITE_COM(uchar com) /*Write a command to LCD*/{uchar i,k;_CS = 0;k=0x80;for(i=0;i!=3;i++) /*Write CMD code:100*/{ if(k&0x80==0)_DAT=0;else_DAT= 1;_WR = 0;_WR = 1;k=k<<1;}k=com;for(i=0;i!=9;i++) /*Write CMD */{if(k&0x80==0) _DAT=0;else _DAT=1;_WR=0;_WR=1;k=k<<1;}_CS=1;}/*------------------*/WRITE_DAT(uchar addr,uchar dat) /*Write display data to LCD*/ {uchar i,k;_CS = 0;k=0xa0;for(i=0;i=!3;i++) /*Write CMD code:101*/{ if(k&0x80==0)_DAT=0;else_DAT= 1;_WR = 0;_WR = 1;k=k<<1;}k=addr<<2;for(i=0;i!=6;i++) /*Write RAM address: xxA5~A0*/{if(k&0x80==0) _DAT=0;else _DAT=1;_WR=0;_WR=1;k=k<<1;}k=dat<<4;for(i=0;i!=4;i++) /*Write Display data :xxxxC0~C3*/{if(k&0x80==0) _DAT=0;else _DAT=1;_WR=0;_WR=1;k=k<<1;}_CS=1;}DISP_NUM(uchar dat) /*Write a number*/{uchar i,j,addr;for (i=8;i!=28;i++){WRITE_DAT(i,dat<<4);WRITE_DAT(++i,dat);}}DIS(uchar dat){uchar i,j;for(i=0;i!=28;i++)WRITE_DAT(i,dat);}SETUP_LCD(void){DELAY(100);WRITE_COM(0x01); /*Enable system*/WRITE_COM(0x18); /*CLOCK SOURCE IS 256kRC ON CHIP*/ WRITE_COM(0x29); /*BIAS=1/3 DUTY=1/4*/WRITE_COM(0x03); /*Display on*/DIS(0x00); /*Clear LCD*/DELAY(20);}main(){uchar i,j,temp;DELAY(100);SETUP_LCD();DELAY(10);while(1){DELAY(200);DIS(0x0f);DELAY(200);DIS(0x00);temp=0xf8;for(i=0;i!=8;i++) /*Display ICONs*/{for(j=0;j=4;j++){WRITE_DAT(i,temp>>1);DELAY(20);}}WRITE_DAT(13,0x01);WRITE_DAT(19,0x01);WRITE_DAT(23,0x01);DELAY(200);DISP_NUM(0xbe); /*0*/DELAY(200);DISP_NUM(0x06); /*1*/DELAY(200);DISP_NUM(0x7c); /*2*/DELAY(200);DISP_NUM(0x5e); /*3*/DELAY(200);DISP_NUM(0xc6); /*4*/DELAY(200);DISP_NUM(0xda); /*5*/DELAY(200);DISP_NUM(0xfa); /*6*/DELAY(200);DISP_NUM(0x0e); /*7*/DELAY(200);DISP_NUM(0xfe); /*8*/DELAY(200);DISP_NUM(0xde); /*9*/ }}。
STC12C5A60S2的1602液晶屏显示【
#include<reg52.h>#define uint unsigned int#define uchar unsigned charsbit lcdrs=P2^7;sbit lcden=P2^6;uchar code stringtable[4]={'a','b','c','d'};void delay(uint z) //1ms延时子程序{uint x,y;for(x=z;x>0;x--){for(y=240;y>0;y--);}}void write_com(com) //1602lcd写命令子程序{lcdrs=0;delay(2);//为开启写入命令的时间>后面程序执行时间和延长时间之和才行。
P0=com;lcden=1;delay(2);lcden=0;}void write_data(date) //1602lcd写数据子程序{lcdrs=1;delay(2);P0=date;lcden=1;delay(2);lcden=0;}void lcd_init(){delay(15);//读取子程序所用大约时间write_com(0x38);write_com(0x0e);write_com(0x06);}void main() //先让内容显示出来,在让它整体移动。
{uchar number,k;lcd_init();//主程序中须先声明屏幕的显示设置就像未知数须先定义一样。
while(1){write_com(0x80+0x09);//要先写明显示的初始地址,才能写入数据。
上行显示for(number=0;number<4;number++){write_data(stringtable[number]);}delay(3000);write_com(0x01); //清屏delay(10);write_com(0x80+0x40+0x09);//要先写明显示的初始地址,才能写入数据。
HT1621B通用程序集锦
HT1621B通用程序集锦一、概述HT1621B是一款通用的程序集,用于控制液晶显示屏的驱动和显示功能。
本文将详细介绍HT1621B程序集的特性、使用方法以及相关应用示例。
二、特性1. 支持多种液晶显示屏:HT1621B程序集兼容多种液晶显示屏,包括字符型、图形型和点阵型等不同类型的显示屏。
2. 低功耗设计:HT1621B采用低功耗设计,能够有效降低功耗,延长电池寿命。
3. 高可靠性:HT1621B具有良好的抗干扰性和稳定性,能够在各种环境条件下正常工作。
4. 灵活的控制方式:HT1621B支持多种控制方式,包括串行方式和并行方式,方便用户根据实际需求选择合适的控制方式。
三、使用方法1. 引脚连接:将HT1621B的引脚与液晶显示屏的对应引脚连接,确保连接正确无误。
2. 供电:为HT1621B和液晶显示屏提供稳定的电源供应。
3. 程序编写:根据具体需求编写相应的程序代码,实现液晶显示屏的驱动和显示功能。
可以使用C语言或者其他高级语言进行编写。
4. 程序下载:将编写好的程序下载到目标设备中,确保程序能够正确运行。
四、应用示例以下是几个HT1621B程序集的应用示例:1. 温度显示:将HT1621B与温度传感器连接,通过编写程序,实时读取温度值并在液晶显示屏上显示出来。
用户可以清晰地了解当前环境的温度情况。
2. 时钟显示:将HT1621B与实时时钟模块连接,通过编写程序,实现时钟功能,并将当前时间显示在液晶显示屏上。
用户可以方便地查看当前时间。
3. 数字仪表盘:将HT1621B与模拟信号采集模块连接,通过编写程序,将采集到的模拟信号转换为数字,并在液晶显示屏上显示出来。
用户可以实时监测模拟信号的数值。
4. 游戏控制器:将HT1621B与游戏控制器按键连接,通过编写程序,实现游戏控制功能,并将游戏状态、得分等信息显示在液晶显示屏上。
用户可以享受游戏的乐趣。
五、总结HT1621B通用程序集是一款功能强大、易于使用的液晶显示屏驱动程序集,具有低功耗、高可靠性和灵活的控制方式等特点。
STC12C56
/////////////////////////////////
sfr DPL = 0x82; //数据指针低字节 Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0
//初始值=0000,0000 0 0 0 0 0 0 0 0
#ifndef __STC12C56_H__
#define __STC12C56_H__
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
sfr PCON = 0x87; //电源控制寄存器 Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0
//初始值=xxfine FOSCD1 0x00 //系统时钟为Fosc
/////////////////////////////////
sfr DPH = 0x83; //数据指针高字节 Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0
//初始值=0000,0000 0 0 0 0 0 0 0 0
/*------------------------------------------------*/
/* --- 宏晶科技 STCMCU ---------------------------*/
STC12C5A60S2单片机实现AD采样并液晶显示(数字燃油表)
数字燃油表模拟电路设计可实现以下功能:1、推动滑动变阻器,能使LCD从0显示到1002、档显示数字低于10时,灯亮,LCD显示“oil low”以下为C程序:#include<reg52.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned int#define Delay4us(){_nop_();_nop_();_nop_();_nop_();}sbit LED=P1^0;sbit LCD_RS=P2^6;sbit LCD_RW=P2^5;sbit LCD_EN=P2^7;sbit SCL=P2^0; //I2C时钟引脚sbit SDA=P2^1; //I2C数据输入输出引脚uchar Recv_Buffer[4]; //数据接收缓冲uint Voltage[]={'0','0','0','0'}; //数据分解为电压x.xxbit bdata IIC_ERROR; //I2C错误标志位uchar LCD_Line_1[]={" "};//延时void delay(int ms){uchar i;while(ms--) for(i=0;i<250;i++) Delay4us();}//LCD忙检测bit LCD_Busy_Check(){bit Result;LCD_RS=0;LCD_RW=1;LCD_EN=1;Delay4us();Result=(bit)(P0&0x80);LCD_EN=0;return Result;}//写指令void LCD_Write_Command(uchar cmd){while(LCD_Busy_Check());LCD_RS=0;LCD_RW=0;LCD_EN=0;_nop_();_nop_();P0=cmd;Delay4us();LCD_EN=1;Delay4us();LCD_EN=0;}// 写数据void LCD_Write_Data(uchar dat){while(LCD_Busy_Check());LCD_RS=1;LCD_RW=0;LCD_EN=0;P0=dat;Delay4us();LCD_EN=1;Delay4us();LCD_EN=0;}//初始化void LCD_Initialise(){LCD_Write_Command(0x38);delay(5);LCD_Write_Command(0x0c);delay(5);LCD_Write_Command(0x06);delay(5);LCD_Write_Command(0x01);delay(5);}//设置显示位置void LCD_Set_Position(uchar pos){LCD_Write_Command(pos|0x80);}//显示一行void LCD_Display_A_Line(uchar Line_Addr,uchar s[]){uchar i;LCD_Set_Position(Line_Addr);for(i=0;i<16;i++)LCD_Write_Data(s[i]);}// 将模数转换后得到的值分解存入缓存void Convert_To_Voltage(uchar val){uchar Tmp; //最大值为255,对应100L,255/100=2.55 val=val*0.393;Voltage[2]=val/100+'0'; //Tmp=val%100; //Voltage[1]=Tmp/10+'0';Tmp=Tmp%10;Voltage[0]=Tmp+'0';}//启动I2C总线void IIC_Start(){SDA=1;SCL=1;Delay4us();SDA=0;Delay4us();SCL=0;}//停止I2C总线void IIC_Stop(){SDA=0;SCL=1;Delay4us();SDA=1; Delay4us();SCL=0;}// 从机发送应答位void Slave_ACK(){SDA=0;SCL=1;Delay4us();SCL=0;SDA=1;}// 从机发送非应答位void Slave_NOACK(){SDA=1;SCL=1;Delay4us();SCL=0;SDA=0;//发送一字节void IIC_SendByte(uchar wd){uchar i;for(i=0;i<8;i++) //循环移入8位{SDA=(bit)(wd&0x80);_nop_();_nop_();SCL=1;Delay4us();SCL=0;wd<<=1;}Delay4us();SDA=1; //释放总线并准备读取应答SCL=1;Delay4us();IIC_ERROR=SDA; //IIC_ERROR=1表示无应答SCL=0;Delay4us();}//接收一字节uchar IIC_ReceiveByte(){uchar i,rd=0x00;for(i=0;i<8;i++){SCL=1;rd<<=1;rd|=SDA;Delay4us();SCL=0;Delay4us();}SCL=0;Delay4us();return rd;}//连续读入4路通道的A/D转换结果并保存到Recv_Buffervoid ADC_PCF8591(uchar CtrlByte){uchar i;IIC_Start();IIC_SendByte(0x90); // 发送写地址if(IIC_ERROR==1)return;// IIC_SendByte(CtrlByte); //发送控制字节//if(IIC_ERROR==1)return;IIC_Start(); //重新发送开始命令IIC_SendByte(0x91); // 发送读地址if(IIC_ERROR==1)return;IIC_ReceiveByte(); //空读一次,调整读顺序Slave_ACK(); //收到一字节后发送一个应答位for(i=0;i<4;i++)Recv_Buffer[i++]=IIC_ReceiveByte();Slave_ACK(); //收到一个字节后发送一个应答位}Slave_NOACK();IIC_Stop(); //收到一个字节后发送一个非应答位}// 向PCF8591发送1字节进行AD转换//主程序void main(){LED=0;LCD_Initialise();while(1){ADC_PCF8591(0x04);if(Recv_Buffer[0]<26){LCD_Display_A_Line(0x00, "Oil Low! ");LED=1;}else{Convert_To_Voltage(Recv_Buffer[0]);LCD_Line_1[2]=Voltage[2];LCD_Line_1[3]=Voltage[1];LCD_Line_1[4]=Voltage[0];LCD_Display_A_Line(0x00, LCD_Line_1);LED=0;}delay(50);}}如有侵权请联系告知删除,感谢你们的配合!。
STC12C系列单片机的各种程序集合
case 3:
P1M0=0x08;
P1M1=0x10;
ADC_CONTR&amt;=0xf8;
ADC_CONTR|=0x03;
#define uchar unsigned char
#define uint unsigned int
//--------------------------------------------------------------------
/*void set_timer0_1T()//设置T0为1T模式
ISP_TRIG=0xb9;
}
//--------------------------------------------------------------------
void EEPROM_ERASE(uint addr)//EEPROM扇区擦除
{
{
uchar temp;
uint data_temp;
data_temp=0;
ADC_DATA=0;
ADC_LOW2=0;
ADC_CONTR|=0x08;
re: temp=0x10;
//模块:STC12C5412AD_Driver.C
//功能:单片机增强功能驱动模块
//晶振:24.000MHz
//芯片: STC12C5412AD
//版本:V1.0.0
//设计:魏广寅
//日期:2007.4.10
#include "STC12C5412AD.h"
break;
case 5:
P1M0=0x20;
P1M1=0x00;
STC12C5A60S2单片机各个模块程序代码
//* // CLKOUT2 时钟初始化 // //*********************************// void CLKOUT_init(void){WAKE_CLKO = 0x04; //Bit2-BRTCLKO 允许 P1.0 配置为独立波特率发生器的时钟输 出//BRT 工作在 1T 模式下时的输出频率 = Sysclk/(256-BRT)/2 //BRT 工作在 12T 模式下时输出频率 = Sysclk/12/(256-BRT)/2AUXR = 0x14; //Bit4-BRTR 允许独立波特率发生器运行 //Bit2-BRTx12 BRT 工作在 1T 模式下BRT = 0xff; // 更改该寄存器的值可实现对输出的时钟频率进行分频 }#else /* 条件编译 CLKOUT0时钟输出 */ //*// CLKOUT0 时钟和 CLKOUT1初始化 //*********************************//void CLKOUT_init(void){WAKE_CLKO = 0x03; // 允许将 P3.4/T0 脚配置为定时器 0 的时钟输出 CLKOUT0文案大全实用标准文档 //* // // // // // // //// // // // // ////STC12C5A60S2 可编程时钟模块说明: STC12C5A60S2单片机有三路可编程时钟输出 CLKOUT0/T0/P3.4 CLKOUT1/T1/P3.5、 CLKOUT2/P1.0涉及寄存器: AUXR(辅助寄存器 ) 、WAKE_CLKO 时(钟与系统掉电唤醒控制寄存器 ) BRT( 独立波特率发生器定时器寄存器 ) 程序说明:本程序可选实现 P3.4 输出 CLKOUT0时钟、 P3.5 输出 CLKOUT1时钟 P1.0输出 CLKOUT2时钟////** **// #include <STC12C5A60S2.H> #include <intrins.h> //#define Port_BRT // // 如果想测试独立波特率发生器时钟输出请打开此句若想测试 CLKOUT1和 CLKOUT0请注释此句#ifdef Port_BRT /* 条件编译独立波特率发生器时钟输出 */*// *//////T0 //T0 //1T //12T工作在 1T 模式时的输出频率 = SYSclk/(256-TH0)/2 工作在 12T 模式时的输出频率 = SYSclk/12/(256-TH0)/2 指的是每 1 个时钟加 1, 是普通 C51 的 12 倍 指的是每 12 个时钟加 1 与普通 C51 一样// 允许将 P3.5/T1 脚配置为定时器 1 的时钟输出 CLKOUT1只, 能 工作在定时器模式 2 下//T1 工作在 1T 模式时的输出频率 = SYSclk/(256-TH0)/2 //T1工作在 12T 模式时的输出频率 = SYSclk/12/(256-TH0)/2//1T 指的是每 1 个时钟加 1, 是普通 C51 的 12 倍 //12T 指的是每 12 个时钟加 1 与普通 C51 一样定时器速度是普通 8051的 12倍, 即工作在 1T 模式下 定时器速度是普通 8051 的 12 倍, 即工作在 1T 模式下 定时器 0工作模式为方式 2, 自动装载时间常数 定时器 1工作模式为方式 2, 自动装载时间常数 更改该寄存器的值可实现对输出的时钟频率进行分频更改该寄存器的值可实现对输出的时钟频率进行分频//* // 主程序 // //* void main(){CLKOUT_init(); while(1);}//**************************************************************************** //// STC12C5A60S2 系统时钟模块 // //// 说明: STC12C5A60S2 单片机有两个时钟源,内部 R/C 振荡时钟和外部晶体时钟 // 出厂标准配置是使用外部晶体或时钟 // //// 涉及寄存器: CLK_DIV(时钟分频寄存器 )// 由该寄存器的 Bit0-2 组合可实现对时钟源进行 0、2、4、8、 16文案大全实用标准文档AUXR = 0xc0; //T0//T1TMOD = 0x22; ////TH0 = 0xff; // TL0 = 0xff; TH1 = 0xff; // TL1 = 0xff; TR1 = 1; TR0 = 1;}#endif*// *//实用标准文档//32 、64、 128 分频 ////// 程序说明:// 对外部时钟进行分频得到 Sysclk, 然后经过 P1.0 的独立波特率 //时钟输出功能 Sysclk/2 输出时钟频率//#include <STC12C5A60S2.h> #include <intrins.h>#define Bus_clk 12 // 若要修改系统时钟直接在此处修改// 系统时钟初始化 // *//的 sysclk 的 sysclk 的 sysclk 的 sysclk*////*void Sysclk_init(void){WAKE_CLKO = 0x04; // AUXR = 0x14;//配置 P1.0 口为频率输出 允许波特率时钟工作 // 工作模式为 1T档#endif}//**********************************************// // 主程序 ////**********************************************// void main(){Sysclk_init();while(1);}//*// // STC12C5A60S2 系统省电模块////// 说明: STC12C5A60S2 单片机有三种省电模式以降低功耗 . 空闲模式,低速模式// 掉电模式////// 涉及寄存器:// Bit0 - IDL // Bit1 - PD PCON电(源控制寄存器)控制单片机进入 IDLE 空闲模式控制单片机进入掉电模式/ / / // / 程序说明:程序实现让单片机先工作一阵子(通过 P0^3 指示灯显示)// 然后进入掉电状态 ,利用外部中断 0 口来唤醒单片机工作/ / 唤醒后单片机将通过 P0^0-3 口的灯闪烁显示开始工作////****//#include <STC12C5A60S2.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned intuchar Power_Down_Flag = 0; // 进入掉电状态标志sbit Chip_Start_LED = P0^0; //sbit Power_Down_LED_INT0 = P0^1; //INT0 sbit N_Power_Down_LED_INT0 = P0^2; //INT0 sbit Normal_Work_LED = P0^3; //sbit Power_Down_Wakeup_INT0= P3^2; // 单片机开始工作指示灯口掉电唤醒指示灯口没有唤醒指示灯正常工作指示灯外中断唤醒输入口void Delay_ms( uint time ); void Normal_work(void);void Intp_init(void); void After_Powr_Down(void);*// void Delay_ms( uint time ){uint t; // 延时时间 = (time*1003+16)us while(time--) {for( t = 0; t < 82; t++ ); }}//***********************************// // 正常工作指示 void Normal_work(void){Normal_Work_LED = 1; Delay_ms(500); Normal_Work_LED = 0; Delay_ms(500);}void After_Power_Down(void){uchar i ;for( i = 0; i < 100; i++ ) {P0 = 0x0f; Delay_ms(500); P0 = 0x00; Delay_ms(500); }}//********************************** // 中断初始化 void Intp_init(void) IT0 = ; // 外部中断源 0 为低电平触发EX0 = 1; // 允许外部中断 EA = 1 ; // 开总中断文案大全//* *////软件延时 ////*//*//// 主程序 // *//void main(){uchar j = 0;uchar wakeup_counter = 0; // P0 = 0x00;Chip_Start_LED = 1; // Intp_init(); // while(1) {P2 = wakeup_counter; wakeup_counter++; for( j = 0; j < 250; j++ ){Normal_work(); //}Power_Down_Flag = 1; // PCON = 0x02;_nop_();_nop_(); _nop_(); _nop_();After_Power_Down(); // }}//**********************************// // 中断服务//**********************************// void INT0_Service(void) interrupt 0 {if( Power_Down_Flag ){Power_Down_Flag 记录掉电次数 单片机开始工作 外中断 0 初始化系统正常工作指示 系统开始进入掉电状态 掉电唤醒后}else // 未掉电状态 文案大全实用标准文档 //* //* // = 0; Power_Down_LED_INT0 = 1; while( Power_Down_Wakeup_INT0 == 0 ) {nop();}Power_Down_LED_INT0 = 0;掉电唤醒状态指示N_Power_Down_LED_INT0 = 1; // while( Power_Down_Wakeup_INT0 == 0 ) {_nop_();}N_Power_Down_LED_INT0 = 0; } } 不是掉电唤醒指示//**************************************************************************** // // // STC12C5A60S2 A/D 转 换 模 块 // // // // // // 说明: STC12C5A60S2单片机有 8路 10位高速 AD 转换器 ,P1^0-P1^7 涉及寄存器: P1ASF (模拟功能控制寄存器 ) 、ADC_CONTR (AD 控C 制寄存器 ) ADC_RES 、 ADC_RESL 转( 换结果寄存器 ) // 动 A/D 转换 // 转换 // 注意 : 、初次打开内部 A/D 模拟电源需适当延时等内部模拟电源稳定后 , 再启 启动 A/D 后,在转换结束前不改变任何 I/O 口的状态 , 有利于高精度 A/D // // 正确 // //// // 若能将定时器 / 串行/ 中断系统关闭更好。
STC12C5A60S2单片机实现AD采样并液晶显示
STC12C5A60S2单片机实现AD采样并液晶显示STC12C5A60S2是一款高性能、低功耗的8051内核单片机。
以下是一种基于该单片机进行AD采样并液晶显示的实现方案。
请注意,由于字数限制,以下内容是基本的框架和步骤,具体细节还需要根据具体需求进行调整。
1.准备材料和设备:-STC12C5A60S2单片机主控板-16x2液晶显示屏-AD转换器(例如MCP3008)-电压传感器模块-连接线、电阻、电容等2.连接硬件:-将液晶显示屏的VCC、GND和信号线(如RS、R/W、EN、D0-D7等)连接到STC12C5A60S2单片机对应的引脚。
-将AD转换器的VCC、GND和信号线(如CLK、DOUT、DIN、CS等)连接到STC12C5A60S2单片机对应的引脚。
-将电压传感器模块的输出引脚连接到AD转换器的输入引脚。
3.编写代码:-使用C语言编写STC12C5A60S2单片机的代码,包括初始化设置、AD 采样、数据处理和液晶显示等部分。
-在初始化设置中,设置AD转换器的引脚和时钟,配置液晶显示屏的引脚和参数。
-在AD采样部分,通过SPI通信协议与AD转换器进行通信,获取电压传感器模块的输出电压值。
-在数据处理部分,将采样到的原始数据经过相应的处理,如校正、换算等。
-在液晶显示部分,将处理后的数据显示到液晶屏上,并通过适当的界面设计和显示格式展示结果。
4.烧录程序:-使用相应的编程工具将编写好的代码烧录到STC12C5A60S2单片机。
-确保烧录成功,并断开编程工具的连接。
5.调试测试:-连接好硬件后,给电压传感器模块供电,确保电压输入正常。
-上电运行STC12C5A60S2单片机,液晶显示屏应显示出AD采样后的结果。
-对不同的输入电压进行测试,观察液晶屏上的显示结果是否与实际输入电压相符。
请注意,以上仅是基本的框架和步骤,实际应用中还需要根据具体需求和应用场景进行相应的优化和调整。
HT1621程序
HT1621程序HT1621程序头文件(zhuan)2009年12月01日星期二 14:08白沙老师的//这里是符号对应的显示顺序,也就对应了在HT1621B数据寄存器内的位置#define _lcd_BUSY 0 #define _lcd_AC 1 #define _lcd_PLUS 2 #define_lcd_F1 3 #define _lcd_ERROR 4 #define _lcd_DC 5 #define _lcd_MINUS 6 #define _lcd_F2 7 #define _lcd_DOT0 12 #define _lcd_AUTO 20 #define_lcd_RUN 24 #define _lcd_PAUSE 25 #define _lcd_DOT1 26 #define_lcd_COLON0 27 #define _lcd_DOT2 32 #define _lcd_STOP 40 #define_lcd_KPA 44 #define _lcd_SETUP 45 #define _lcd_DOT3 46 #define_lcd_COLON1 47 #define _lcd_DOT4 52 #define _lcd_KG 60 #define _lcd_MM 64 #define _lcd_KM 65 #define _lcd_L 66 #define _lcd_M3 67 #define_lcd_DB 68 #define _lcd_PERCENT 69 #define _lcd_OHOM 70 #define_lcd_DEGREE 71 #define _lcd_A 72 #define _lcd_V 73 #define _lcd_MHZ 74 #define _lcd_KW 75 #define _lcd_MA 76 #define _lcd_MV 77 #define_lcd_KHZ 78 #define _lcd_W 79 #define _lcd_NG 80 #define _lcd_OK 81#define _lcd_RX 82#define _lcd_TX 83#define _lcd_FM 84#define _lcd_PM 85#define _lcd_AM 86#define _lcd_CARD 87 #define _lcd_AT3 88 #define _lcd_AT2 89 #define _lcd_AT1 90 #define _lcd_AT0 91 #define _lcd_LOCK 95 #define _lcd_BELL103 #define _lcd_COLON2 111 #define _lcd_BAT 119 #define _lcd_MAX 124#define _lcd_MIN 125 #define _lcd_CH 126 #define _lcd_FAULT 127 /*这里是我的测试板的IO口定义,用户可以根据需要修改 p2.2 = data;p4.0 = cs;p4.1 = rdp4.2 = wr*///下面是根据我的测试板情况定义的,用户可以需要修改 #define CS_LOWP4OUT &= 0xFE #define CS_HIGH P4OUT |= 0x01 #define RD_LOW P4OUT &= 0xFD #define RD_HIGH P4OUT |= 0x02 #define WR_LOW P4OUT &= 0xFB #defineWR_HIGH P4OUT |= 0x04#define DATA_LOW P2OUT &= 0xFB #define DATA_HIGH P2OUT |= 0x04//下面是驱动程序定义的一个显示缓冲区,共16个字节,128位 unsignedint lcd_buffer[8]={0,0,0,0,0,0,0,0};//这个函数可以向HT1621B写入一个命令;用户可能需要在语句间增加必要的延时 void send_lcd_command(unsigned char command){CS_LOW;WR_LOW; //PRESENT 100 COMMAND CODEDATA_HIGH;WR_HIGH;WR_LOW;DATA_LOW;WR_HIGH;WR_LOW;WR_HIGH;for (unsigned short int i =0;i<=7;i++){WR_LOW;if ((command & 0x80) !=0) DATA_HIGH;else DATA_LOW;WR_HIGH;command = command << 1;}WR_LOW;WR_HIGH;CS_HIGH;}//这个函数可以向HT1621B写入一个数据;用户可能需要在语句间增加必要的延时 void send_lcd_data(unsigned short int address,unsigned short int data){CS_LOW;WR_LOW; //PRESENT 101 DATA CODEDATA_HIGH;WR_HIGH;WR_LOW;DATA_LOW;WR_HIGH;WR_LOW;DATA_HIGH;WR_HIGH;address = address << 2;for (unsigned short int i =0;i<=5;i++) {WR_LOW;if ((address & 0x80) !=0) DATA_HIGH; else DATA_LOW;WR_HIGH;address = address << 1;}for (unsigned short int i =0;i<=3;i++) {WR_LOW;if ((data & 0x01) !=0) DATA_HIGH;else DATA_LOW;WR_HIGH;data = data >> 1;}CS_HIGH;}//这个函数可以将显示缓冲区刷新到HT1621B;用户可能需要在语句间增加必要的延时 void flood_lcd_data(void){unsigned int temp_data;CS_LOW;WR_LOW; //PRESENT 101 DATA CODEDATA_HIGH;WR_HIGH;WR_LOW;DATA_LOW;WR_HIGH;WR_LOW;DATA_HIGH;WR_HIGH;for (unsigned short int i =0;i<=5;i++){WR_LOW;DATA_LOW;WR_HIGH;}for (unsigned short int i =0;i<=7;i++){temp_data = lcd_buffer[i];for (unsigned short int j=0;j<=15;j++){WR_LOW;if ((temp_data & 0x01) !=0) DATA_HIGH;else DATA_LOW;WR_HIGH;temp_data = temp_data >> 1;}}CS_HIGH;}//初始化HT1621Bvoid lcd_init(void){send_lcd_command(0x28); //1/2bias,4commsend_lcd_command(0x03); //启动内部振荡器send_lcd_command(0x01); //打开显示}//向液晶写一个符号//name:可直接写0~127的整数,也可以写程序开始定义的标号,如:_lcd_BUSY //display:符号void lcd_char(unsigned short int name,unsigned short int display) {unsigned short int i,j;i= name/16;j= name%16;if (display == 1) lcd_buffer[i] |= 1<<j; else lcd_buffer[i] &=~(1<<j);flood_lcd_data();}//清除全部液晶的显示,同时清空显示缓冲区void lcd_clr(){for (int i=0; i<=7;i++) lcd_buffer[i]=0; flood_lcd_data();}//向液晶的数位处写一个0~9的数//数位为大数码的左至右为0~5,小数码的右至左为6~9;//number:想显示的数 0~9//position:显示的数位//display:显示开关,0 关闭该数位显示(此时number值无效),1 显示该数位数字 void lcd_number(unsigned short int number,unsigned short int position,unsigned shortint ){switch (position){case 0:{if (display == 0) lcd_buffer[0] &= 0x10ff;else{lcd_buffer[0] &= 0x10ff;switch (number){case 0:lcd_buffer[0] |= 0xEB00; break;case 1:lcd_buffer[0] |= 0x6000; break;case 2:lcd_buffer[0] |= 0xC700; break;case 3:lcd_buffer[0] |= 0xE500; break;case 4:lcd_buffer[0] |= 0x6C00; break;case 5:lcd_buffer[0] |= 0xAD00; break;case 6:lcd_buffer[0] |= 0xAF00; break;case 7:lcd_buffer[0] |= 0xE000; break;case 8:lcd_buffer[0] |= 0xEF00; break;case 9:lcd_buffer[0] |= 0xED00;break;}}break;}case 1:{if (display == 0) lcd_buffer[0] &= 0xff10; else{lcd_buffer[1] &= 0xff10;switch (number){case 0:lcd_buffer[1] |= 0x00EB;break;case 1:lcd_buffer[1] |= 0x0060;break;case 2:lcd_buffer[1] |= 0x00C7;break;case 3:lcd_buffer[1] |= 0x00E5;break;case 4:lcd_buffer[1] |= 0x006C;break;case 5:lcd_buffer[1] |= 0x00AD;break;case 6:lcd_buffer[1] |= 0x00AF; break;case 7:lcd_buffer[1] |= 0x00E0; break;case 8:lcd_buffer[1] |= 0x00EF; break;case 9:lcd_buffer[1] |= 0x00ED; break;}}break;}case 2:lcd_buffer[1] &= 0x0fff;lcd_buffer[2] &= 0xfff1;if (display == 0) break;else switch (number){case 0:lcd_buffer[1] |= 0xB000;lcd_buffer[2] |= 0x000E; break;case 1:lcd_buffer[2] |= 0x0006; break;case 2:lcd_buffer[1] |= 0x7000; lcd_buffer[2] |= 0x000C; break;case 3:lcd_buffer[1] |= 0x5000; lcd_buffer[2] |= 0x000E; break;case 4:lcd_buffer[1] |= 0xC000; lcd_buffer[2] |= 0x0006; break;case 5:lcd_buffer[1] |= 0xD000; lcd_buffer[2] |= 0x000A; break;case 6:lcd_buffer[1] |= 0xF000; lcd_buffer[2] |= 0x000A; break;case 7:lcd_buffer[1] |= 0x0000; lcd_buffer[2] |= 0x000E; break;case 8:lcd_buffer[1] |= 0xF000;lcd_buffer[2] |= 0x000E; break;case 9:lcd_buffer[1] |= 0xD000;lcd_buffer[2] |= 0x000E; break;}break;case 3:lcd_buffer[2] &= 0xF10F;if (display == 0) break;else switch (number){case 0:lcd_buffer[2] |= 0x0EB0; break;case 1:lcd_buffer[2] |= 0x0600; break;case 2:lcd_buffer[2] |= 0x0C70; break;case 3:lcd_buffer[2] |= 0x0E50; break;case 4:lcd_buffer[2] |= 0x06C0;break;case 5:lcd_buffer[2] |= 0x0AD0; break;case 6:lcd_buffer[2] |= 0x0AF0; break;case 7:lcd_buffer[2] |= 0x0E00; break;case 8:lcd_buffer[2] |= 0x0EF0; break;case 9:lcd_buffer[2] |= 0x0ED0; break;}break;case 4:lcd_buffer[3] &= 0xFF10;if (display == 0) break;else switch (number){case 0:lcd_buffer[3] |= 0x00EB; break;case 1:lcd_buffer[3] |= 0x0060; break;case 2:lcd_buffer[3] |= 0x00C7; break;case 3:lcd_buffer[3] |= 0x00E5; break;case 4:lcd_buffer[3] |= 0x006C; break;case 5:lcd_buffer[3] |= 0x00AD; break;case 6:lcd_buffer[3] |= 0x00AF; break;case 7:lcd_buffer[3] |= 0x00E0; break;case 8:lcd_buffer[3] |= 0x00EF; break;case 9:lcd_buffer[3] |= 0x00ED; break;}break;case 5:lcd_buffer[3] &= 0x10FF;if (display == 0) break;else switch (number){case 0:lcd_buffer[3] |= 0xEB00; break;case 1:lcd_buffer[3] |= 0x6000;break;case 2:lcd_buffer[3] |= 0xC700; break;case 3:lcd_buffer[3] |= 0xE500; break;case 4:lcd_buffer[3] |= 0x6C00; break;case 5:lcd_buffer[3] |= 0xAD00; break;case 6:lcd_buffer[3] |= 0xAF00; break;case 7:lcd_buffer[3] |= 0xE000; break;case 8:lcd_buffer[3] |= 0xEF00; break;case 9:lcd_buffer[3] |= 0xED00; break;}break;case 6:lcd_buffer[5] &= 0x8fff;lcd_buffer[6] &= 0xfff0;if (display == 0) break;else switch (number){case 0:lcd_buffer[5] |= 0x7000; lcd_buffer[6] |= 0x000D; break;case 1:lcd_buffer[5] |= 0x6000; break;case 2:lcd_buffer[5] |= 0x3000; lcd_buffer[6] |= 0x000E; break;case 3:lcd_buffer[5] |= 0x7000; lcd_buffer[6] |= 0x000A; break;case 4:lcd_buffer[5] |= 0x6000; lcd_buffer[6] |= 0x0003; break;case 5:lcd_buffer[5] |= 0x5000; lcd_buffer[6] |= 0x000B; break;case 6:lcd_buffer[5] |= 0x5000;lcd_buffer[6] |= 0x000F; break;case 7:lcd_buffer[5] |= 0x7000;lcd_buffer[6] |= 0x0000; break;case 8:lcd_buffer[5] |= 0x7000;lcd_buffer[6] |= 0x000F; break;case 9:lcd_buffer[5] |= 0x7000;lcd_buffer[6] |= 0x000B; break;}break;case 7:lcd_buffer[6] &= 0xF08F;if (display == 0) break;else switch (number){case 0:lcd_buffer[6] |= 0x0D70;break;case 1:lcd_buffer[6] |= 0x0060; break;case 2:lcd_buffer[6] |= 0x0E30; break;case 3:lcd_buffer[6] |= 0x0A70; break;case 4:lcd_buffer[6] |= 0x0360; break;case 5:lcd_buffer[6] |= 0x0B50; break;case 6:lcd_buffer[6] |= 0x0F50; break;case 7:lcd_buffer[6] |= 0x0070; break;case 8:lcd_buffer[6] |= 0x0F70; break;case 9:lcd_buffer[6] |= 0x0B70; break;}break;case 8:lcd_buffer[6] &= 0x8fff;lcd_buffer[7] &= 0xfff0;if (display == 0) break; else switch (number) {case 0:lcd_buffer[6] |= 0x7000; lcd_buffer[7] |= 0x000D; break;case 1:lcd_buffer[6] |= 0x6000; break;case 2:lcd_buffer[6] |= 0x3000; lcd_buffer[7] |= 0x000E; break;case 3:lcd_buffer[6] |= 0x7000; lcd_buffer[7] |= 0x000A; break;case 4:lcd_buffer[6] |= 0x6000; lcd_buffer[7] |= 0x0003; break;case 5:lcd_buffer[6] |= 0x5000;lcd_buffer[7] |= 0x000B; break;case 6:lcd_buffer[6] |= 0x5000; lcd_buffer[7] |= 0x000F; break;case 7:lcd_buffer[6] |= 0x7000; lcd_buffer[7] |= 0x0000; break;case 8:lcd_buffer[6] |= 0x7000; lcd_buffer[7] |= 0x000F; break;case 9:lcd_buffer[6] |= 0x7000; lcd_buffer[7] |= 0x000B; break;}break;case 9:lcd_buffer[7] &= 0xF08F; if (display == 0) break; else switch (number){case 0:lcd_buffer[7] |= 0x0D70; break;case 1:lcd_buffer[7] |= 0x0060; break;case 2:lcd_buffer[7] |= 0x0E30; break;case 3:lcd_buffer[7] |= 0x0A70; break;case 4:lcd_buffer[7] |= 0x0360; break;case 5:lcd_buffer[7] |= 0x0B50; break;case 6:lcd_buffer[7] |= 0x0F50; break;case 7:lcd_buffer[7] |= 0x0070; break;case 8:lcd_buffer[7] |= 0x0F70; break;case 9:lcd_buffer[7] |= 0x0B70; break;}break;}flood_lcd_data(); }。
官方HT1621B驱动程序HT48 MCU 对HT1621 LCD控制器的使用(汇编)
作结束可以用 SYSTEM DISABLE 来关闭 LCD。
由于是串行通信,数据应该先出现在 DATA INPUT 脚,然后给出一个写允许信号(WR),输入一
位数据,接着输入第二位…直到全部写入。
对 RAM 区不连续写数据过程是这样的: 1 0 1 A5 A4 A3 A2 A1 A0 D0 D1 D2 D3 结束位 下一个过程
A, 8 count, A
datum code_datum.7 datum code_datum WRB
WRB count loop1
; send code
clr
WRB
d_1
set
WRB
nop
set
CSB
;close csb signal,not selecting the chip
ret
send_command endp
;
code_datum : byte
;Return :
none
;Modified : acc, status
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
send_command proc
clr
CSB
clr
datumC
set
datum
clr
WRB
RDB
7
set
RDB
rr
code_datum
clr
code_datum.3
sz
datum
set
code_datum.3
sdz
count
jmp readloop2
HT48 MCU 对 HT1621 LCD 控制器的使用
STC12C5A60(32)S2单片机AD采样-LCD1602液晶显示程序
/******************************************************STC12C5A32S2或STC12C5A60S2等单片机ADC采样功能示例**1、P1 口为8路10位AD转换口2、用LCD1602显示:数据口为P0,RW接P2.5,RS 接P2.6,EN接P2.73、亲手编写、亲自调试,完全可行*****************************************************/#include<reg52.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intvoid delay_ms(uint x);//ms 延时子函数/*****stc12c5a32s2相关的寄存器说明*****/sfr P1ASF=0x9D;//P1 口模数转换功能控制寄存器sfr ADC_CONTR= 0xBC;//AD转换控制寄存器sfr ADC_RES =0xBD; //AD转换结果寄存器高位sfr ADC_RESL= 0xBE;//AD转换结果寄存器低位sfr AURX1=0xA2; //AD转换结果存储方式控制位/***P1ASF寄存器:8位,对应P1口8根线,用于指定那根线用作ADC 功能******哪根线用作ADC就应置相应的位为1,注意:不能位寻址******/#define ADC_POWER0x80//ADC电源开#define ADC_SPEED0x40 //设置为180个周期,ADC一次#define ADC_START 0x08 //ADC 启动控制位设为开#define ADC_FLAG 0X10 //ADC 结束标志位//***第n通道ADC初始化函数***//void ADC_int(uchar n){n &=0x07; //确保是第0~7通道AURX1|=0x04; //转换结果存储方式:高2位放ADC_RES,低8位放ADC_RESLP1ASF =1<<n; //将P1.n设为ADC采样功能}//***第n通道ADC采样函数***//uint ADC_GET(uchar n){uint adc_data;n &=0x07; //确保是第0~7通道ADC_RES= 0; //清存放结果存储器ADC_RESL= 0; //清存放结果存储器ADC_CONTR = 0; //AD 转换控制寄存器清0,以便重置ADC_CONTR |= (ADC_POWER|ADC_SPEED|n|ADC_START);//打开AD 转换电源,设定转换速度,设定通道号,AD转换开始_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();//延时4个时钟周期左右while(!((ADC_CONTR&ADC_FLAG) == 0x10)) //等待转换结束adc_data= (ADC_RES &0x03) * 256 + ADC_RESL;//转换结果计算ADC_CONTR &=0xef; // 转换结束标志清0return adc_data; //adc_data的值(0~1023)}/***如果需要释放P1 口为普通IO口,则需要本函数***//*void ADC_END(){P1ASF =0;P1_CONTR=0;}*//********延时子函数:xms********/void delay_ms(uint x){uint y;for(;x>0;x--)for(y=0;y<125;y++);}/*****以下是与LCD1602 显示相关的定义和函数声明*****/#define lcd_data_port P0//1602 数据口接P0sbit lcd_rs = P2^6; //RS 接P2.6(=0,是命令;=1,是数据)sbit lcd_rw= P2^5; //RW接P2.5(=0,是写;=1,是读)sbit lcd_en=P2^7; //EN 接P2.7void lcd_write_com(uchar lcd_com); //写命令子函数void lcd_write_data(uchar lcd_data);//写数据子函数void lcd_int();//1602初始化void lcd_locate(uchar x,uchar y);//显示定位(行,列)void lcd_4_char(uint data_4char); //显示4位整型函数/********写命令子函数********/void lcd_write_com(uchar lcd_com){lcd_data_port=lcd_com; //指令送到数据接口lcd_rs=0;//选择命令lcd_rw=0; //选择写lcd_en= 0;delay_ms(1);lcd_en= 1;delay_ms(1);lcd_en= 0;}/********写数据子函数********/void lcd_write_data(uchar lcd_data){lcd_data_port=lcd_data;//数据送到数据接口lcd_rs=1;//选择数据lcd_rw=0; //选择写lcd_en= 0;delay_ms(1);lcd_en= 1;delay_ms(1);lcd_en= 0;}/********LCD1602 液晶初始化********/void lcd_int(){lcd_rs=0;//选择命令lcd_rw=0; //选择写lcd_en= 0;lcd_write_com(0x38); //设1602工作于16*2、5*7,8位数据接口模式lcd_write_com(0x0c); //开显示,不显示光标lcd_write_com(0x06); //写一个字符后,光标自动加一lcd_write_com(0x01); //清屏}/******显示定位子函数(行,列)******/void lcd_locate(uchar x,uchar y){uchar add;if(x==1)add=0x80;if(x==2)add=0x80+0x40;lcd_write_com(add+y-1);}/*********显示4位整数子函数********/void lcd_4_char(uint data_4_char){uchar lcd_table[4];lcd_table[1]= data_4_char/ 1000; //获得千位lcd_table[2]= data_4_char% 1000/100;//获得百位lcd_table[3]= data_4_char% 100/10;//获得十位lcd_table[4]= data_4_char% 10; //获得个位lcd_write_data(lcd_table[1]+0x30); //显示千位lcd_write_data(lcd_table[2]+0x30); //显示百位lcd_write_data(lcd_table[3]+0x30); //显示十位lcd_write_data(lcd_table[4]+0x30); //显示个位}/**************主函数***************/void main(){lcd_int();//液晶初始化lcd_write_com(0x01); //液晶清屏while(1){uint ad_0= 0;ADC_int(0); //ADC 的通道0初始化ad_0= ADC_GET(0);//AD转换处理后的数据存放于ad_0中lcd_locate(1,1); //显示在液晶的第1行,第1列lcd_4_char(ad_0); //显示4位整数delay_ms(20); //延时}}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
/*********************************消息类型定义***********************************************************/
typedef enum
{
#define Char_D_Index 13
#define Char_E_Index 14
#define Char_F_Index 15
#define Char_G_Index 16
#define Char_H_Index 17
#define Char_L_Index 18
{0x05,0x0e}, //U段码 20
{0x02,0x00}, //-段码 21
{0x08,0x00}, //.段码 如果是SEG4则为单位Kvar 22
{0x00,0x0f}, //“)”段码 23
{0x02,0x07}, //F段码 15
{0x04,0x0f}, //G段码 16
{0x07,0x06}, //H段码 17
{0x00,0x0e}, //L段码 18
{0x03,0x07}, //P段码 19
{0x06,0x0b}, //5段码
{0x06,0x0f}, //6段码
{0x05,0x01}, //7段码
{0x07,0x0f}, //8段码
{0x07,0x0b}, //9段码
//#include "reg2051.h"
#include "STC12C5612AD.H"
#include "intrins.h"
#include "ht1621.h"
/*******************************************宏定义***********************************************/
/*********************************串口波特率发生器预置值*************************************************/
uint16 code UART__TAB[] = {
(uint16)(FOSC / 9600) - 16, //9600BPS
(uint16)(FOSC / 14400) - 16, //14400BPS
(uint16)(FOSC / 19200) - 16 //19200BPS
KEY_UP , //递增键
KEY_ENTER , //确定键
} MSG;
/*****************************************口线定义**************************************************/
NOT_KEY, //无按键
KEY_SET, //设置键
KEY_DOWN, //递减键
#define Char_T_Index 25
#define Char_DownLing_Index 26
#define Char_UpLing_Index 27
#define FOSC 11059200 //CPU外接晶振频率(Hz)
#define Char_P_Index 19
#define Char_U_Index 20
#define Char_Ling_Index 21
#define Char_Dot_Index 22
#define Char_Bracket_Index 23
#define Char_N_Index 24
#define SYS_TICKS_PER_SEC 500 //每秒的系统节拍305
#define CLOCK 1 //分频 不分频;
#define TIM0_LOW (65536 - ((FOSC / CLOCK) / SYS_TICKS_PER_SEC)) % 256//Timer0重装值
#define MODE 1
/**字符索引 **/
#define Char_S_Index 5
#define Char_A_Index 10
#define Char_B_Index 11
#define Char_C_Index 12
#define TIM0_HIGH (65536 - ((FOSC / CLOCK) / SYS_TICKS_PER_SEC)) / 256
#define IRQ_INT0 0 //INT0中断号
uint8 Dis_Buf[16]; //显示更新缓存数组
bit gRec; //串口接收中 数据标志
bit gDisData; //接收数据标志
bit gGetKey; //接收键盘标志
uint8 gKeyValue; //读取键盘值
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
/*****************************************全局变量定义**********************************************/
{0x07,0x07}, //A段码 10
{0x06,0x0e}, //B段码 11
{0x00,0x0f}, //C段码 12
{0x07,0x0c}, //D段码 13
{0x02,0x0f}, //E段码 14
/********************************************************************************************************
* 智能综合监控器显示器源序(STC12LE5612AD) *
#define VER 1101 //版本号U1101,
//CPU:STC12LE5612AD显示板程序版本;
#define DIGIT 13 //10位数据+aa+crc校验
#define MASTER 0XFD
#define SLAVE 0XFB
* *
* V1.00 *
* 2011.2.19 *
*
**********************************************************************************************************/
{0x05,0x07}, //n段码 24
{0x00,0x07}, //T段码 25
{0x00,0x08}, //下划线 26
{0x00,0x01} //上划线 27
};
uint8 code Ht1621Clear[16]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //显示清零
(uint16)(FOSC / 3600) - 16, //3600BPS
(uint16)(FOSC / 4800) - 16, //4800BPS
(uint16)(FOSC / 7200) - 16, //7200BPS
(uint16)(FOSC / 1200) - 16, //1200BPS
(uint16)(FOSC / 1800) - 16, //1800BPS
(uint16)(FOSC / 2400) - 16, //2400BPS
* *
* (c) Copyright 2011 *
* All Rights Reserved *
sbit Key1 =P1^3; //设置键
sbit Key2 =P1^4; //确认键
sbit Key3 =P1^5; //上翻键
sbit Key4 =P1^6; //下翻键
sbit Rs485_SW =P2^3;
{0x05,0x0f}, //0段码
{0x05,0x00}, //1段码
{0x03,0x0d}, //2段码
{0x07,0x09}, //3段码
{0x07,0x02}, //4段码
#define IRQ_T0 1 //T0中断号
#define IRQ_T1 3 //T1中断号
#define IRQ_UART 4 //串口中断号
void Rs485_DirR(void)
{
Rs485_SW = 0; //输出低电平
}
void Rs485_DirT(void)
{
Rs485_SW = 1; //输出高电平
}
uint8 code Number_Tab[][2]={ //对应地址线SEG4-SEG13的数字编码