断码屏驱动程序.docx
- 文档编号:3402809
- 上传时间:2023-05-05
- 格式:DOCX
- 页数:16
- 大小:19.68KB
断码屏驱动程序.docx
《断码屏驱动程序.docx》由会员分享,可在线阅读,更多相关《断码屏驱动程序.docx(16页珍藏版)》请在冰点文库上搜索。
断码屏驱动程序
HT1621动段式液晶的C51程序
HT1621是台湾Holtek公司推的段码LCD动控制芯片,同步串行接口,最多可以控制128段
驱动方式可选1/2、1/3、1/4Duty和1/2、1/3Bias。
供电电压为2.4~5.2V,无需外部振荡电路。
简单易用。
以下是应用HT1621驱动的LCD模块串行模式的C51范例。
=============================================================================*/
/*===============================HT1621forC51===============================*/
#include /*8051寄存器定义请修改为自己用的文件*/
typedefunsignedcharuchar;
typedefunsignedintuint;
sbit_CS=P2^0; //片选
sbit_WR=P2^1; //写时钟
sbit_DAT=P2^4; //数据线
/*-----------------*/
delay(intt) /*延时函数*/
{
inti,j;
for(i=0;i for(j=0;j<255;j++) ; } /*-----------------*/ write_com(ucharcom) /*写命令到HT1621*/ { uchari,k; _CS=0; //片选,低电平有效 k=0x80; for(i=0;i! =3;i++) /*WriteCMDcode: 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++) /*WriteCMD(HT1621的命令一般是9位,且最后一个任意取值)*/ { if(k&0x80==0) _DAT=0; else _DAT=1; _WR=0; //发出写时钟脉冲 _WR=1; k=k<<1; //准备下一位数据 } _CS=1; //取消片选信号 } /*------------------*/ write_dat(ucharaddr,uchardat)/*写显示数据到LCD*/ { uchari,k; _CS=0; k=0xa0; for(i=0;i=! 3;i++) /*WriteCMDcode: 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++) /*WriteRAMaddress: 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++) /*WriteDisplaydata: xxxxC0~C3*/ { if(k&0x80==0) _DAT=0; else _DAT=1; _WR=0; //发出写时钟脉冲 _WR=1; k=k<<1; //准备下一位数据 } _CS=1; //取消片选信号 } DISP_NUM(uchardat) /*Writeanumber*/ { uchari,j,addr; for(i=8;i! =28;i++) { write_dat(i,dat<<4); //一个字节要分两次传送 write_dat(++i,dat); } } DIS(uchardat) { uchari,j; for(i=0;i! =28;i++) write_dat(i,dat); } setup_lcd(void) { delay(100); write_com(0x01); /*Enablesystem,SYSEN命令*/ write_com(0x18); /*CLOCKSOURCEIS256kRCONCHIP,RC256K*/ write_com(0x29); /*BIAS=1/3DUTY=1/4,LCD1/3偏置,4个COM*/ write_com(0x03); /*Displayon,打开LCD偏置发生器*/ DIS(0x00); /*ClearLCD,清屏(用全0填显示内存)*/ delay(20); } main() { uchari,j,temp; delay(100); setup_lcd(); //初始化LCD驱动IC delay(10); while (1) { delay(200); DIS(0x0f); //显示黑白条纹 delay(200); DIS(0x00); //清屏 temp=0xf8; for(i=0;i! =8;i++) /*DisplayICONs*/ { 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*/ } }
另一个程序
1621lcd液晶的51单片机驱动程序分享
[复制链接]
#include
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
#define_Nop()_nop_()
#defineBIAS0x52 //0b100001010010 1/3duty4com
#defineSYSDIS0X00 //0b100000000000 关振系统荡器和LCD偏压发生器
#defineLCDOFF0X04 //0b100000000100 关LCD偏压
#defineLCDON0X06 //0b100000000110 打开LCD偏压
#defineSYSEN0X02 //0b100000000010打开系统振荡器
#defineXTAL0x28 //0b100000101000外部接时钟
#defineRC2560X30 //0b100000110000 内部时钟
#defineTONEON0X12 //0b100000010010 打开声音输出
#defineTONEOFF0X10 //0b100000010000关闭声音输出
#defineWDTDIS0X0A //0b100000001010 禁止看门狗
//HT1621控制位
sbitHT1621_DAT=P2^5;
sbitHT1621_CS=P2^6;
sbitHT1621_WR=P2^7;
ucharcodeHt1621Tab[]={0xf5,0x05,0xb6,0x57,0x53,0xd3,0xf3,0x85,0xf7,0xd7}; //0,1,...8,9
ucharcodeHt1621Tab1[]={0xeb,0x0a,0xad,0x8f,0x4e,0xc7,0xe7,0x8a,0xef,0xcf};
//delayus
voidDelay(ucharus)
{
while(--us);
}
//delayms
voidDelayMS(uintiMs)
{
uinti,j;
for(i=0;i for(j=0;j<65;j++)Delay (1); } //完成写一个命令包括头(100) voidHt1621WrCmd(ucharucTmpCmd) { uchardatai,ucCmdByte=0x80; HT1621_CS=0; _Nop(); _Nop(); for(i=0;i<4;i++) { if(ucCmdByte&0x80)HT1621_DAT=1; else HT1621_DAT=0; HT1621_WR=0; _Nop(); _Nop(); HT1621_WR=1; _Nop(); ucCmdByte<<=1; } for(i=0;i<8;i++) { if(ucTmpCmd&0x80)HT1621_DAT=1; elseHT1621_DAT=0; HT1621_WR=0; _Nop(); _Nop(); HT1621_WR=1; _Nop(); ucTmpCmd<<=1; } HT1621_CS=1; _Nop(); _Nop(); } //写命令+地址 voidHt1621WrDataCmd(ucharucAddr) { uchardatai,ucDataCmd=0x05; //101 ucDataCmd<<=5; for(i=0;i<3;i++) { if(ucDataCmd&0x80)HT1621_DAT=1; elseHT1621_DAT=0; HT1621_WR=0; _Nop(); _Nop(); HT1621_WR=1; _Nop(); ucDataCmd<<=1; } ucAddr<<=2; for(i=0;i<6;i++) { if(ucAddr&0x80)HT1621_DAT=1; elseHT1621_DAT=0; HT1621_WR=0; _Nop(); _Nop(); HT1621_WR=1; _Nop(); ucAddr<<=1; } } //完成写一个字节数据 voidHt1621WrByte(ucharucTmpData) { uchardatai; for(i=0;i<8;i++) { if(ucTmpData&0x80)HT1621_DAT=1; elseHT1621_DAT=0; HT1621_WR=0; _Nop(); _Nop(); HT1621_WR=1; _Nop(); ucTmpData<<=1; } } voidCPU_Init() { P0=0XFF; P1=0xf8; P2=0XFF; P3=0XFF; } voidHt1621_Init() { HT1621_CS=1; HT1621_WR=0; HT1621_DAT=1; DelayMS(2000); //延时使LCD工作电压稳定 Ht1621WrCmd(BIAS); Ht1621WrCmd(RC256); //使用内部振荡器 Ht1621WrCmd(SYSDIS); Ht1621WrCmd(WDTDIS); Ht1621WrCmd(SYSEN); Ht1621WrCmd(LCDON); } voidmain() { uchardatai; SP=0X60; CPU_Init(); Ht1621_Init(); //上电初始化LCD while (1) { for(i=0;i<10;i++) { HT1621_CS=0; Ht1621WrDataCmd(4); //往RAM的地址4写数据 这里的参数范围为: 0-31 Ht1621WrByte(Ht1621Tab[i]); HT1621_CS=1; DelayMS(2000); //2S } } } 案例 双十二解锁赚钱新姿势 这个逻辑图到底怎么编辑显示数组啊? 下面是原理图 下面是网上找的代码,运行后液晶可以显示,就是不知道怎么做到显示自己要的显示值 #include clude sbitBL=P5^4;//原来代码没有这个IO口操作,就是液晶背光源 //sbitCS=P3^5; #include #include #include #defineucharunsignedchar #defineuintunsignedint #define_Nop()_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_() #defineBIAS0x52//1/3偏压,4背极100001010010 #defineSYSDIS0X00//关闭系统时钟和偏压发生器 #defineSYSEN0X02//打开系统时钟 #defineLCDOFF0X04 #defineLCDON0X06 #defineXTAL0x28 #defineRC2560X30//系统时钟选择为片内RC振荡器 #defineTONEON0X12//打开音频输出 #defineTONEOFF0X10//关闭音频输出 #defineWDTDIS0X0A//禁止WDT溢出标志输出 sbitHT1621_DAT=P3^7; sbitHT1621_CS=P3^5; sbitHT1621_WR=P3^6; //sbitcs_sda=P3^5;//dog //constcharnum[]={0x}; ucharcode Ht1621Tab[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; //delayus voidDelay(ucharus)//5,7,9 { while(--us); } voidDelayMS(uintiMs) { uinti,j; for(i=0;i for(j=0;j<65;j++)Delay (1); } voidHt1621Wr_Data(ucharData,ucharcnt)//cnt是从运行函数传送来的COM数。 { uchari; for(i=0;i { HT1621_WR=0;//P3.6口 _Nop(); HT1621_DAT=Data&0x80;//P3.7口//10000000数据移动到高位10100000 _Nop(); HT1621_WR=1;//P3.6口 _Nop(); Data<<=1; } } voidHt1621WrCmd(ucharCmd) { HT1621_CS=0; _Nop(); Ht1621Wr_Data(0x80,4);//写入命令的ID: 100 Ht1621Wr_Data(Cmd,8);//写入实际命令的高8位(CMD.): C8-C1 HT1621_CS=1; _Nop(); } voidHt1621WrOneData(ucharAddr,ucharData) { HT1621_CS=0; Ht1621Wr_Data(0xa0,3);//写入数据标志101//写入写数据的ID101高3位有效 Ht1621Wr_Data(Addr<<2,6);//将实际地址挪到高位//写入地址数据//写入6个位初始地址高6位有效 Ht1621Wr_Data(Data<<4,4);//将实际数据挪到高位//写入数据//写入4个位数据高4位有效 HT1621_CS=1; _Nop(); } voidHt1621WrAllData(ucharAddr,uchar*p,ucharcnt) { uchari; HT1621_CS=0; Ht1621Wr_Data(0xa0,3);//10100000//写入写数据的ID101高3位有效 Ht1621Wr_Data(Addr<<2,6);////将实际地址挪到高位//写入6个位初始地址高6位有效 for(i=0;i { Ht1621Wr_Data(*p,8); p++; } HT1621_CS=1; _Nop(); } voidHt1621_Init(void) { HT1621_CS=1; HT1621_WR=1; HT1621_DAT=1; DelayMS(500); //cs_sda=~cs_sda;// Ht1621WrCmd(BIAS); Ht1621WrCmd(RC256); Ht1621WrCmd(SYSDIS); Ht1621WrCmd(WDTDIS); Ht1621WrCmd(SYSEN); Ht1621WrCmd(LCDON); } voidmain() { uchari,j,t; Ht1621_Init();//上电初始化LCD //cs_sda=~cs_sda;//原来的这个不知道是什么,我注释掉了 BL=0; while (1) { if(i==111111) Ht1621WrAllData(0,Ht1621Tab,16);//清屏,这里的16是什么意思还没搞懂。 。 。 for(i=0;i<32;i++) { t=0x01; for(j=0;j<4;j++) { Ht1621WrOneData(i,t); t<<=1; t++; DelayMS(100); //cs_sda=~cs_sda;//还有这里也有,不知道原来是做什么用的 } } } }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 断码屏 驱动程序
![提示](https://static.bingdoc.com/images/bang_tan.gif)