1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > HT1621B段码 LCD屏驱动 51单片机驱动程序

HT1621B段码 LCD屏驱动 51单片机驱动程序

时间:2021-09-24 03:22:03

相关推荐

HT1621B段码 LCD屏驱动  51单片机驱动程序

逻辑图

左边三段数字是温度显示 右边两位是湿度

下面是完整的程序 (io口模拟spi发送数据写给ram)个人理解 水平有限

头文件 lcd.h

#ifndef __LCD__H__#define __LCD__H__#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned int#define NOP _nop_();_nop_();_nop_();_nop_();_nop_();_nop_()sbit DATA=P1^0;sbit W_R=P1^1;sbit CS=P1^3;/*************************/uchar num_data[];//char flag;char cache[];void initial();void Write_Bits(uchar buffer,uchar i);void tran_data(uchar *p);void wave();void delay(uchar);

void witre_clear();

void write_data_by_8bit(uchar num,uchar ad); void Write_Temperature(uint t,uchar p1,uchar t46);//温度显示void Write_Humidity(uint h ,uchar t3);//湿度显示void Write_Mode(uchar a,uchar m);//AUTO//Manual 模式void Write_Wifi(uchar h);//wifi显示void Write_Water(uchar w);//缺水显示void Write_Level(uchar s7,uchar s14,uchar s21); //风力档位void Show_cache();//将显存写入HT1621的ram#endif

源文件

#include<reg51.h>#include<intrins.h>#include"lcd.h"uchar num_data[]={0xf5,0x05,0xb6,0x97,0x47,0xd3,0xf3,0x85,0xf7,0xd7};//0到9的字库char cache[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};///显存数组char flag=1;void initial(){CS=0;DATA=1; wave(); //command mode命令模式 配置HT1621DATA=0; wave(); DATA=0; wave();Write_Bits(0x18, 8);//RC 256KWrite_Bits(0x00, 8);Write_Bits(0x01, 8);//turn on system oscilator Write_Bits(0x03, 8);//turn on bias generatorWrite_Bits(0x29, 8);//1/3 bias 4 commons// 1/2 bias 3 commons//0x04// tran_inst(0xe0); //turn on lcd outputCS=1;}void write_data_by_8bit(uchar p,uchar ad){unsigned char i,address=((ad*2)<<2);///对应ram地址 两个4位一写CS=0;DATA=1;wave();//数据模式DATA=0;wave();DATA=1;wave();for(i=0;i<6;i++)6位地址 { DATA=((address&0x80)==0x80);wave();address<<=1;}Write_Bits(p,8);//delay(4);CS= 1;}void Write_Bits(uchar buffer,uchar j)//按j位写数据{uchar i;for(i=0;i<j;i++){DATA=((buffer&0x80)==0x80);wave();buffer<<=1;}//DATA=0;// wave(); W_R=1; }void delay(uchar time) //延时 50*time ms{uchar i;TMOD=0x01;TH0=(65536-50000)/256;TL0=(65536-50000)%256; TR0=1; for(i=0;i<time;i++){while(~TF0) ; TF0=0;TH0=(65536-50000)/256;TL0=(65536-50000)%256; }}void wave() // generate a waveform 模拟clk{W_R=0; NOP;W_R=1; NOP;W_R=0; NOP; }void witre_clear() //清cache{uchar j;for(j=0;j<10;j++) {cache[j]=0x00;}}void Write_Temperature(uint t,uchar p1,uchar t46)//3位温度数据写到cache p1 为小数点 0 1亮灭 /t46 1 ℃摄氏度 2℉华氏度 0灭{unsigned char a0,a1,a2;a2=(t/100)%10;//百位a1=(t/10)%10;///十位a0=t%10;个位cache[2]=num_data[a0];cache[1]=num_data[a1];cache[0]=num_data[a2];if(p1==1)cache[1]=cache[1]|(1<<3);elsecache[1]=cache[1]&~(1<<3);if(t46==1){flag=1;//解决T6被湿度覆盖cache[2]=cache[2]|(1<<3);//T4cache[3]=cache[3]|(1<<3); //T6cache[0]=cache[0]&~(1<<3);//T5}else if(t46==2){flag=0;//

cache[2]=cache[2]|(1<<3);

cache[3]=cache[3]&~(1<<3);cache[0]=cache[0]|(1<<3);}else{flag=0;cache[2]=cache[2]&~(1<<3);cache[3]=cache[3]&~(1<<3);cache[0]=cache[0]&~(1<<3);}}void Write_Humidity(uint h,uchar t3)//写两位湿度 T3 %{unsigned char a0,a1;a1=(h/10)%10;///a0=h%10;if(flag)cache[3]=num_data[a1]|(1<<3);elsecache[3]=num_data[a1]&~(1<<3);cache[4]=num_data[a0];if(t3==1)cache[4]=cache[4]|(1<<3);elsecache[4]=cache[4]&~(1<<3);}void Write_Mode(uchar a,uchar m)//if(a==1)cache[5]=cache[5]|(1<<6);elsecache[5]=cache[5]&~(1<<6);if(m==1)cache[5]=cache[5]|(1<<7);elsecache[5]=cache[5]&~(1<<7);}void Write_Wifi(uchar h);//void Write_Water(uchar w)//{if(w==1)cache[7]=cache[7]|(1<<3);elsecache[7]=cache[7]&~(1<<3);}void Write_Level(uchar s7,uchar s14,uchar s21)//S7/S14/S21 第几个叶子代表档位 1单叶 2双叶 0:灭 单页和双叶循环转动{if(s7==1){cache[7]=cache[7]|(1<<1);cache[7]=cache[7]|(1<<2);cache[7]=cache[7]|(1<<4);cache[7]=cache[7]|(1<<6);cache[7]=cache[7]&~(1<<0);cache[7]=cache[7]&~(1<<5);cache[7]=cache[7]&~(1<<7);}else if(s7==2){cache[7]=cache[7]|(1<<1);cache[7]=cache[7]|(1<<0);cache[7]=cache[7]|(1<<5);cache[7]=cache[7]|(1<<7);cache[7]=cache[7]&~(1<<2);cache[7]=cache[7]&~(1<<4);cache[7]=cache[7]&~(1<<6);}else{cache[7]=cache[7]&~(1<<1);cache[7]=cache[7]&~(1<<2);cache[7]=cache[7]&~(1<<0);cache[7]=cache[7]&~(1<<4);cache[7]=cache[7]&~(1<<5);cache[7]=cache[7]&~(1<<6);cache[7]=cache[7]&~(1<<7);}//if(s14==1){cache[6]=cache[6]|(1<<1);cache[6]=cache[6]|(1<<2);cache[6]=cache[6]|(1<<4);cache[6]=cache[6]|(1<<6);cache[6]=cache[6]&~(1<<0);cache[6]=cache[6]&~(1<<5);cache[6]=cache[6]&~(1<<3);}else if(s14==2){cache[6]=cache[6]|(1<<1);cache[6]=cache[6]|(1<<0);cache[6]=cache[6]|(1<<5);cache[6]=cache[6]|(1<<3);cache[6]=cache[6]&~(1<<2);cache[6]=cache[6]&~(1<<4);cache[6]=cache[6]&~(1<<6);}else{cache[6]=cache[6]&~(1<<1);cache[6]=cache[6]&~(1<<2);cache[6]=cache[6]&~(1<<0);cache[6]=cache[6]&~(1<<4);cache[6]=cache[6]&~(1<<5);cache[6]=cache[6]&~(1<<6);cache[6]=cache[6]&~(1<<3);}/if(s21==1){cache[5]=cache[5]|(1<<2);cache[5]=cache[5]|(1<<4);cache[5]=cache[5]|(1<<1);cache[6]=cache[6]|(1<<7);//cache[5]=cache[5]&~(1<<0);cache[5]=cache[5]&~(1<<5);cache[5]=cache[5]&~(1<<3);}else if(s21==2){cache[5]=cache[5]|(1<<2);cache[5]=cache[5]&~(1<<4);cache[5]=cache[5]&~(1<<1);cache[6]=cache[6]&~(1<<7);//cache[5]=cache[5]|(1<<0);cache[5]=cache[5]|(1<<5);cache[5]=cache[5]|(1<<3);}else{cache[5]=cache[5]&~(1<<2);cache[5]=cache[5]&~(1<<4);cache[5]=cache[5]&~(1<<1);cache[6]=cache[6]&~(1<<7);//cache[5]=cache[5]&~(1<<0);cache[5]=cache[5]&~(1<<5);cache[5]=cache[5]&~(1<<3);}}void Show_cache(){unsigned int j;for(j=0;j<8;j++) {write_data_by_8bit(cache[j], j);}}

main.c

#include<reg51.h>#include<intrins.h>#include"lcd.h"void main(){unsigned long h=0,i=0;CS=1;W_R=0;initial();//³õʼ»¯ ÉèÖÃlcdwitre_clear(); while(1){ i++;h++; Write_Temperature(i,1,1);//Write_Humidity(h,1);//***********//Write_Mode(0,0);Write_Water(1);Write_Level(1,1,1);if(i>=1000) i=0;if(h>=100) h=0;Show_cache();delay(10);//500msWrite_Temperature(i,1,2);Write_Humidity(h,0);Write_Mode(1,1);Write_Water(0);Write_Level(2,2,2);Show_cache();delay(10);}}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。